Compare commits
	
		
			2 Commits
		
	
	
		
			c1ba34b248
			...
			48f5c3ee3c
		
	
	| Author | SHA1 | Date | |
|---|---|---|---|
|  | 48f5c3ee3c | ||
|  | 04160fa7a3 | 
							
								
								
									
										9
									
								
								go.mod
									
									
									
									
									
								
							
							
						
						
									
										9
									
								
								go.mod
									
									
									
									
									
								
							| @@ -4,7 +4,7 @@ go 1.18 | |||||||
|  |  | ||||||
| require ( | require ( | ||||||
| 	code.gitea.io/sdk/gitea v0.15.1 | 	code.gitea.io/sdk/gitea v0.15.1 | ||||||
| 	github.com/hashicorp/terraform-plugin-docs v0.15.0 | 	github.com/hashicorp/terraform-plugin-docs v0.16.0 | ||||||
| 	github.com/hashicorp/terraform-plugin-log v0.9.0 | 	github.com/hashicorp/terraform-plugin-log v0.9.0 | ||||||
| 	github.com/hashicorp/terraform-plugin-sdk/v2 v2.27.0 | 	github.com/hashicorp/terraform-plugin-sdk/v2 v2.27.0 | ||||||
| ) | ) | ||||||
| @@ -36,7 +36,7 @@ require ( | |||||||
| 	github.com/hashicorp/hcl/v2 v2.17.0 // indirect | 	github.com/hashicorp/hcl/v2 v2.17.0 // indirect | ||||||
| 	github.com/hashicorp/logutils v1.0.0 // indirect | 	github.com/hashicorp/logutils v1.0.0 // indirect | ||||||
| 	github.com/hashicorp/terraform-exec v0.18.1 // indirect | 	github.com/hashicorp/terraform-exec v0.18.1 // indirect | ||||||
| 	github.com/hashicorp/terraform-json v0.17.0 // indirect | 	github.com/hashicorp/terraform-json v0.17.1 // indirect | ||||||
| 	github.com/hashicorp/terraform-plugin-go v0.16.0 // indirect | 	github.com/hashicorp/terraform-plugin-go v0.16.0 // indirect | ||||||
| 	github.com/hashicorp/terraform-registry-address v0.2.1 // indirect | 	github.com/hashicorp/terraform-registry-address v0.2.1 // indirect | ||||||
| 	github.com/hashicorp/terraform-svchost v0.1.1 // indirect | 	github.com/hashicorp/terraform-svchost v0.1.1 // indirect | ||||||
| @@ -61,10 +61,11 @@ require ( | |||||||
| 	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect | 	github.com/vmihailenco/tagparser/v2 v2.0.0 // indirect | ||||||
| 	github.com/zclconf/go-cty v1.13.2 // indirect | 	github.com/zclconf/go-cty v1.13.2 // indirect | ||||||
| 	golang.org/x/crypto v0.10.0 // indirect | 	golang.org/x/crypto v0.10.0 // indirect | ||||||
| 	golang.org/x/mod v0.10.0 // indirect | 	golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df // indirect | ||||||
|  | 	golang.org/x/mod v0.11.0 // indirect | ||||||
| 	golang.org/x/net v0.11.0 // indirect | 	golang.org/x/net v0.11.0 // indirect | ||||||
| 	golang.org/x/sys v0.9.0 // indirect | 	golang.org/x/sys v0.9.0 // indirect | ||||||
| 	golang.org/x/text v0.10.0 // indirect | 	golang.org/x/text v0.11.0 // indirect | ||||||
| 	google.golang.org/appengine v1.6.7 // indirect | 	google.golang.org/appengine v1.6.7 // indirect | ||||||
| 	google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect | 	google.golang.org/genproto v0.0.0-20230410155749-daa745c078e1 // indirect | ||||||
| 	google.golang.org/grpc v1.56.0 // indirect | 	google.golang.org/grpc v1.56.0 // indirect | ||||||
|   | |||||||
							
								
								
									
										18
									
								
								go.sum
									
									
									
									
									
								
							
							
						
						
									
										18
									
								
								go.sum
									
									
									
									
									
								
							| @@ -82,10 +82,10 @@ github.com/hashicorp/logutils v1.0.0 h1:dLEQVugN8vlakKOUE3ihGLTZJRB4j+M2cdTm/ORI | |||||||
| github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= | github.com/hashicorp/logutils v1.0.0/go.mod h1:QIAnNjmIWmVIIkWDTG1z5v++HQmx9WQRO+LraFDTW64= | ||||||
| github.com/hashicorp/terraform-exec v0.18.1 h1:LAbfDvNQU1l0NOQlTuudjczVhHj061fNX5H8XZxHlH4= | github.com/hashicorp/terraform-exec v0.18.1 h1:LAbfDvNQU1l0NOQlTuudjczVhHj061fNX5H8XZxHlH4= | ||||||
| github.com/hashicorp/terraform-exec v0.18.1/go.mod h1:58wg4IeuAJ6LVsLUeD2DWZZoc/bYi6dzhLHzxM41980= | github.com/hashicorp/terraform-exec v0.18.1/go.mod h1:58wg4IeuAJ6LVsLUeD2DWZZoc/bYi6dzhLHzxM41980= | ||||||
| github.com/hashicorp/terraform-json v0.17.0 h1:EiA1Wp07nknYQAiv+jIt4dX4Cq5crgP+TsTE45MjMmM= | github.com/hashicorp/terraform-json v0.17.1 h1:eMfvh/uWggKmY7Pmb3T85u86E2EQg6EQHgyRwf3RkyA= | ||||||
| github.com/hashicorp/terraform-json v0.17.0/go.mod h1:Huy6zt6euxaY9knPAFKjUITn8QxUFIe9VuSzb4zn/0o= | github.com/hashicorp/terraform-json v0.17.1/go.mod h1:Huy6zt6euxaY9knPAFKjUITn8QxUFIe9VuSzb4zn/0o= | ||||||
| github.com/hashicorp/terraform-plugin-docs v0.15.0 h1:W5xYB5kCUBqO7lyjE2UMmUBh95c0aAf4jwO0Xuuw2Ec= | github.com/hashicorp/terraform-plugin-docs v0.16.0 h1:UmxFr3AScl6Wged84jndJIfFccGyBZn52KtMNsS12dI= | ||||||
| github.com/hashicorp/terraform-plugin-docs v0.15.0/go.mod h1:K5Taof1Y7sL4dw6Ie0qMFyQnHN0W+RSVMD0iIyFDFJc= | github.com/hashicorp/terraform-plugin-docs v0.16.0/go.mod h1:M3ZrlKBJAbPMtNOPwHicGi1c+hZUh7/g0ifT/z7TVfA= | ||||||
| github.com/hashicorp/terraform-plugin-go v0.16.0 h1:DSOQ0rz5FUiVO4NUzMs8ln9gsPgHMTsfns7Nk+6gPuE= | github.com/hashicorp/terraform-plugin-go v0.16.0 h1:DSOQ0rz5FUiVO4NUzMs8ln9gsPgHMTsfns7Nk+6gPuE= | ||||||
| github.com/hashicorp/terraform-plugin-go v0.16.0/go.mod h1:4sn8bFuDbt+2+Yztt35IbOrvZc0zyEi87gJzsTgCES8= | github.com/hashicorp/terraform-plugin-go v0.16.0/go.mod h1:4sn8bFuDbt+2+Yztt35IbOrvZc0zyEi87gJzsTgCES8= | ||||||
| github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0= | github.com/hashicorp/terraform-plugin-log v0.9.0 h1:i7hOA+vdAItN1/7UrfBqBwvYPQ9TFvymaRGZED3FCV0= | ||||||
| @@ -181,9 +181,11 @@ golang.org/x/crypto v0.0.0-20200820211705-5c72a883971a/go.mod h1:LzIPMQfyMNhhGPh | |||||||
| golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | golang.org/x/crypto v0.0.0-20210921155107-089bfa567519/go.mod h1:GvvjBRRGRdwPK5ydBHafDWAxML/pGHZbMvKqRZ5+Abc= | ||||||
| golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= | golang.org/x/crypto v0.10.0 h1:LKqV2xt9+kDzSTfOhx4FrkEBcMrAgHSYgzywV9zcGmM= | ||||||
| golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= | golang.org/x/crypto v0.10.0/go.mod h1:o4eNf7Ede1fv+hwOwZsTHl9EsPFO6q6ZvYR8vYfY45I= | ||||||
|  | golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df h1:UA2aFVmmsIlefxMk29Dp2juaUSth8Pyn3Tq5Y5mJGME= | ||||||
|  | golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df/go.mod h1:FXUEEKJgO7OQYeo8N01OfiKP8RXMtf6e8aTskBGqWdc= | ||||||
| golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | golang.org/x/mod v0.2.0/go.mod h1:s0Qsj1ACt9ePp/hMypM3fl4fZqREWJwdYDEqhRiZZUA= | ||||||
| golang.org/x/mod v0.10.0 h1:lFO9qtOdlre5W1jxS3r/4szv2/6iXxScdzjoBMXNhYk= | golang.org/x/mod v0.11.0 h1:bUO06HqtnRcc/7l71XBe4WcqTZ+3AH1J59zWDDwLKgU= | ||||||
| golang.org/x/mod v0.10.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | golang.org/x/mod v0.11.0/go.mod h1:iBbtSCu2XBx23ZKBPSOrRkjjQPZFPuis4dIYUhu/chs= | ||||||
| golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | golang.org/x/net v0.0.0-20190404232315-eb5bcb51f2a3/go.mod h1:t9HGtf8HONx5eT2rtn7q6eTqICYqUVnKs3thJo3Qplg= | ||||||
| golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= | golang.org/x/net v0.0.0-20190603091049-60506f45cf65/go.mod h1:HSz+uSET+XFnRR8LxR5pz3Of3rY3CfYBVs4xY44aLks= | ||||||
| golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | golang.org/x/net v0.0.0-20190620200207-3b0461eec859/go.mod h1:z5CRVTTTmAJ677TzLLGU+0bjPO0LkuOLi4/5GtJWs/s= | ||||||
| @@ -211,8 +213,8 @@ golang.org/x/term v0.0.0-20201126162022-7de9c90e9dd1/go.mod h1:bj7SfCRtBDWHUb9sn | |||||||
| golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | golang.org/x/text v0.3.0/go.mod h1:NqM8EUOU14njkJ3fqMW+pc6Ldnwhi/IjpwHt7yyuwOQ= | ||||||
| golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | golang.org/x/text v0.3.2/go.mod h1:bEr9sfX3Q8Zfm5fL9x+3itogRgK3+ptLWKqgva+5dAk= | ||||||
| golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | golang.org/x/text v0.3.3/go.mod h1:5Zoc/QRtKVWzQhOtBMvqHzDpF6irO9z98xDceosuGiQ= | ||||||
| golang.org/x/text v0.10.0 h1:UpjohKhiEgNc0CSauXmwYftY1+LlaC75SJwh0SgCX58= | golang.org/x/text v0.11.0 h1:LAntKIrcmeSKERyiOh0XMV39LXS8IE9UL2yP7+f5ij4= | ||||||
| golang.org/x/text v0.10.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= | golang.org/x/text v0.11.0/go.mod h1:TvPlkZtksWOMsz7fbANvkp4WM8x/WCo/om8BMLbz+aE= | ||||||
| golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | golang.org/x/tools v0.0.0-20180917221912-90fa682c2a6e/go.mod h1:n7NCudcB/nEzxVGmLbDWY5pfWTLqBcC2KZ6jyYvM4mQ= | ||||||
| golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | golang.org/x/tools v0.0.0-20191119224855-298f0cb1881e/go.mod h1:b+2E5dAYhXwXZwtnZ6UAqBI28+e2cm9otk0dWdXHAEo= | ||||||
| golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= | golang.org/x/tools v0.0.0-20200325010219-a49f79bcc224/go.mod h1:Sl4aGygMT6LrqrWclx+PTx3U+LnKx/seiNR+3G19Ar8= | ||||||
|   | |||||||
							
								
								
									
										2
									
								
								vendor/github.com/hashicorp/terraform-json/checks.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										2
									
								
								vendor/github.com/hashicorp/terraform-json/checks.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -92,7 +92,7 @@ type CheckDynamicAddress struct { | |||||||
| 	// | 	// | ||||||
| 	// InstanceKey will be empty if there was no foreach or count argument | 	// InstanceKey will be empty if there was no foreach or count argument | ||||||
| 	// defined on the containing object. | 	// defined on the containing object. | ||||||
| 	InstanceKey string `json:"instance_key,omitempty"` | 	InstanceKey interface{} `json:"instance_key,omitempty"` | ||||||
| } | } | ||||||
|  |  | ||||||
| // CheckResultStatic is the container for a "checkable object". | // CheckResultStatic is the container for a "checkable object". | ||||||
|   | |||||||
							
								
								
									
										37
									
								
								vendor/github.com/hashicorp/terraform-plugin-docs/internal/provider/generate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										37
									
								
								vendor/github.com/hashicorp/terraform-plugin-docs/internal/provider/generate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -8,6 +8,7 @@ import ( | |||||||
| 	"fmt" | 	"fmt" | ||||||
| 	"os" | 	"os" | ||||||
| 	"os/exec" | 	"os/exec" | ||||||
|  | 	"path" | ||||||
| 	"path/filepath" | 	"path/filepath" | ||||||
| 	"runtime" | 	"runtime" | ||||||
| 	"strings" | 	"strings" | ||||||
| @@ -22,6 +23,7 @@ import ( | |||||||
| 	"github.com/hashicorp/terraform-exec/tfexec" | 	"github.com/hashicorp/terraform-exec/tfexec" | ||||||
| 	tfjson "github.com/hashicorp/terraform-json" | 	tfjson "github.com/hashicorp/terraform-json" | ||||||
| 	"github.com/mitchellh/cli" | 	"github.com/mitchellh/cli" | ||||||
|  | 	"golang.org/x/exp/slices" | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var ( | var ( | ||||||
| @@ -63,6 +65,16 @@ var ( | |||||||
| 		providerFileTemplate("index.html.markdown"), | 		providerFileTemplate("index.html.markdown"), | ||||||
| 		providerFileTemplate("index.html.md"), | 		providerFileTemplate("index.html.md"), | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	managedWebsiteSubDirectories = []string{ | ||||||
|  | 		"data-sources", | ||||||
|  | 		"guides", | ||||||
|  | 		"resources", | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	managedWebsiteFiles = []string{ | ||||||
|  | 		"index.md", | ||||||
|  | 	} | ||||||
| ) | ) | ||||||
|  |  | ||||||
| type generator struct { | type generator struct { | ||||||
| @@ -416,11 +428,34 @@ func (g *generator) renderMissingDocs(providerName string, providerSchema *tfjso | |||||||
|  |  | ||||||
| func (g *generator) renderStaticWebsite(providerName string, providerSchema *tfjson.ProviderSchema) error { | func (g *generator) renderStaticWebsite(providerName string, providerSchema *tfjson.ProviderSchema) error { | ||||||
| 	g.infof("cleaning rendered website dir") | 	g.infof("cleaning rendered website dir") | ||||||
| 	err := os.RemoveAll(g.ProviderDocsDir()) | 	dirEntry, err := os.ReadDir(g.ProviderDocsDir()) | ||||||
| 	if err != nil { | 	if err != nil { | ||||||
| 		return err | 		return err | ||||||
| 	} | 	} | ||||||
|  |  | ||||||
|  | 	for _, file := range dirEntry { | ||||||
|  |  | ||||||
|  | 		// Remove subdirectories managed by tfplugindocs | ||||||
|  | 		if file.IsDir() && slices.Contains(managedWebsiteSubDirectories, file.Name()) { | ||||||
|  | 			g.infof("removing directory: %q", file.Name()) | ||||||
|  | 			err = os.RemoveAll(path.Join(g.ProviderDocsDir(), file.Name())) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Remove files managed by tfplugindocs | ||||||
|  | 		if !file.IsDir() && slices.Contains(managedWebsiteFiles, file.Name()) { | ||||||
|  | 			g.infof("removing file: %q", file.Name()) | ||||||
|  | 			err = os.RemoveAll(path.Join(g.ProviderDocsDir(), file.Name())) | ||||||
|  | 			if err != nil { | ||||||
|  | 				return err | ||||||
|  | 			} | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
| 	shortName := providerShortName(providerName) | 	shortName := providerShortName(providerName) | ||||||
|  |  | ||||||
| 	g.infof("rendering templated website to static markdown") | 	g.infof("rendering templated website to static markdown") | ||||||
|   | |||||||
							
								
								
									
										1
									
								
								vendor/github.com/hashicorp/terraform-plugin-docs/internal/provider/validate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										1
									
								
								vendor/github.com/hashicorp/terraform-plugin-docs/internal/provider/validate.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -98,6 +98,7 @@ func validateStaticDocs(ui cli.Ui, dir string) error { | |||||||
| 			"data-sources", | 			"data-sources", | ||||||
| 			"guides", | 			"guides", | ||||||
| 			"resources", | 			"resources", | ||||||
|  | 			"cdktf", | ||||||
| 		), | 		), | ||||||
| 		checkBlockedExtensions( | 		checkBlockedExtensions( | ||||||
| 			".html.md.tmpl", | 			".html.md.tmpl", | ||||||
|   | |||||||
							
								
								
									
										27
									
								
								vendor/golang.org/x/exp/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										27
									
								
								vendor/golang.org/x/exp/LICENSE
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,27 @@ | |||||||
|  | Copyright (c) 2009 The Go Authors. All rights reserved. | ||||||
|  |  | ||||||
|  | Redistribution and use in source and binary forms, with or without | ||||||
|  | modification, are permitted provided that the following conditions are | ||||||
|  | met: | ||||||
|  |  | ||||||
|  |    * Redistributions of source code must retain the above copyright | ||||||
|  | notice, this list of conditions and the following disclaimer. | ||||||
|  |    * Redistributions in binary form must reproduce the above | ||||||
|  | copyright notice, this list of conditions and the following disclaimer | ||||||
|  | in the documentation and/or other materials provided with the | ||||||
|  | distribution. | ||||||
|  |    * Neither the name of Google Inc. nor the names of its | ||||||
|  | contributors may be used to endorse or promote products derived from | ||||||
|  | this software without specific prior written permission. | ||||||
|  |  | ||||||
|  | THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||||||
|  | "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||||||
|  | LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||||||
|  | A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||||||
|  | OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||||||
|  | SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||||||
|  | LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||||||
|  | DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||||||
|  | THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||||||
|  | (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||||||
|  | OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||||||
							
								
								
									
										22
									
								
								vendor/golang.org/x/exp/PATENTS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										22
									
								
								vendor/golang.org/x/exp/PATENTS
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,22 @@ | |||||||
|  | Additional IP Rights Grant (Patents) | ||||||
|  |  | ||||||
|  | "This implementation" means the copyrightable works distributed by | ||||||
|  | Google as part of the Go project. | ||||||
|  |  | ||||||
|  | Google hereby grants to You a perpetual, worldwide, non-exclusive, | ||||||
|  | no-charge, royalty-free, irrevocable (except as stated in this section) | ||||||
|  | patent license to make, have made, use, offer to sell, sell, import, | ||||||
|  | transfer and otherwise run, modify and propagate the contents of this | ||||||
|  | implementation of Go, where such license applies only to those patent | ||||||
|  | claims, both currently owned or controlled by Google and acquired in | ||||||
|  | the future, licensable by Google that are necessarily infringed by this | ||||||
|  | implementation of Go.  This grant does not include claims that would be | ||||||
|  | infringed only as a consequence of further modification of this | ||||||
|  | implementation.  If you or your agent or exclusive licensee institute or | ||||||
|  | order or agree to the institution of patent litigation against any | ||||||
|  | entity (including a cross-claim or counterclaim in a lawsuit) alleging | ||||||
|  | that this implementation of Go or any code incorporated within this | ||||||
|  | implementation of Go constitutes direct or contributory patent | ||||||
|  | infringement, or inducement of patent infringement, then any patent | ||||||
|  | rights granted to you under this License for this implementation of Go | ||||||
|  | shall terminate as of the date such litigation is filed. | ||||||
							
								
								
									
										50
									
								
								vendor/golang.org/x/exp/constraints/constraints.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										50
									
								
								vendor/golang.org/x/exp/constraints/constraints.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,50 @@ | |||||||
|  | // Copyright 2021 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 constraints defines a set of useful constraints to be used | ||||||
|  | // with type parameters. | ||||||
|  | package constraints | ||||||
|  |  | ||||||
|  | // Signed is a constraint that permits any signed integer type. | ||||||
|  | // If future releases of Go add new predeclared signed integer types, | ||||||
|  | // this constraint will be modified to include them. | ||||||
|  | type Signed interface { | ||||||
|  | 	~int | ~int8 | ~int16 | ~int32 | ~int64 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Unsigned is a constraint that permits any unsigned integer type. | ||||||
|  | // If future releases of Go add new predeclared unsigned integer types, | ||||||
|  | // this constraint will be modified to include them. | ||||||
|  | type Unsigned interface { | ||||||
|  | 	~uint | ~uint8 | ~uint16 | ~uint32 | ~uint64 | ~uintptr | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Integer is a constraint that permits any integer type. | ||||||
|  | // If future releases of Go add new predeclared integer types, | ||||||
|  | // this constraint will be modified to include them. | ||||||
|  | type Integer interface { | ||||||
|  | 	Signed | Unsigned | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Float is a constraint that permits any floating-point type. | ||||||
|  | // If future releases of Go add new predeclared floating-point types, | ||||||
|  | // this constraint will be modified to include them. | ||||||
|  | type Float interface { | ||||||
|  | 	~float32 | ~float64 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Complex is a constraint that permits any complex numeric type. | ||||||
|  | // If future releases of Go add new predeclared complex numeric types, | ||||||
|  | // this constraint will be modified to include them. | ||||||
|  | type Complex interface { | ||||||
|  | 	~complex64 | ~complex128 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Ordered is a constraint that permits any ordered type: any type | ||||||
|  | // that supports the operators < <= >= >. | ||||||
|  | // If future releases of Go add new ordered types, | ||||||
|  | // this constraint will be modified to include them. | ||||||
|  | type Ordered interface { | ||||||
|  | 	Integer | Float | ~string | ||||||
|  | } | ||||||
							
								
								
									
										258
									
								
								vendor/golang.org/x/exp/slices/slices.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										258
									
								
								vendor/golang.org/x/exp/slices/slices.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,258 @@ | |||||||
|  | // Copyright 2021 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 slices defines various functions useful with slices of any type. | ||||||
|  | // Unless otherwise specified, these functions all apply to the elements | ||||||
|  | // of a slice at index 0 <= i < len(s). | ||||||
|  | // | ||||||
|  | // Note that the less function in IsSortedFunc, SortFunc, SortStableFunc requires a | ||||||
|  | // strict weak ordering (https://en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings), | ||||||
|  | // or the sorting may fail to sort correctly. A common case is when sorting slices of | ||||||
|  | // floating-point numbers containing NaN values. | ||||||
|  | package slices | ||||||
|  |  | ||||||
|  | import "golang.org/x/exp/constraints" | ||||||
|  |  | ||||||
|  | // Equal reports whether two slices are equal: the same length and all | ||||||
|  | // elements equal. If the lengths are different, Equal returns false. | ||||||
|  | // Otherwise, the elements are compared in increasing index order, and the | ||||||
|  | // comparison stops at the first unequal pair. | ||||||
|  | // Floating point NaNs are not considered equal. | ||||||
|  | func Equal[E comparable](s1, s2 []E) bool { | ||||||
|  | 	if len(s1) != len(s2) { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	for i := range s1 { | ||||||
|  | 		if s1[i] != s2[i] { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // EqualFunc reports whether two slices are equal using a comparison | ||||||
|  | // function on each pair of elements. If the lengths are different, | ||||||
|  | // EqualFunc returns false. Otherwise, the elements are compared in | ||||||
|  | // increasing index order, and the comparison stops at the first index | ||||||
|  | // for which eq returns false. | ||||||
|  | func EqualFunc[E1, E2 any](s1 []E1, s2 []E2, eq func(E1, E2) bool) bool { | ||||||
|  | 	if len(s1) != len(s2) { | ||||||
|  | 		return false | ||||||
|  | 	} | ||||||
|  | 	for i, v1 := range s1 { | ||||||
|  | 		v2 := s2[i] | ||||||
|  | 		if !eq(v1, v2) { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Compare compares the elements of s1 and s2. | ||||||
|  | // The elements are compared sequentially, starting at index 0, | ||||||
|  | // until one element is not equal to the other. | ||||||
|  | // The result of comparing the first non-matching elements is returned. | ||||||
|  | // If both slices are equal until one of them ends, the shorter slice is | ||||||
|  | // considered less than the longer one. | ||||||
|  | // The result is 0 if s1 == s2, -1 if s1 < s2, and +1 if s1 > s2. | ||||||
|  | // Comparisons involving floating point NaNs are ignored. | ||||||
|  | func Compare[E constraints.Ordered](s1, s2 []E) int { | ||||||
|  | 	s2len := len(s2) | ||||||
|  | 	for i, v1 := range s1 { | ||||||
|  | 		if i >= s2len { | ||||||
|  | 			return +1 | ||||||
|  | 		} | ||||||
|  | 		v2 := s2[i] | ||||||
|  | 		switch { | ||||||
|  | 		case v1 < v2: | ||||||
|  | 			return -1 | ||||||
|  | 		case v1 > v2: | ||||||
|  | 			return +1 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if len(s1) < s2len { | ||||||
|  | 		return -1 | ||||||
|  | 	} | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CompareFunc is like Compare but uses a comparison function | ||||||
|  | // on each pair of elements. The elements are compared in increasing | ||||||
|  | // index order, and the comparisons stop after the first time cmp | ||||||
|  | // returns non-zero. | ||||||
|  | // The result is the first non-zero result of cmp; if cmp always | ||||||
|  | // returns 0 the result is 0 if len(s1) == len(s2), -1 if len(s1) < len(s2), | ||||||
|  | // and +1 if len(s1) > len(s2). | ||||||
|  | func CompareFunc[E1, E2 any](s1 []E1, s2 []E2, cmp func(E1, E2) int) int { | ||||||
|  | 	s2len := len(s2) | ||||||
|  | 	for i, v1 := range s1 { | ||||||
|  | 		if i >= s2len { | ||||||
|  | 			return +1 | ||||||
|  | 		} | ||||||
|  | 		v2 := s2[i] | ||||||
|  | 		if c := cmp(v1, v2); c != 0 { | ||||||
|  | 			return c | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	if len(s1) < s2len { | ||||||
|  | 		return -1 | ||||||
|  | 	} | ||||||
|  | 	return 0 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Index returns the index of the first occurrence of v in s, | ||||||
|  | // or -1 if not present. | ||||||
|  | func Index[E comparable](s []E, v E) int { | ||||||
|  | 	for i := range s { | ||||||
|  | 		if v == s[i] { | ||||||
|  | 			return i | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return -1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // IndexFunc returns the first index i satisfying f(s[i]), | ||||||
|  | // or -1 if none do. | ||||||
|  | func IndexFunc[E any](s []E, f func(E) bool) int { | ||||||
|  | 	for i := range s { | ||||||
|  | 		if f(s[i]) { | ||||||
|  | 			return i | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return -1 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Contains reports whether v is present in s. | ||||||
|  | func Contains[E comparable](s []E, v E) bool { | ||||||
|  | 	return Index(s, v) >= 0 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // ContainsFunc reports whether at least one | ||||||
|  | // element e of s satisfies f(e). | ||||||
|  | func ContainsFunc[E any](s []E, f func(E) bool) bool { | ||||||
|  | 	return IndexFunc(s, f) >= 0 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Insert inserts the values v... into s at index i, | ||||||
|  | // returning the modified slice. | ||||||
|  | // In the returned slice r, r[i] == v[0]. | ||||||
|  | // Insert panics if i is out of range. | ||||||
|  | // This function is O(len(s) + len(v)). | ||||||
|  | func Insert[S ~[]E, E any](s S, i int, v ...E) S { | ||||||
|  | 	tot := len(s) + len(v) | ||||||
|  | 	if tot <= cap(s) { | ||||||
|  | 		s2 := s[:tot] | ||||||
|  | 		copy(s2[i+len(v):], s[i:]) | ||||||
|  | 		copy(s2[i:], v) | ||||||
|  | 		return s2 | ||||||
|  | 	} | ||||||
|  | 	s2 := make(S, tot) | ||||||
|  | 	copy(s2, s[:i]) | ||||||
|  | 	copy(s2[i:], v) | ||||||
|  | 	copy(s2[i+len(v):], s[i:]) | ||||||
|  | 	return s2 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Delete removes the elements s[i:j] from s, returning the modified slice. | ||||||
|  | // Delete panics if s[i:j] is not a valid slice of s. | ||||||
|  | // Delete modifies the contents of the slice s; it does not create a new slice. | ||||||
|  | // Delete is O(len(s)-j), so if many items must be deleted, it is better to | ||||||
|  | // make a single call deleting them all together than to delete one at a time. | ||||||
|  | // Delete might not modify the elements s[len(s)-(j-i):len(s)]. If those | ||||||
|  | // elements contain pointers you might consider zeroing those elements so that | ||||||
|  | // objects they reference can be garbage collected. | ||||||
|  | func Delete[S ~[]E, E any](s S, i, j int) S { | ||||||
|  | 	_ = s[i:j] // bounds check | ||||||
|  |  | ||||||
|  | 	return append(s[:i], s[j:]...) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Replace replaces the elements s[i:j] by the given v, and returns the | ||||||
|  | // modified slice. Replace panics if s[i:j] is not a valid slice of s. | ||||||
|  | func Replace[S ~[]E, E any](s S, i, j int, v ...E) S { | ||||||
|  | 	_ = s[i:j] // verify that i:j is a valid subslice | ||||||
|  | 	tot := len(s[:i]) + len(v) + len(s[j:]) | ||||||
|  | 	if tot <= cap(s) { | ||||||
|  | 		s2 := s[:tot] | ||||||
|  | 		copy(s2[i+len(v):], s[j:]) | ||||||
|  | 		copy(s2[i:], v) | ||||||
|  | 		return s2 | ||||||
|  | 	} | ||||||
|  | 	s2 := make(S, tot) | ||||||
|  | 	copy(s2, s[:i]) | ||||||
|  | 	copy(s2[i:], v) | ||||||
|  | 	copy(s2[i+len(v):], s[j:]) | ||||||
|  | 	return s2 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Clone returns a copy of the slice. | ||||||
|  | // The elements are copied using assignment, so this is a shallow clone. | ||||||
|  | func Clone[S ~[]E, E any](s S) S { | ||||||
|  | 	// Preserve nil in case it matters. | ||||||
|  | 	if s == nil { | ||||||
|  | 		return nil | ||||||
|  | 	} | ||||||
|  | 	return append(S([]E{}), s...) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Compact replaces consecutive runs of equal elements with a single copy. | ||||||
|  | // This is like the uniq command found on Unix. | ||||||
|  | // Compact modifies the contents of the slice s; it does not create a new slice. | ||||||
|  | // When Compact discards m elements in total, it might not modify the elements | ||||||
|  | // s[len(s)-m:len(s)]. If those elements contain pointers you might consider | ||||||
|  | // zeroing those elements so that objects they reference can be garbage collected. | ||||||
|  | func Compact[S ~[]E, E comparable](s S) S { | ||||||
|  | 	if len(s) < 2 { | ||||||
|  | 		return s | ||||||
|  | 	} | ||||||
|  | 	i := 1 | ||||||
|  | 	for k := 1; k < len(s); k++ { | ||||||
|  | 		if s[k] != s[k-1] { | ||||||
|  | 			if i != k { | ||||||
|  | 				s[i] = s[k] | ||||||
|  | 			} | ||||||
|  | 			i++ | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return s[:i] | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // CompactFunc is like Compact but uses a comparison function. | ||||||
|  | func CompactFunc[S ~[]E, E any](s S, eq func(E, E) bool) S { | ||||||
|  | 	if len(s) < 2 { | ||||||
|  | 		return s | ||||||
|  | 	} | ||||||
|  | 	i := 1 | ||||||
|  | 	for k := 1; k < len(s); k++ { | ||||||
|  | 		if !eq(s[k], s[k-1]) { | ||||||
|  | 			if i != k { | ||||||
|  | 				s[i] = s[k] | ||||||
|  | 			} | ||||||
|  | 			i++ | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return s[:i] | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Grow increases the slice's capacity, if necessary, to guarantee space for | ||||||
|  | // another n elements. After Grow(n), at least n elements can be appended | ||||||
|  | // to the slice without another allocation. If n is negative or too large to | ||||||
|  | // allocate the memory, Grow panics. | ||||||
|  | func Grow[S ~[]E, E any](s S, n int) S { | ||||||
|  | 	if n < 0 { | ||||||
|  | 		panic("cannot be negative") | ||||||
|  | 	} | ||||||
|  | 	if n -= cap(s) - len(s); n > 0 { | ||||||
|  | 		// TODO(https://go.dev/issue/53888): Make using []E instead of S | ||||||
|  | 		// to workaround a compiler bug where the runtime.growslice optimization | ||||||
|  | 		// does not take effect. Revert when the compiler is fixed. | ||||||
|  | 		s = append([]E(s)[:cap(s)], make([]E, n)...)[:len(s)] | ||||||
|  | 	} | ||||||
|  | 	return s | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // Clip removes unused capacity from the slice, returning s[:len(s):len(s)]. | ||||||
|  | func Clip[S ~[]E, E any](s S) S { | ||||||
|  | 	return s[:len(s):len(s)] | ||||||
|  | } | ||||||
							
								
								
									
										128
									
								
								vendor/golang.org/x/exp/slices/sort.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										128
									
								
								vendor/golang.org/x/exp/slices/sort.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,128 @@ | |||||||
|  | // Copyright 2022 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 slices | ||||||
|  |  | ||||||
|  | import ( | ||||||
|  | 	"math/bits" | ||||||
|  |  | ||||||
|  | 	"golang.org/x/exp/constraints" | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // Sort sorts a slice of any ordered type in ascending order. | ||||||
|  | // Sort may fail to sort correctly when sorting slices of floating-point | ||||||
|  | // numbers containing Not-a-number (NaN) values. | ||||||
|  | // Use slices.SortFunc(x, func(a, b float64) bool {return a < b || (math.IsNaN(a) && !math.IsNaN(b))}) | ||||||
|  | // instead if the input may contain NaNs. | ||||||
|  | func Sort[E constraints.Ordered](x []E) { | ||||||
|  | 	n := len(x) | ||||||
|  | 	pdqsortOrdered(x, 0, n, bits.Len(uint(n))) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SortFunc sorts the slice x in ascending order as determined by the less function. | ||||||
|  | // This sort is not guaranteed to be stable. | ||||||
|  | // | ||||||
|  | // SortFunc requires that less is a strict weak ordering. | ||||||
|  | // See https://en.wikipedia.org/wiki/Weak_ordering#Strict_weak_orderings. | ||||||
|  | func SortFunc[E any](x []E, less func(a, b E) bool) { | ||||||
|  | 	n := len(x) | ||||||
|  | 	pdqsortLessFunc(x, 0, n, bits.Len(uint(n)), less) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // SortStableFunc sorts the slice x while keeping the original order of equal | ||||||
|  | // elements, using less to compare elements. | ||||||
|  | func SortStableFunc[E any](x []E, less func(a, b E) bool) { | ||||||
|  | 	stableLessFunc(x, len(x), less) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // IsSorted reports whether x is sorted in ascending order. | ||||||
|  | func IsSorted[E constraints.Ordered](x []E) bool { | ||||||
|  | 	for i := len(x) - 1; i > 0; i-- { | ||||||
|  | 		if x[i] < x[i-1] { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // IsSortedFunc reports whether x is sorted in ascending order, with less as the | ||||||
|  | // comparison function. | ||||||
|  | func IsSortedFunc[E any](x []E, less func(a, b E) bool) bool { | ||||||
|  | 	for i := len(x) - 1; i > 0; i-- { | ||||||
|  | 		if less(x[i], x[i-1]) { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return true | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // BinarySearch searches for target in a sorted slice and returns the position | ||||||
|  | // where target is found, or the position where target would appear in the | ||||||
|  | // sort order; it also returns a bool saying whether the target is really found | ||||||
|  | // in the slice. The slice must be sorted in increasing order. | ||||||
|  | func BinarySearch[E constraints.Ordered](x []E, target E) (int, bool) { | ||||||
|  | 	// Inlining is faster than calling BinarySearchFunc with a lambda. | ||||||
|  | 	n := len(x) | ||||||
|  | 	// Define x[-1] < target and x[n] >= target. | ||||||
|  | 	// Invariant: x[i-1] < target, x[j] >= target. | ||||||
|  | 	i, j := 0, n | ||||||
|  | 	for i < j { | ||||||
|  | 		h := int(uint(i+j) >> 1) // avoid overflow when computing h | ||||||
|  | 		// i ≤ h < j | ||||||
|  | 		if x[h] < target { | ||||||
|  | 			i = h + 1 // preserves x[i-1] < target | ||||||
|  | 		} else { | ||||||
|  | 			j = h // preserves x[j] >= target | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	// i == j, x[i-1] < target, and x[j] (= x[i]) >= target  =>  answer is i. | ||||||
|  | 	return i, i < n && x[i] == target | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // BinarySearchFunc works like BinarySearch, but uses a custom comparison | ||||||
|  | // function. The slice must be sorted in increasing order, where "increasing" | ||||||
|  | // is defined by cmp. cmp should return 0 if the slice element matches | ||||||
|  | // the target, a negative number if the slice element precedes the target, | ||||||
|  | // or a positive number if the slice element follows the target. | ||||||
|  | // cmp must implement the same ordering as the slice, such that if | ||||||
|  | // cmp(a, t) < 0 and cmp(b, t) >= 0, then a must precede b in the slice. | ||||||
|  | func BinarySearchFunc[E, T any](x []E, target T, cmp func(E, T) int) (int, bool) { | ||||||
|  | 	n := len(x) | ||||||
|  | 	// Define cmp(x[-1], target) < 0 and cmp(x[n], target) >= 0 . | ||||||
|  | 	// Invariant: cmp(x[i - 1], target) < 0, cmp(x[j], target) >= 0. | ||||||
|  | 	i, j := 0, n | ||||||
|  | 	for i < j { | ||||||
|  | 		h := int(uint(i+j) >> 1) // avoid overflow when computing h | ||||||
|  | 		// i ≤ h < j | ||||||
|  | 		if cmp(x[h], target) < 0 { | ||||||
|  | 			i = h + 1 // preserves cmp(x[i - 1], target) < 0 | ||||||
|  | 		} else { | ||||||
|  | 			j = h // preserves cmp(x[j], target) >= 0 | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	// i == j, cmp(x[i-1], target) < 0, and cmp(x[j], target) (= cmp(x[i], target)) >= 0  =>  answer is i. | ||||||
|  | 	return i, i < n && cmp(x[i], target) == 0 | ||||||
|  | } | ||||||
|  |  | ||||||
|  | type sortedHint int // hint for pdqsort when choosing the pivot | ||||||
|  |  | ||||||
|  | const ( | ||||||
|  | 	unknownHint sortedHint = iota | ||||||
|  | 	increasingHint | ||||||
|  | 	decreasingHint | ||||||
|  | ) | ||||||
|  |  | ||||||
|  | // xorshift paper: https://www.jstatsoft.org/article/view/v008i14/xorshift.pdf | ||||||
|  | type xorshift uint64 | ||||||
|  |  | ||||||
|  | func (r *xorshift) Next() uint64 { | ||||||
|  | 	*r ^= *r << 13 | ||||||
|  | 	*r ^= *r >> 17 | ||||||
|  | 	*r ^= *r << 5 | ||||||
|  | 	return uint64(*r) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func nextPowerOfTwo(length int) uint { | ||||||
|  | 	return 1 << bits.Len(uint(length)) | ||||||
|  | } | ||||||
							
								
								
									
										479
									
								
								vendor/golang.org/x/exp/slices/zsortfunc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										479
									
								
								vendor/golang.org/x/exp/slices/zsortfunc.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,479 @@ | |||||||
|  | // Code generated by gen_sort_variants.go; DO NOT EDIT. | ||||||
|  |  | ||||||
|  | // Copyright 2022 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 slices | ||||||
|  |  | ||||||
|  | // insertionSortLessFunc sorts data[a:b] using insertion sort. | ||||||
|  | func insertionSortLessFunc[E any](data []E, a, b int, less func(a, b E) bool) { | ||||||
|  | 	for i := a + 1; i < b; i++ { | ||||||
|  | 		for j := i; j > a && less(data[j], data[j-1]); j-- { | ||||||
|  | 			data[j], data[j-1] = data[j-1], data[j] | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // siftDownLessFunc implements the heap property on data[lo:hi]. | ||||||
|  | // first is an offset into the array where the root of the heap lies. | ||||||
|  | func siftDownLessFunc[E any](data []E, lo, hi, first int, less func(a, b E) bool) { | ||||||
|  | 	root := lo | ||||||
|  | 	for { | ||||||
|  | 		child := 2*root + 1 | ||||||
|  | 		if child >= hi { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 		if child+1 < hi && less(data[first+child], data[first+child+1]) { | ||||||
|  | 			child++ | ||||||
|  | 		} | ||||||
|  | 		if !less(data[first+root], data[first+child]) { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		data[first+root], data[first+child] = data[first+child], data[first+root] | ||||||
|  | 		root = child | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func heapSortLessFunc[E any](data []E, a, b int, less func(a, b E) bool) { | ||||||
|  | 	first := a | ||||||
|  | 	lo := 0 | ||||||
|  | 	hi := b - a | ||||||
|  |  | ||||||
|  | 	// Build heap with greatest element at top. | ||||||
|  | 	for i := (hi - 1) / 2; i >= 0; i-- { | ||||||
|  | 		siftDownLessFunc(data, i, hi, first, less) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Pop elements, largest first, into end of data. | ||||||
|  | 	for i := hi - 1; i >= 0; i-- { | ||||||
|  | 		data[first], data[first+i] = data[first+i], data[first] | ||||||
|  | 		siftDownLessFunc(data, lo, i, first, less) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // pdqsortLessFunc sorts data[a:b]. | ||||||
|  | // The algorithm based on pattern-defeating quicksort(pdqsort), but without the optimizations from BlockQuicksort. | ||||||
|  | // pdqsort paper: https://arxiv.org/pdf/2106.05123.pdf | ||||||
|  | // C++ implementation: https://github.com/orlp/pdqsort | ||||||
|  | // Rust implementation: https://docs.rs/pdqsort/latest/pdqsort/ | ||||||
|  | // limit is the number of allowed bad (very unbalanced) pivots before falling back to heapsort. | ||||||
|  | func pdqsortLessFunc[E any](data []E, a, b, limit int, less func(a, b E) bool) { | ||||||
|  | 	const maxInsertion = 12 | ||||||
|  |  | ||||||
|  | 	var ( | ||||||
|  | 		wasBalanced    = true // whether the last partitioning was reasonably balanced | ||||||
|  | 		wasPartitioned = true // whether the slice was already partitioned | ||||||
|  | 	) | ||||||
|  |  | ||||||
|  | 	for { | ||||||
|  | 		length := b - a | ||||||
|  |  | ||||||
|  | 		if length <= maxInsertion { | ||||||
|  | 			insertionSortLessFunc(data, a, b, less) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Fall back to heapsort if too many bad choices were made. | ||||||
|  | 		if limit == 0 { | ||||||
|  | 			heapSortLessFunc(data, a, b, less) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// If the last partitioning was imbalanced, we need to breaking patterns. | ||||||
|  | 		if !wasBalanced { | ||||||
|  | 			breakPatternsLessFunc(data, a, b, less) | ||||||
|  | 			limit-- | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		pivot, hint := choosePivotLessFunc(data, a, b, less) | ||||||
|  | 		if hint == decreasingHint { | ||||||
|  | 			reverseRangeLessFunc(data, a, b, less) | ||||||
|  | 			// The chosen pivot was pivot-a elements after the start of the array. | ||||||
|  | 			// After reversing it is pivot-a elements before the end of the array. | ||||||
|  | 			// The idea came from Rust's implementation. | ||||||
|  | 			pivot = (b - 1) - (pivot - a) | ||||||
|  | 			hint = increasingHint | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// The slice is likely already sorted. | ||||||
|  | 		if wasBalanced && wasPartitioned && hint == increasingHint { | ||||||
|  | 			if partialInsertionSortLessFunc(data, a, b, less) { | ||||||
|  | 				return | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Probably the slice contains many duplicate elements, partition the slice into | ||||||
|  | 		// elements equal to and elements greater than the pivot. | ||||||
|  | 		if a > 0 && !less(data[a-1], data[pivot]) { | ||||||
|  | 			mid := partitionEqualLessFunc(data, a, b, pivot, less) | ||||||
|  | 			a = mid | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		mid, alreadyPartitioned := partitionLessFunc(data, a, b, pivot, less) | ||||||
|  | 		wasPartitioned = alreadyPartitioned | ||||||
|  |  | ||||||
|  | 		leftLen, rightLen := mid-a, b-mid | ||||||
|  | 		balanceThreshold := length / 8 | ||||||
|  | 		if leftLen < rightLen { | ||||||
|  | 			wasBalanced = leftLen >= balanceThreshold | ||||||
|  | 			pdqsortLessFunc(data, a, mid, limit, less) | ||||||
|  | 			a = mid + 1 | ||||||
|  | 		} else { | ||||||
|  | 			wasBalanced = rightLen >= balanceThreshold | ||||||
|  | 			pdqsortLessFunc(data, mid+1, b, limit, less) | ||||||
|  | 			b = mid | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // partitionLessFunc does one quicksort partition. | ||||||
|  | // Let p = data[pivot] | ||||||
|  | // Moves elements in data[a:b] around, so that data[i]<p and data[j]>=p for i<newpivot and j>newpivot. | ||||||
|  | // On return, data[newpivot] = p | ||||||
|  | func partitionLessFunc[E any](data []E, a, b, pivot int, less func(a, b E) bool) (newpivot int, alreadyPartitioned bool) { | ||||||
|  | 	data[a], data[pivot] = data[pivot], data[a] | ||||||
|  | 	i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned | ||||||
|  |  | ||||||
|  | 	for i <= j && less(data[i], data[a]) { | ||||||
|  | 		i++ | ||||||
|  | 	} | ||||||
|  | 	for i <= j && !less(data[j], data[a]) { | ||||||
|  | 		j-- | ||||||
|  | 	} | ||||||
|  | 	if i > j { | ||||||
|  | 		data[j], data[a] = data[a], data[j] | ||||||
|  | 		return j, true | ||||||
|  | 	} | ||||||
|  | 	data[i], data[j] = data[j], data[i] | ||||||
|  | 	i++ | ||||||
|  | 	j-- | ||||||
|  |  | ||||||
|  | 	for { | ||||||
|  | 		for i <= j && less(data[i], data[a]) { | ||||||
|  | 			i++ | ||||||
|  | 		} | ||||||
|  | 		for i <= j && !less(data[j], data[a]) { | ||||||
|  | 			j-- | ||||||
|  | 		} | ||||||
|  | 		if i > j { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 		data[i], data[j] = data[j], data[i] | ||||||
|  | 		i++ | ||||||
|  | 		j-- | ||||||
|  | 	} | ||||||
|  | 	data[j], data[a] = data[a], data[j] | ||||||
|  | 	return j, false | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // partitionEqualLessFunc partitions data[a:b] into elements equal to data[pivot] followed by elements greater than data[pivot]. | ||||||
|  | // It assumed that data[a:b] does not contain elements smaller than the data[pivot]. | ||||||
|  | func partitionEqualLessFunc[E any](data []E, a, b, pivot int, less func(a, b E) bool) (newpivot int) { | ||||||
|  | 	data[a], data[pivot] = data[pivot], data[a] | ||||||
|  | 	i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned | ||||||
|  |  | ||||||
|  | 	for { | ||||||
|  | 		for i <= j && !less(data[a], data[i]) { | ||||||
|  | 			i++ | ||||||
|  | 		} | ||||||
|  | 		for i <= j && less(data[a], data[j]) { | ||||||
|  | 			j-- | ||||||
|  | 		} | ||||||
|  | 		if i > j { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 		data[i], data[j] = data[j], data[i] | ||||||
|  | 		i++ | ||||||
|  | 		j-- | ||||||
|  | 	} | ||||||
|  | 	return i | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // partialInsertionSortLessFunc partially sorts a slice, returns true if the slice is sorted at the end. | ||||||
|  | func partialInsertionSortLessFunc[E any](data []E, a, b int, less func(a, b E) bool) bool { | ||||||
|  | 	const ( | ||||||
|  | 		maxSteps         = 5  // maximum number of adjacent out-of-order pairs that will get shifted | ||||||
|  | 		shortestShifting = 50 // don't shift any elements on short arrays | ||||||
|  | 	) | ||||||
|  | 	i := a + 1 | ||||||
|  | 	for j := 0; j < maxSteps; j++ { | ||||||
|  | 		for i < b && !less(data[i], data[i-1]) { | ||||||
|  | 			i++ | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if i == b { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if b-a < shortestShifting { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		data[i], data[i-1] = data[i-1], data[i] | ||||||
|  |  | ||||||
|  | 		// Shift the smaller one to the left. | ||||||
|  | 		if i-a >= 2 { | ||||||
|  | 			for j := i - 1; j >= 1; j-- { | ||||||
|  | 				if !less(data[j], data[j-1]) { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 				data[j], data[j-1] = data[j-1], data[j] | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		// Shift the greater one to the right. | ||||||
|  | 		if b-i >= 2 { | ||||||
|  | 			for j := i + 1; j < b; j++ { | ||||||
|  | 				if !less(data[j], data[j-1]) { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 				data[j], data[j-1] = data[j-1], data[j] | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // breakPatternsLessFunc scatters some elements around in an attempt to break some patterns | ||||||
|  | // that might cause imbalanced partitions in quicksort. | ||||||
|  | func breakPatternsLessFunc[E any](data []E, a, b int, less func(a, b E) bool) { | ||||||
|  | 	length := b - a | ||||||
|  | 	if length >= 8 { | ||||||
|  | 		random := xorshift(length) | ||||||
|  | 		modulus := nextPowerOfTwo(length) | ||||||
|  |  | ||||||
|  | 		for idx := a + (length/4)*2 - 1; idx <= a+(length/4)*2+1; idx++ { | ||||||
|  | 			other := int(uint(random.Next()) & (modulus - 1)) | ||||||
|  | 			if other >= length { | ||||||
|  | 				other -= length | ||||||
|  | 			} | ||||||
|  | 			data[idx], data[a+other] = data[a+other], data[idx] | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // choosePivotLessFunc chooses a pivot in data[a:b]. | ||||||
|  | // | ||||||
|  | // [0,8): chooses a static pivot. | ||||||
|  | // [8,shortestNinther): uses the simple median-of-three method. | ||||||
|  | // [shortestNinther,∞): uses the Tukey ninther method. | ||||||
|  | func choosePivotLessFunc[E any](data []E, a, b int, less func(a, b E) bool) (pivot int, hint sortedHint) { | ||||||
|  | 	const ( | ||||||
|  | 		shortestNinther = 50 | ||||||
|  | 		maxSwaps        = 4 * 3 | ||||||
|  | 	) | ||||||
|  |  | ||||||
|  | 	l := b - a | ||||||
|  |  | ||||||
|  | 	var ( | ||||||
|  | 		swaps int | ||||||
|  | 		i     = a + l/4*1 | ||||||
|  | 		j     = a + l/4*2 | ||||||
|  | 		k     = a + l/4*3 | ||||||
|  | 	) | ||||||
|  |  | ||||||
|  | 	if l >= 8 { | ||||||
|  | 		if l >= shortestNinther { | ||||||
|  | 			// Tukey ninther method, the idea came from Rust's implementation. | ||||||
|  | 			i = medianAdjacentLessFunc(data, i, &swaps, less) | ||||||
|  | 			j = medianAdjacentLessFunc(data, j, &swaps, less) | ||||||
|  | 			k = medianAdjacentLessFunc(data, k, &swaps, less) | ||||||
|  | 		} | ||||||
|  | 		// Find the median among i, j, k and stores it into j. | ||||||
|  | 		j = medianLessFunc(data, i, j, k, &swaps, less) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	switch swaps { | ||||||
|  | 	case 0: | ||||||
|  | 		return j, increasingHint | ||||||
|  | 	case maxSwaps: | ||||||
|  | 		return j, decreasingHint | ||||||
|  | 	default: | ||||||
|  | 		return j, unknownHint | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // order2LessFunc returns x,y where data[x] <= data[y], where x,y=a,b or x,y=b,a. | ||||||
|  | func order2LessFunc[E any](data []E, a, b int, swaps *int, less func(a, b E) bool) (int, int) { | ||||||
|  | 	if less(data[b], data[a]) { | ||||||
|  | 		*swaps++ | ||||||
|  | 		return b, a | ||||||
|  | 	} | ||||||
|  | 	return a, b | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // medianLessFunc returns x where data[x] is the median of data[a],data[b],data[c], where x is a, b, or c. | ||||||
|  | func medianLessFunc[E any](data []E, a, b, c int, swaps *int, less func(a, b E) bool) int { | ||||||
|  | 	a, b = order2LessFunc(data, a, b, swaps, less) | ||||||
|  | 	b, c = order2LessFunc(data, b, c, swaps, less) | ||||||
|  | 	a, b = order2LessFunc(data, a, b, swaps, less) | ||||||
|  | 	return b | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // medianAdjacentLessFunc finds the median of data[a - 1], data[a], data[a + 1] and stores the index into a. | ||||||
|  | func medianAdjacentLessFunc[E any](data []E, a int, swaps *int, less func(a, b E) bool) int { | ||||||
|  | 	return medianLessFunc(data, a-1, a, a+1, swaps, less) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func reverseRangeLessFunc[E any](data []E, a, b int, less func(a, b E) bool) { | ||||||
|  | 	i := a | ||||||
|  | 	j := b - 1 | ||||||
|  | 	for i < j { | ||||||
|  | 		data[i], data[j] = data[j], data[i] | ||||||
|  | 		i++ | ||||||
|  | 		j-- | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func swapRangeLessFunc[E any](data []E, a, b, n int, less func(a, b E) bool) { | ||||||
|  | 	for i := 0; i < n; i++ { | ||||||
|  | 		data[a+i], data[b+i] = data[b+i], data[a+i] | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func stableLessFunc[E any](data []E, n int, less func(a, b E) bool) { | ||||||
|  | 	blockSize := 20 // must be > 0 | ||||||
|  | 	a, b := 0, blockSize | ||||||
|  | 	for b <= n { | ||||||
|  | 		insertionSortLessFunc(data, a, b, less) | ||||||
|  | 		a = b | ||||||
|  | 		b += blockSize | ||||||
|  | 	} | ||||||
|  | 	insertionSortLessFunc(data, a, n, less) | ||||||
|  |  | ||||||
|  | 	for blockSize < n { | ||||||
|  | 		a, b = 0, 2*blockSize | ||||||
|  | 		for b <= n { | ||||||
|  | 			symMergeLessFunc(data, a, a+blockSize, b, less) | ||||||
|  | 			a = b | ||||||
|  | 			b += 2 * blockSize | ||||||
|  | 		} | ||||||
|  | 		if m := a + blockSize; m < n { | ||||||
|  | 			symMergeLessFunc(data, a, m, n, less) | ||||||
|  | 		} | ||||||
|  | 		blockSize *= 2 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // symMergeLessFunc merges the two sorted subsequences data[a:m] and data[m:b] using | ||||||
|  | // the SymMerge algorithm from Pok-Son Kim and Arne Kutzner, "Stable Minimum | ||||||
|  | // Storage Merging by Symmetric Comparisons", in Susanne Albers and Tomasz | ||||||
|  | // Radzik, editors, Algorithms - ESA 2004, volume 3221 of Lecture Notes in | ||||||
|  | // Computer Science, pages 714-723. Springer, 2004. | ||||||
|  | // | ||||||
|  | // Let M = m-a and N = b-n. Wolog M < N. | ||||||
|  | // The recursion depth is bound by ceil(log(N+M)). | ||||||
|  | // The algorithm needs O(M*log(N/M + 1)) calls to data.Less. | ||||||
|  | // The algorithm needs O((M+N)*log(M)) calls to data.Swap. | ||||||
|  | // | ||||||
|  | // The paper gives O((M+N)*log(M)) as the number of assignments assuming a | ||||||
|  | // rotation algorithm which uses O(M+N+gcd(M+N)) assignments. The argumentation | ||||||
|  | // in the paper carries through for Swap operations, especially as the block | ||||||
|  | // swapping rotate uses only O(M+N) Swaps. | ||||||
|  | // | ||||||
|  | // symMerge assumes non-degenerate arguments: a < m && m < b. | ||||||
|  | // Having the caller check this condition eliminates many leaf recursion calls, | ||||||
|  | // which improves performance. | ||||||
|  | func symMergeLessFunc[E any](data []E, a, m, b int, less func(a, b E) bool) { | ||||||
|  | 	// Avoid unnecessary recursions of symMerge | ||||||
|  | 	// by direct insertion of data[a] into data[m:b] | ||||||
|  | 	// if data[a:m] only contains one element. | ||||||
|  | 	if m-a == 1 { | ||||||
|  | 		// Use binary search to find the lowest index i | ||||||
|  | 		// such that data[i] >= data[a] for m <= i < b. | ||||||
|  | 		// Exit the search loop with i == b in case no such index exists. | ||||||
|  | 		i := m | ||||||
|  | 		j := b | ||||||
|  | 		for i < j { | ||||||
|  | 			h := int(uint(i+j) >> 1) | ||||||
|  | 			if less(data[h], data[a]) { | ||||||
|  | 				i = h + 1 | ||||||
|  | 			} else { | ||||||
|  | 				j = h | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		// Swap values until data[a] reaches the position before i. | ||||||
|  | 		for k := a; k < i-1; k++ { | ||||||
|  | 			data[k], data[k+1] = data[k+1], data[k] | ||||||
|  | 		} | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Avoid unnecessary recursions of symMerge | ||||||
|  | 	// by direct insertion of data[m] into data[a:m] | ||||||
|  | 	// if data[m:b] only contains one element. | ||||||
|  | 	if b-m == 1 { | ||||||
|  | 		// Use binary search to find the lowest index i | ||||||
|  | 		// such that data[i] > data[m] for a <= i < m. | ||||||
|  | 		// Exit the search loop with i == m in case no such index exists. | ||||||
|  | 		i := a | ||||||
|  | 		j := m | ||||||
|  | 		for i < j { | ||||||
|  | 			h := int(uint(i+j) >> 1) | ||||||
|  | 			if !less(data[m], data[h]) { | ||||||
|  | 				i = h + 1 | ||||||
|  | 			} else { | ||||||
|  | 				j = h | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		// Swap values until data[m] reaches the position i. | ||||||
|  | 		for k := m; k > i; k-- { | ||||||
|  | 			data[k], data[k-1] = data[k-1], data[k] | ||||||
|  | 		} | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	mid := int(uint(a+b) >> 1) | ||||||
|  | 	n := mid + m | ||||||
|  | 	var start, r int | ||||||
|  | 	if m > mid { | ||||||
|  | 		start = n - b | ||||||
|  | 		r = mid | ||||||
|  | 	} else { | ||||||
|  | 		start = a | ||||||
|  | 		r = m | ||||||
|  | 	} | ||||||
|  | 	p := n - 1 | ||||||
|  |  | ||||||
|  | 	for start < r { | ||||||
|  | 		c := int(uint(start+r) >> 1) | ||||||
|  | 		if !less(data[p-c], data[c]) { | ||||||
|  | 			start = c + 1 | ||||||
|  | 		} else { | ||||||
|  | 			r = c | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	end := n - start | ||||||
|  | 	if start < m && m < end { | ||||||
|  | 		rotateLessFunc(data, start, m, end, less) | ||||||
|  | 	} | ||||||
|  | 	if a < start && start < mid { | ||||||
|  | 		symMergeLessFunc(data, a, start, mid, less) | ||||||
|  | 	} | ||||||
|  | 	if mid < end && end < b { | ||||||
|  | 		symMergeLessFunc(data, mid, end, b, less) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // rotateLessFunc rotates two consecutive blocks u = data[a:m] and v = data[m:b] in data: | ||||||
|  | // Data of the form 'x u v y' is changed to 'x v u y'. | ||||||
|  | // rotate performs at most b-a many calls to data.Swap, | ||||||
|  | // and it assumes non-degenerate arguments: a < m && m < b. | ||||||
|  | func rotateLessFunc[E any](data []E, a, m, b int, less func(a, b E) bool) { | ||||||
|  | 	i := m - a | ||||||
|  | 	j := b - m | ||||||
|  |  | ||||||
|  | 	for i != j { | ||||||
|  | 		if i > j { | ||||||
|  | 			swapRangeLessFunc(data, m-i, m, j, less) | ||||||
|  | 			i -= j | ||||||
|  | 		} else { | ||||||
|  | 			swapRangeLessFunc(data, m-i, m+j-i, i, less) | ||||||
|  | 			j -= i | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	// i == j | ||||||
|  | 	swapRangeLessFunc(data, m-i, m, i, less) | ||||||
|  | } | ||||||
							
								
								
									
										481
									
								
								vendor/golang.org/x/exp/slices/zsortordered.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										481
									
								
								vendor/golang.org/x/exp/slices/zsortordered.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							| @@ -0,0 +1,481 @@ | |||||||
|  | // Code generated by gen_sort_variants.go; DO NOT EDIT. | ||||||
|  |  | ||||||
|  | // Copyright 2022 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 slices | ||||||
|  |  | ||||||
|  | import "golang.org/x/exp/constraints" | ||||||
|  |  | ||||||
|  | // insertionSortOrdered sorts data[a:b] using insertion sort. | ||||||
|  | func insertionSortOrdered[E constraints.Ordered](data []E, a, b int) { | ||||||
|  | 	for i := a + 1; i < b; i++ { | ||||||
|  | 		for j := i; j > a && (data[j] < data[j-1]); j-- { | ||||||
|  | 			data[j], data[j-1] = data[j-1], data[j] | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // siftDownOrdered implements the heap property on data[lo:hi]. | ||||||
|  | // first is an offset into the array where the root of the heap lies. | ||||||
|  | func siftDownOrdered[E constraints.Ordered](data []E, lo, hi, first int) { | ||||||
|  | 	root := lo | ||||||
|  | 	for { | ||||||
|  | 		child := 2*root + 1 | ||||||
|  | 		if child >= hi { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 		if child+1 < hi && (data[first+child] < data[first+child+1]) { | ||||||
|  | 			child++ | ||||||
|  | 		} | ||||||
|  | 		if !(data[first+root] < data[first+child]) { | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		data[first+root], data[first+child] = data[first+child], data[first+root] | ||||||
|  | 		root = child | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func heapSortOrdered[E constraints.Ordered](data []E, a, b int) { | ||||||
|  | 	first := a | ||||||
|  | 	lo := 0 | ||||||
|  | 	hi := b - a | ||||||
|  |  | ||||||
|  | 	// Build heap with greatest element at top. | ||||||
|  | 	for i := (hi - 1) / 2; i >= 0; i-- { | ||||||
|  | 		siftDownOrdered(data, i, hi, first) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Pop elements, largest first, into end of data. | ||||||
|  | 	for i := hi - 1; i >= 0; i-- { | ||||||
|  | 		data[first], data[first+i] = data[first+i], data[first] | ||||||
|  | 		siftDownOrdered(data, lo, i, first) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // pdqsortOrdered sorts data[a:b]. | ||||||
|  | // The algorithm based on pattern-defeating quicksort(pdqsort), but without the optimizations from BlockQuicksort. | ||||||
|  | // pdqsort paper: https://arxiv.org/pdf/2106.05123.pdf | ||||||
|  | // C++ implementation: https://github.com/orlp/pdqsort | ||||||
|  | // Rust implementation: https://docs.rs/pdqsort/latest/pdqsort/ | ||||||
|  | // limit is the number of allowed bad (very unbalanced) pivots before falling back to heapsort. | ||||||
|  | func pdqsortOrdered[E constraints.Ordered](data []E, a, b, limit int) { | ||||||
|  | 	const maxInsertion = 12 | ||||||
|  |  | ||||||
|  | 	var ( | ||||||
|  | 		wasBalanced    = true // whether the last partitioning was reasonably balanced | ||||||
|  | 		wasPartitioned = true // whether the slice was already partitioned | ||||||
|  | 	) | ||||||
|  |  | ||||||
|  | 	for { | ||||||
|  | 		length := b - a | ||||||
|  |  | ||||||
|  | 		if length <= maxInsertion { | ||||||
|  | 			insertionSortOrdered(data, a, b) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Fall back to heapsort if too many bad choices were made. | ||||||
|  | 		if limit == 0 { | ||||||
|  | 			heapSortOrdered(data, a, b) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// If the last partitioning was imbalanced, we need to breaking patterns. | ||||||
|  | 		if !wasBalanced { | ||||||
|  | 			breakPatternsOrdered(data, a, b) | ||||||
|  | 			limit-- | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		pivot, hint := choosePivotOrdered(data, a, b) | ||||||
|  | 		if hint == decreasingHint { | ||||||
|  | 			reverseRangeOrdered(data, a, b) | ||||||
|  | 			// The chosen pivot was pivot-a elements after the start of the array. | ||||||
|  | 			// After reversing it is pivot-a elements before the end of the array. | ||||||
|  | 			// The idea came from Rust's implementation. | ||||||
|  | 			pivot = (b - 1) - (pivot - a) | ||||||
|  | 			hint = increasingHint | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// The slice is likely already sorted. | ||||||
|  | 		if wasBalanced && wasPartitioned && hint == increasingHint { | ||||||
|  | 			if partialInsertionSortOrdered(data, a, b) { | ||||||
|  | 				return | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		// Probably the slice contains many duplicate elements, partition the slice into | ||||||
|  | 		// elements equal to and elements greater than the pivot. | ||||||
|  | 		if a > 0 && !(data[a-1] < data[pivot]) { | ||||||
|  | 			mid := partitionEqualOrdered(data, a, b, pivot) | ||||||
|  | 			a = mid | ||||||
|  | 			continue | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		mid, alreadyPartitioned := partitionOrdered(data, a, b, pivot) | ||||||
|  | 		wasPartitioned = alreadyPartitioned | ||||||
|  |  | ||||||
|  | 		leftLen, rightLen := mid-a, b-mid | ||||||
|  | 		balanceThreshold := length / 8 | ||||||
|  | 		if leftLen < rightLen { | ||||||
|  | 			wasBalanced = leftLen >= balanceThreshold | ||||||
|  | 			pdqsortOrdered(data, a, mid, limit) | ||||||
|  | 			a = mid + 1 | ||||||
|  | 		} else { | ||||||
|  | 			wasBalanced = rightLen >= balanceThreshold | ||||||
|  | 			pdqsortOrdered(data, mid+1, b, limit) | ||||||
|  | 			b = mid | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // partitionOrdered does one quicksort partition. | ||||||
|  | // Let p = data[pivot] | ||||||
|  | // Moves elements in data[a:b] around, so that data[i]<p and data[j]>=p for i<newpivot and j>newpivot. | ||||||
|  | // On return, data[newpivot] = p | ||||||
|  | func partitionOrdered[E constraints.Ordered](data []E, a, b, pivot int) (newpivot int, alreadyPartitioned bool) { | ||||||
|  | 	data[a], data[pivot] = data[pivot], data[a] | ||||||
|  | 	i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned | ||||||
|  |  | ||||||
|  | 	for i <= j && (data[i] < data[a]) { | ||||||
|  | 		i++ | ||||||
|  | 	} | ||||||
|  | 	for i <= j && !(data[j] < data[a]) { | ||||||
|  | 		j-- | ||||||
|  | 	} | ||||||
|  | 	if i > j { | ||||||
|  | 		data[j], data[a] = data[a], data[j] | ||||||
|  | 		return j, true | ||||||
|  | 	} | ||||||
|  | 	data[i], data[j] = data[j], data[i] | ||||||
|  | 	i++ | ||||||
|  | 	j-- | ||||||
|  |  | ||||||
|  | 	for { | ||||||
|  | 		for i <= j && (data[i] < data[a]) { | ||||||
|  | 			i++ | ||||||
|  | 		} | ||||||
|  | 		for i <= j && !(data[j] < data[a]) { | ||||||
|  | 			j-- | ||||||
|  | 		} | ||||||
|  | 		if i > j { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 		data[i], data[j] = data[j], data[i] | ||||||
|  | 		i++ | ||||||
|  | 		j-- | ||||||
|  | 	} | ||||||
|  | 	data[j], data[a] = data[a], data[j] | ||||||
|  | 	return j, false | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // partitionEqualOrdered partitions data[a:b] into elements equal to data[pivot] followed by elements greater than data[pivot]. | ||||||
|  | // It assumed that data[a:b] does not contain elements smaller than the data[pivot]. | ||||||
|  | func partitionEqualOrdered[E constraints.Ordered](data []E, a, b, pivot int) (newpivot int) { | ||||||
|  | 	data[a], data[pivot] = data[pivot], data[a] | ||||||
|  | 	i, j := a+1, b-1 // i and j are inclusive of the elements remaining to be partitioned | ||||||
|  |  | ||||||
|  | 	for { | ||||||
|  | 		for i <= j && !(data[a] < data[i]) { | ||||||
|  | 			i++ | ||||||
|  | 		} | ||||||
|  | 		for i <= j && (data[a] < data[j]) { | ||||||
|  | 			j-- | ||||||
|  | 		} | ||||||
|  | 		if i > j { | ||||||
|  | 			break | ||||||
|  | 		} | ||||||
|  | 		data[i], data[j] = data[j], data[i] | ||||||
|  | 		i++ | ||||||
|  | 		j-- | ||||||
|  | 	} | ||||||
|  | 	return i | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // partialInsertionSortOrdered partially sorts a slice, returns true if the slice is sorted at the end. | ||||||
|  | func partialInsertionSortOrdered[E constraints.Ordered](data []E, a, b int) bool { | ||||||
|  | 	const ( | ||||||
|  | 		maxSteps         = 5  // maximum number of adjacent out-of-order pairs that will get shifted | ||||||
|  | 		shortestShifting = 50 // don't shift any elements on short arrays | ||||||
|  | 	) | ||||||
|  | 	i := a + 1 | ||||||
|  | 	for j := 0; j < maxSteps; j++ { | ||||||
|  | 		for i < b && !(data[i] < data[i-1]) { | ||||||
|  | 			i++ | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if i == b { | ||||||
|  | 			return true | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		if b-a < shortestShifting { | ||||||
|  | 			return false | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		data[i], data[i-1] = data[i-1], data[i] | ||||||
|  |  | ||||||
|  | 		// Shift the smaller one to the left. | ||||||
|  | 		if i-a >= 2 { | ||||||
|  | 			for j := i - 1; j >= 1; j-- { | ||||||
|  | 				if !(data[j] < data[j-1]) { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 				data[j], data[j-1] = data[j-1], data[j] | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		// Shift the greater one to the right. | ||||||
|  | 		if b-i >= 2 { | ||||||
|  | 			for j := i + 1; j < b; j++ { | ||||||
|  | 				if !(data[j] < data[j-1]) { | ||||||
|  | 					break | ||||||
|  | 				} | ||||||
|  | 				data[j], data[j-1] = data[j-1], data[j] | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	return false | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // breakPatternsOrdered scatters some elements around in an attempt to break some patterns | ||||||
|  | // that might cause imbalanced partitions in quicksort. | ||||||
|  | func breakPatternsOrdered[E constraints.Ordered](data []E, a, b int) { | ||||||
|  | 	length := b - a | ||||||
|  | 	if length >= 8 { | ||||||
|  | 		random := xorshift(length) | ||||||
|  | 		modulus := nextPowerOfTwo(length) | ||||||
|  |  | ||||||
|  | 		for idx := a + (length/4)*2 - 1; idx <= a+(length/4)*2+1; idx++ { | ||||||
|  | 			other := int(uint(random.Next()) & (modulus - 1)) | ||||||
|  | 			if other >= length { | ||||||
|  | 				other -= length | ||||||
|  | 			} | ||||||
|  | 			data[idx], data[a+other] = data[a+other], data[idx] | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // choosePivotOrdered chooses a pivot in data[a:b]. | ||||||
|  | // | ||||||
|  | // [0,8): chooses a static pivot. | ||||||
|  | // [8,shortestNinther): uses the simple median-of-three method. | ||||||
|  | // [shortestNinther,∞): uses the Tukey ninther method. | ||||||
|  | func choosePivotOrdered[E constraints.Ordered](data []E, a, b int) (pivot int, hint sortedHint) { | ||||||
|  | 	const ( | ||||||
|  | 		shortestNinther = 50 | ||||||
|  | 		maxSwaps        = 4 * 3 | ||||||
|  | 	) | ||||||
|  |  | ||||||
|  | 	l := b - a | ||||||
|  |  | ||||||
|  | 	var ( | ||||||
|  | 		swaps int | ||||||
|  | 		i     = a + l/4*1 | ||||||
|  | 		j     = a + l/4*2 | ||||||
|  | 		k     = a + l/4*3 | ||||||
|  | 	) | ||||||
|  |  | ||||||
|  | 	if l >= 8 { | ||||||
|  | 		if l >= shortestNinther { | ||||||
|  | 			// Tukey ninther method, the idea came from Rust's implementation. | ||||||
|  | 			i = medianAdjacentOrdered(data, i, &swaps) | ||||||
|  | 			j = medianAdjacentOrdered(data, j, &swaps) | ||||||
|  | 			k = medianAdjacentOrdered(data, k, &swaps) | ||||||
|  | 		} | ||||||
|  | 		// Find the median among i, j, k and stores it into j. | ||||||
|  | 		j = medianOrdered(data, i, j, k, &swaps) | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	switch swaps { | ||||||
|  | 	case 0: | ||||||
|  | 		return j, increasingHint | ||||||
|  | 	case maxSwaps: | ||||||
|  | 		return j, decreasingHint | ||||||
|  | 	default: | ||||||
|  | 		return j, unknownHint | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // order2Ordered returns x,y where data[x] <= data[y], where x,y=a,b or x,y=b,a. | ||||||
|  | func order2Ordered[E constraints.Ordered](data []E, a, b int, swaps *int) (int, int) { | ||||||
|  | 	if data[b] < data[a] { | ||||||
|  | 		*swaps++ | ||||||
|  | 		return b, a | ||||||
|  | 	} | ||||||
|  | 	return a, b | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // medianOrdered returns x where data[x] is the median of data[a],data[b],data[c], where x is a, b, or c. | ||||||
|  | func medianOrdered[E constraints.Ordered](data []E, a, b, c int, swaps *int) int { | ||||||
|  | 	a, b = order2Ordered(data, a, b, swaps) | ||||||
|  | 	b, c = order2Ordered(data, b, c, swaps) | ||||||
|  | 	a, b = order2Ordered(data, a, b, swaps) | ||||||
|  | 	return b | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // medianAdjacentOrdered finds the median of data[a - 1], data[a], data[a + 1] and stores the index into a. | ||||||
|  | func medianAdjacentOrdered[E constraints.Ordered](data []E, a int, swaps *int) int { | ||||||
|  | 	return medianOrdered(data, a-1, a, a+1, swaps) | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func reverseRangeOrdered[E constraints.Ordered](data []E, a, b int) { | ||||||
|  | 	i := a | ||||||
|  | 	j := b - 1 | ||||||
|  | 	for i < j { | ||||||
|  | 		data[i], data[j] = data[j], data[i] | ||||||
|  | 		i++ | ||||||
|  | 		j-- | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func swapRangeOrdered[E constraints.Ordered](data []E, a, b, n int) { | ||||||
|  | 	for i := 0; i < n; i++ { | ||||||
|  | 		data[a+i], data[b+i] = data[b+i], data[a+i] | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func stableOrdered[E constraints.Ordered](data []E, n int) { | ||||||
|  | 	blockSize := 20 // must be > 0 | ||||||
|  | 	a, b := 0, blockSize | ||||||
|  | 	for b <= n { | ||||||
|  | 		insertionSortOrdered(data, a, b) | ||||||
|  | 		a = b | ||||||
|  | 		b += blockSize | ||||||
|  | 	} | ||||||
|  | 	insertionSortOrdered(data, a, n) | ||||||
|  |  | ||||||
|  | 	for blockSize < n { | ||||||
|  | 		a, b = 0, 2*blockSize | ||||||
|  | 		for b <= n { | ||||||
|  | 			symMergeOrdered(data, a, a+blockSize, b) | ||||||
|  | 			a = b | ||||||
|  | 			b += 2 * blockSize | ||||||
|  | 		} | ||||||
|  | 		if m := a + blockSize; m < n { | ||||||
|  | 			symMergeOrdered(data, a, m, n) | ||||||
|  | 		} | ||||||
|  | 		blockSize *= 2 | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // symMergeOrdered merges the two sorted subsequences data[a:m] and data[m:b] using | ||||||
|  | // the SymMerge algorithm from Pok-Son Kim and Arne Kutzner, "Stable Minimum | ||||||
|  | // Storage Merging by Symmetric Comparisons", in Susanne Albers and Tomasz | ||||||
|  | // Radzik, editors, Algorithms - ESA 2004, volume 3221 of Lecture Notes in | ||||||
|  | // Computer Science, pages 714-723. Springer, 2004. | ||||||
|  | // | ||||||
|  | // Let M = m-a and N = b-n. Wolog M < N. | ||||||
|  | // The recursion depth is bound by ceil(log(N+M)). | ||||||
|  | // The algorithm needs O(M*log(N/M + 1)) calls to data.Less. | ||||||
|  | // The algorithm needs O((M+N)*log(M)) calls to data.Swap. | ||||||
|  | // | ||||||
|  | // The paper gives O((M+N)*log(M)) as the number of assignments assuming a | ||||||
|  | // rotation algorithm which uses O(M+N+gcd(M+N)) assignments. The argumentation | ||||||
|  | // in the paper carries through for Swap operations, especially as the block | ||||||
|  | // swapping rotate uses only O(M+N) Swaps. | ||||||
|  | // | ||||||
|  | // symMerge assumes non-degenerate arguments: a < m && m < b. | ||||||
|  | // Having the caller check this condition eliminates many leaf recursion calls, | ||||||
|  | // which improves performance. | ||||||
|  | func symMergeOrdered[E constraints.Ordered](data []E, a, m, b int) { | ||||||
|  | 	// Avoid unnecessary recursions of symMerge | ||||||
|  | 	// by direct insertion of data[a] into data[m:b] | ||||||
|  | 	// if data[a:m] only contains one element. | ||||||
|  | 	if m-a == 1 { | ||||||
|  | 		// Use binary search to find the lowest index i | ||||||
|  | 		// such that data[i] >= data[a] for m <= i < b. | ||||||
|  | 		// Exit the search loop with i == b in case no such index exists. | ||||||
|  | 		i := m | ||||||
|  | 		j := b | ||||||
|  | 		for i < j { | ||||||
|  | 			h := int(uint(i+j) >> 1) | ||||||
|  | 			if data[h] < data[a] { | ||||||
|  | 				i = h + 1 | ||||||
|  | 			} else { | ||||||
|  | 				j = h | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		// Swap values until data[a] reaches the position before i. | ||||||
|  | 		for k := a; k < i-1; k++ { | ||||||
|  | 			data[k], data[k+1] = data[k+1], data[k] | ||||||
|  | 		} | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	// Avoid unnecessary recursions of symMerge | ||||||
|  | 	// by direct insertion of data[m] into data[a:m] | ||||||
|  | 	// if data[m:b] only contains one element. | ||||||
|  | 	if b-m == 1 { | ||||||
|  | 		// Use binary search to find the lowest index i | ||||||
|  | 		// such that data[i] > data[m] for a <= i < m. | ||||||
|  | 		// Exit the search loop with i == m in case no such index exists. | ||||||
|  | 		i := a | ||||||
|  | 		j := m | ||||||
|  | 		for i < j { | ||||||
|  | 			h := int(uint(i+j) >> 1) | ||||||
|  | 			if !(data[m] < data[h]) { | ||||||
|  | 				i = h + 1 | ||||||
|  | 			} else { | ||||||
|  | 				j = h | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		// Swap values until data[m] reaches the position i. | ||||||
|  | 		for k := m; k > i; k-- { | ||||||
|  | 			data[k], data[k-1] = data[k-1], data[k] | ||||||
|  | 		} | ||||||
|  | 		return | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	mid := int(uint(a+b) >> 1) | ||||||
|  | 	n := mid + m | ||||||
|  | 	var start, r int | ||||||
|  | 	if m > mid { | ||||||
|  | 		start = n - b | ||||||
|  | 		r = mid | ||||||
|  | 	} else { | ||||||
|  | 		start = a | ||||||
|  | 		r = m | ||||||
|  | 	} | ||||||
|  | 	p := n - 1 | ||||||
|  |  | ||||||
|  | 	for start < r { | ||||||
|  | 		c := int(uint(start+r) >> 1) | ||||||
|  | 		if !(data[p-c] < data[c]) { | ||||||
|  | 			start = c + 1 | ||||||
|  | 		} else { | ||||||
|  | 			r = c | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  |  | ||||||
|  | 	end := n - start | ||||||
|  | 	if start < m && m < end { | ||||||
|  | 		rotateOrdered(data, start, m, end) | ||||||
|  | 	} | ||||||
|  | 	if a < start && start < mid { | ||||||
|  | 		symMergeOrdered(data, a, start, mid) | ||||||
|  | 	} | ||||||
|  | 	if mid < end && end < b { | ||||||
|  | 		symMergeOrdered(data, mid, end, b) | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // rotateOrdered rotates two consecutive blocks u = data[a:m] and v = data[m:b] in data: | ||||||
|  | // Data of the form 'x u v y' is changed to 'x v u y'. | ||||||
|  | // rotate performs at most b-a many calls to data.Swap, | ||||||
|  | // and it assumes non-degenerate arguments: a < m && m < b. | ||||||
|  | func rotateOrdered[E constraints.Ordered](data []E, a, m, b int) { | ||||||
|  | 	i := m - a | ||||||
|  | 	j := b - m | ||||||
|  |  | ||||||
|  | 	for i != j { | ||||||
|  | 		if i > j { | ||||||
|  | 			swapRangeOrdered(data, m-i, m, j) | ||||||
|  | 			i -= j | ||||||
|  | 		} else { | ||||||
|  | 			swapRangeOrdered(data, m-i, m+j-i, i) | ||||||
|  | 			j -= i | ||||||
|  | 		} | ||||||
|  | 	} | ||||||
|  | 	// i == j | ||||||
|  | 	swapRangeOrdered(data, m-i, m, i) | ||||||
|  | } | ||||||
							
								
								
									
										14
									
								
								vendor/golang.org/x/mod/modfile/print.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										14
									
								
								vendor/golang.org/x/mod/modfile/print.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -16,7 +16,13 @@ import ( | |||||||
| func Format(f *FileSyntax) []byte { | func Format(f *FileSyntax) []byte { | ||||||
| 	pr := &printer{} | 	pr := &printer{} | ||||||
| 	pr.file(f) | 	pr.file(f) | ||||||
| 	return pr.Bytes() |  | ||||||
|  | 	// remove trailing blank lines | ||||||
|  | 	b := pr.Bytes() | ||||||
|  | 	for len(b) > 0 && b[len(b)-1] == '\n' && (len(b) == 1 || b[len(b)-2] == '\n') { | ||||||
|  | 		b = b[:len(b)-1] | ||||||
|  | 	} | ||||||
|  | 	return b | ||||||
| } | } | ||||||
|  |  | ||||||
| // A printer collects the state during printing of a file or expression. | // A printer collects the state during printing of a file or expression. | ||||||
| @@ -59,7 +65,11 @@ func (p *printer) newline() { | |||||||
| 	} | 	} | ||||||
|  |  | ||||||
| 	p.trim() | 	p.trim() | ||||||
| 	p.printf("\n") | 	if b := p.Bytes(); len(b) == 0 || (len(b) >= 2 && b[len(b)-1] == '\n' && b[len(b)-2] == '\n') { | ||||||
|  | 		// skip the blank line at top of file or after a blank line | ||||||
|  | 	} else { | ||||||
|  | 		p.printf("\n") | ||||||
|  | 	} | ||||||
| 	for i := 0; i < p.margin; i++ { | 	for i := 0; i < p.margin; i++ { | ||||||
| 		p.printf("\t") | 		p.printf("\t") | ||||||
| 	} | 	} | ||||||
|   | |||||||
							
								
								
									
										122
									
								
								vendor/golang.org/x/mod/modfile/rule.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										122
									
								
								vendor/golang.org/x/mod/modfile/rule.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -35,12 +35,13 @@ import ( | |||||||
|  |  | ||||||
| // A File is the parsed, interpreted form of a go.mod file. | // A File is the parsed, interpreted form of a go.mod file. | ||||||
| type File struct { | type File struct { | ||||||
| 	Module  *Module | 	Module    *Module | ||||||
| 	Go      *Go | 	Go        *Go | ||||||
| 	Require []*Require | 	Toolchain *Toolchain | ||||||
| 	Exclude []*Exclude | 	Require   []*Require | ||||||
| 	Replace []*Replace | 	Exclude   []*Exclude | ||||||
| 	Retract []*Retract | 	Replace   []*Replace | ||||||
|  | 	Retract   []*Retract | ||||||
|  |  | ||||||
| 	Syntax *FileSyntax | 	Syntax *FileSyntax | ||||||
| } | } | ||||||
| @@ -58,6 +59,12 @@ type Go struct { | |||||||
| 	Syntax  *Line | 	Syntax  *Line | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // A Toolchain is the toolchain statement. | ||||||
|  | type Toolchain struct { | ||||||
|  | 	Name   string // "go1.21rc1" | ||||||
|  | 	Syntax *Line | ||||||
|  | } | ||||||
|  |  | ||||||
| // An Exclude is a single exclude statement. | // An Exclude is a single exclude statement. | ||||||
| type Exclude struct { | type Exclude struct { | ||||||
| 	Mod    module.Version | 	Mod    module.Version | ||||||
| @@ -296,9 +303,13 @@ func parseToFile(file string, data []byte, fix VersionFixer, strict bool) (parse | |||||||
| 	return f, nil | 	return f, nil | ||||||
| } | } | ||||||
|  |  | ||||||
| var GoVersionRE = lazyregexp.New(`^([1-9][0-9]*)\.(0|[1-9][0-9]*)$`) | 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].*)$`) | var laxGoVersionRE = lazyregexp.New(`^v?(([1-9][0-9]*)\.(0|[1-9][0-9]*))([^0-9].*)$`) | ||||||
|  |  | ||||||
|  | // Toolchains must be named beginning with `go1`, | ||||||
|  | // like "go1.20.3" or "go1.20.3-gccgo". As a special case, "default" is also permitted. | ||||||
|  | var ToolchainRE = lazyregexp.New(`^default$|^go1($|\.)`) | ||||||
|  |  | ||||||
| func (f *File) add(errs *ErrorList, block *LineBlock, line *Line, verb string, args []string, fix VersionFixer, strict bool) { | func (f *File) add(errs *ErrorList, block *LineBlock, line *Line, verb string, args []string, fix VersionFixer, strict bool) { | ||||||
| 	// If strict is false, this module is a dependency. | 	// If strict is false, this module is a dependency. | ||||||
| 	// We ignore all unknown directives as well as main-module-only | 	// We ignore all unknown directives as well as main-module-only | ||||||
| @@ -364,6 +375,21 @@ func (f *File) add(errs *ErrorList, block *LineBlock, line *Line, verb string, a | |||||||
| 		f.Go = &Go{Syntax: line} | 		f.Go = &Go{Syntax: line} | ||||||
| 		f.Go.Version = args[0] | 		f.Go.Version = args[0] | ||||||
|  |  | ||||||
|  | 	case "toolchain": | ||||||
|  | 		if f.Toolchain != nil { | ||||||
|  | 			errorf("repeated toolchain statement") | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		if len(args) != 1 { | ||||||
|  | 			errorf("toolchain directive expects exactly one argument") | ||||||
|  | 			return | ||||||
|  | 		} else if strict && !ToolchainRE.MatchString(args[0]) { | ||||||
|  | 			errorf("invalid toolchain version '%s': must match format go1.23 or local", args[0]) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		f.Toolchain = &Toolchain{Syntax: line} | ||||||
|  | 		f.Toolchain.Name = args[0] | ||||||
|  |  | ||||||
| 	case "module": | 	case "module": | ||||||
| 		if f.Module != nil { | 		if f.Module != nil { | ||||||
| 			errorf("repeated module statement") | 			errorf("repeated module statement") | ||||||
| @@ -612,6 +638,22 @@ func (f *WorkFile) add(errs *ErrorList, line *Line, verb string, args []string, | |||||||
| 		f.Go = &Go{Syntax: line} | 		f.Go = &Go{Syntax: line} | ||||||
| 		f.Go.Version = args[0] | 		f.Go.Version = args[0] | ||||||
|  |  | ||||||
|  | 	case "toolchain": | ||||||
|  | 		if f.Toolchain != nil { | ||||||
|  | 			errorf("repeated toolchain statement") | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  | 		if len(args) != 1 { | ||||||
|  | 			errorf("toolchain directive expects exactly one argument") | ||||||
|  | 			return | ||||||
|  | 		} else if !ToolchainRE.MatchString(args[0]) { | ||||||
|  | 			errorf("invalid toolchain version '%s': must match format go1.23 or local", args[0]) | ||||||
|  | 			return | ||||||
|  | 		} | ||||||
|  |  | ||||||
|  | 		f.Toolchain = &Toolchain{Syntax: line} | ||||||
|  | 		f.Toolchain.Name = args[0] | ||||||
|  |  | ||||||
| 	case "use": | 	case "use": | ||||||
| 		if len(args) != 1 { | 		if len(args) != 1 { | ||||||
| 			errorf("usage: %s local/dir", verb) | 			errorf("usage: %s local/dir", verb) | ||||||
| @@ -926,7 +968,7 @@ func (f *File) Cleanup() { | |||||||
|  |  | ||||||
| func (f *File) AddGoStmt(version string) error { | func (f *File) AddGoStmt(version string) error { | ||||||
| 	if !GoVersionRE.MatchString(version) { | 	if !GoVersionRE.MatchString(version) { | ||||||
| 		return fmt.Errorf("invalid language version string %q", version) | 		return fmt.Errorf("invalid language version %q", version) | ||||||
| 	} | 	} | ||||||
| 	if f.Go == nil { | 	if f.Go == nil { | ||||||
| 		var hint Expr | 		var hint Expr | ||||||
| @@ -944,6 +986,44 @@ func (f *File) AddGoStmt(version string) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // DropGoStmt deletes the go statement from the file. | ||||||
|  | func (f *File) DropGoStmt() { | ||||||
|  | 	if f.Go != nil { | ||||||
|  | 		f.Go.Syntax.markRemoved() | ||||||
|  | 		f.Go = nil | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DropToolchainStmt deletes the toolchain statement from the file. | ||||||
|  | func (f *File) DropToolchainStmt() { | ||||||
|  | 	if f.Toolchain != nil { | ||||||
|  | 		f.Toolchain.Syntax.markRemoved() | ||||||
|  | 		f.Toolchain = nil | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | func (f *File) AddToolchainStmt(name string) error { | ||||||
|  | 	if !ToolchainRE.MatchString(name) { | ||||||
|  | 		return fmt.Errorf("invalid toolchain name %q", name) | ||||||
|  | 	} | ||||||
|  | 	if f.Toolchain == nil { | ||||||
|  | 		var hint Expr | ||||||
|  | 		if f.Go != nil && f.Go.Syntax != nil { | ||||||
|  | 			hint = f.Go.Syntax | ||||||
|  | 		} else if f.Module != nil && f.Module.Syntax != nil { | ||||||
|  | 			hint = f.Module.Syntax | ||||||
|  | 		} | ||||||
|  | 		f.Toolchain = &Toolchain{ | ||||||
|  | 			Name:   name, | ||||||
|  | 			Syntax: f.Syntax.addLine(hint, "toolchain", name), | ||||||
|  | 		} | ||||||
|  | 	} else { | ||||||
|  | 		f.Toolchain.Name = name | ||||||
|  | 		f.Syntax.updateLine(f.Toolchain.Syntax, "toolchain", name) | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
| // AddRequire sets the first require line for path to version vers, | // AddRequire sets the first require line for path to version vers, | ||||||
| // preserving any existing comments for that line and removing all | // preserving any existing comments for that line and removing all | ||||||
| // other lines for path. | // other lines for path. | ||||||
| @@ -1387,13 +1467,21 @@ func (f *File) DropRetract(vi VersionInterval) error { | |||||||
| func (f *File) SortBlocks() { | func (f *File) SortBlocks() { | ||||||
| 	f.removeDups() // otherwise sorting is unsafe | 	f.removeDups() // otherwise sorting is unsafe | ||||||
|  |  | ||||||
|  | 	// semanticSortForExcludeVersionV is the Go version (plus leading "v") at which | ||||||
|  | 	// lines in exclude blocks start to use semantic sort instead of lexicographic sort. | ||||||
|  | 	// See go.dev/issue/60028. | ||||||
|  | 	const semanticSortForExcludeVersionV = "v1.21" | ||||||
|  | 	useSemanticSortForExclude := f.Go != nil && semver.Compare("v"+f.Go.Version, semanticSortForExcludeVersionV) >= 0 | ||||||
|  |  | ||||||
| 	for _, stmt := range f.Syntax.Stmt { | 	for _, stmt := range f.Syntax.Stmt { | ||||||
| 		block, ok := stmt.(*LineBlock) | 		block, ok := stmt.(*LineBlock) | ||||||
| 		if !ok { | 		if !ok { | ||||||
| 			continue | 			continue | ||||||
| 		} | 		} | ||||||
| 		less := lineLess | 		less := lineLess | ||||||
| 		if block.Token[0] == "retract" { | 		if block.Token[0] == "exclude" && useSemanticSortForExclude { | ||||||
|  | 			less = lineExcludeLess | ||||||
|  | 		} else if block.Token[0] == "retract" { | ||||||
| 			less = lineRetractLess | 			less = lineRetractLess | ||||||
| 		} | 		} | ||||||
| 		sort.SliceStable(block.Line, func(i, j int) bool { | 		sort.SliceStable(block.Line, func(i, j int) bool { | ||||||
| @@ -1496,6 +1584,22 @@ func lineLess(li, lj *Line) bool { | |||||||
| 	return len(li.Token) < len(lj.Token) | 	return len(li.Token) < len(lj.Token) | ||||||
| } | } | ||||||
|  |  | ||||||
|  | // lineExcludeLess reports whether li should be sorted before lj for lines in | ||||||
|  | // an "exclude" block. | ||||||
|  | func lineExcludeLess(li, lj *Line) bool { | ||||||
|  | 	if len(li.Token) != 2 || len(lj.Token) != 2 { | ||||||
|  | 		// Not a known exclude specification. | ||||||
|  | 		// Fall back to sorting lexicographically. | ||||||
|  | 		return lineLess(li, lj) | ||||||
|  | 	} | ||||||
|  | 	// An exclude specification has two tokens: ModulePath and Version. | ||||||
|  | 	// Compare module path by string order and version by semver rules. | ||||||
|  | 	if pi, pj := li.Token[0], lj.Token[0]; pi != pj { | ||||||
|  | 		return pi < pj | ||||||
|  | 	} | ||||||
|  | 	return semver.Compare(li.Token[1], lj.Token[1]) < 0 | ||||||
|  | } | ||||||
|  |  | ||||||
| // lineRetractLess returns whether li should be sorted before lj for lines in | // lineRetractLess returns whether li should be sorted before lj for lines in | ||||||
| // a "retract" block. It treats each line as a version interval. Single versions | // a "retract" block. It treats each line as a version interval. Single versions | ||||||
| // are compared as if they were intervals with the same low and high version. | // are compared as if they were intervals with the same low and high version. | ||||||
|   | |||||||
							
								
								
									
										61
									
								
								vendor/golang.org/x/mod/modfile/work.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										61
									
								
								vendor/golang.org/x/mod/modfile/work.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -12,9 +12,10 @@ import ( | |||||||
|  |  | ||||||
| // A WorkFile is the parsed, interpreted form of a go.work file. | // A WorkFile is the parsed, interpreted form of a go.work file. | ||||||
| type WorkFile struct { | type WorkFile struct { | ||||||
| 	Go      *Go | 	Go        *Go | ||||||
| 	Use     []*Use | 	Toolchain *Toolchain | ||||||
| 	Replace []*Replace | 	Use       []*Use | ||||||
|  | 	Replace   []*Replace | ||||||
|  |  | ||||||
| 	Syntax *FileSyntax | 	Syntax *FileSyntax | ||||||
| } | } | ||||||
| @@ -109,7 +110,7 @@ func (f *WorkFile) Cleanup() { | |||||||
|  |  | ||||||
| func (f *WorkFile) AddGoStmt(version string) error { | func (f *WorkFile) AddGoStmt(version string) error { | ||||||
| 	if !GoVersionRE.MatchString(version) { | 	if !GoVersionRE.MatchString(version) { | ||||||
| 		return fmt.Errorf("invalid language version string %q", version) | 		return fmt.Errorf("invalid language version %q", version) | ||||||
| 	} | 	} | ||||||
| 	if f.Go == nil { | 	if f.Go == nil { | ||||||
| 		stmt := &Line{Token: []string{"go", version}} | 		stmt := &Line{Token: []string{"go", version}} | ||||||
| @@ -117,7 +118,7 @@ func (f *WorkFile) AddGoStmt(version string) error { | |||||||
| 			Version: version, | 			Version: version, | ||||||
| 			Syntax:  stmt, | 			Syntax:  stmt, | ||||||
| 		} | 		} | ||||||
| 		// Find the first non-comment-only block that's and add | 		// Find the first non-comment-only block and add | ||||||
| 		// the go statement before it. That will keep file comments at the top. | 		// the go statement before it. That will keep file comments at the top. | ||||||
| 		i := 0 | 		i := 0 | ||||||
| 		for i = 0; i < len(f.Syntax.Stmt); i++ { | 		for i = 0; i < len(f.Syntax.Stmt); i++ { | ||||||
| @@ -133,6 +134,56 @@ func (f *WorkFile) AddGoStmt(version string) error { | |||||||
| 	return nil | 	return nil | ||||||
| } | } | ||||||
|  |  | ||||||
|  | func (f *WorkFile) AddToolchainStmt(name string) error { | ||||||
|  | 	if !ToolchainRE.MatchString(name) { | ||||||
|  | 		return fmt.Errorf("invalid toolchain name %q", name) | ||||||
|  | 	} | ||||||
|  | 	if f.Toolchain == nil { | ||||||
|  | 		stmt := &Line{Token: []string{"toolchain", name}} | ||||||
|  | 		f.Toolchain = &Toolchain{ | ||||||
|  | 			Name:   name, | ||||||
|  | 			Syntax: stmt, | ||||||
|  | 		} | ||||||
|  | 		// Find the go line and add the toolchain line after it. | ||||||
|  | 		// Or else find the first non-comment-only block and add | ||||||
|  | 		// the toolchain line before it. That will keep file comments at the top. | ||||||
|  | 		i := 0 | ||||||
|  | 		for i = 0; i < len(f.Syntax.Stmt); i++ { | ||||||
|  | 			if line, ok := f.Syntax.Stmt[i].(*Line); ok && len(line.Token) > 0 && line.Token[0] == "go" { | ||||||
|  | 				i++ | ||||||
|  | 				goto Found | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 		for i = 0; i < len(f.Syntax.Stmt); i++ { | ||||||
|  | 			if _, ok := f.Syntax.Stmt[i].(*CommentBlock); !ok { | ||||||
|  | 				break | ||||||
|  | 			} | ||||||
|  | 		} | ||||||
|  | 	Found: | ||||||
|  | 		f.Syntax.Stmt = append(append(f.Syntax.Stmt[:i:i], stmt), f.Syntax.Stmt[i:]...) | ||||||
|  | 	} else { | ||||||
|  | 		f.Toolchain.Name = name | ||||||
|  | 		f.Syntax.updateLine(f.Toolchain.Syntax, "toolchain", name) | ||||||
|  | 	} | ||||||
|  | 	return nil | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DropGoStmt deletes the go statement from the file. | ||||||
|  | func (f *WorkFile) DropGoStmt() { | ||||||
|  | 	if f.Go != nil { | ||||||
|  | 		f.Go.Syntax.markRemoved() | ||||||
|  | 		f.Go = nil | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
|  | // DropToolchainStmt deletes the toolchain statement from the file. | ||||||
|  | func (f *WorkFile) DropToolchainStmt() { | ||||||
|  | 	if f.Toolchain != nil { | ||||||
|  | 		f.Toolchain.Syntax.markRemoved() | ||||||
|  | 		f.Toolchain = nil | ||||||
|  | 	} | ||||||
|  | } | ||||||
|  |  | ||||||
| func (f *WorkFile) AddUse(diskPath, modulePath string) error { | func (f *WorkFile) AddUse(diskPath, modulePath string) error { | ||||||
| 	need := true | 	need := true | ||||||
| 	for _, d := range f.Use { | 	for _, d := range f.Use { | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/text/cases/tables13.0.0.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/text/cases/tables13.0.0.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,7 +1,7 @@ | |||||||
| // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. | // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. | ||||||
|  |  | ||||||
| //go:build go1.16 | //go:build go1.16 && !go1.21 | ||||||
| // +build go1.16 | // +build go1.16,!go1.21 | ||||||
|  |  | ||||||
| package cases | package cases | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										2528
									
								
								vendor/golang.org/x/text/cases/tables15.0.0.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2528
									
								
								vendor/golang.org/x/text/cases/tables15.0.0.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										356
									
								
								vendor/golang.org/x/text/internal/language/compact/tables.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										356
									
								
								vendor/golang.org/x/text/internal/language/compact/tables.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -790,226 +790,226 @@ const ( | |||||||
|  |  | ||||||
| var coreTags = []language.CompactCoreInfo{ // 773 elements | var coreTags = []language.CompactCoreInfo{ // 773 elements | ||||||
| 	// Entry 0 - 1F | 	// Entry 0 - 1F | ||||||
| 	0x00000000, 0x01600000, 0x016000d2, 0x01600161, | 	0x00000000, 0x01600000, 0x016000d3, 0x01600162, | ||||||
| 	0x01c00000, 0x01c00052, 0x02100000, 0x02100080, | 	0x01c00000, 0x01c00052, 0x02100000, 0x02100081, | ||||||
| 	0x02700000, 0x0270006f, 0x03a00000, 0x03a00001, | 	0x02700000, 0x02700070, 0x03a00000, 0x03a00001, | ||||||
| 	0x03a00023, 0x03a00039, 0x03a00062, 0x03a00067, | 	0x03a00023, 0x03a00039, 0x03a00063, 0x03a00068, | ||||||
| 	0x03a0006b, 0x03a0006c, 0x03a0006d, 0x03a00097, | 	0x03a0006c, 0x03a0006d, 0x03a0006e, 0x03a00098, | ||||||
| 	0x03a0009b, 0x03a000a1, 0x03a000a8, 0x03a000ac, | 	0x03a0009c, 0x03a000a2, 0x03a000a9, 0x03a000ad, | ||||||
| 	0x03a000b0, 0x03a000b9, 0x03a000ba, 0x03a000c9, | 	0x03a000b1, 0x03a000ba, 0x03a000bb, 0x03a000ca, | ||||||
| 	0x03a000e1, 0x03a000ed, 0x03a000f3, 0x03a00108, | 	0x03a000e2, 0x03a000ee, 0x03a000f4, 0x03a00109, | ||||||
| 	// Entry 20 - 3F | 	// Entry 20 - 3F | ||||||
| 	0x03a0010b, 0x03a00115, 0x03a00117, 0x03a0011c, | 	0x03a0010c, 0x03a00116, 0x03a00118, 0x03a0011d, | ||||||
| 	0x03a00120, 0x03a00128, 0x03a0015e, 0x04000000, | 	0x03a00121, 0x03a00129, 0x03a0015f, 0x04000000, | ||||||
| 	0x04300000, 0x04300099, 0x04400000, 0x0440012f, | 	0x04300000, 0x0430009a, 0x04400000, 0x04400130, | ||||||
| 	0x04800000, 0x0480006e, 0x05800000, 0x05820000, | 	0x04800000, 0x0480006f, 0x05800000, 0x05820000, | ||||||
| 	0x05820032, 0x0585a000, 0x0585a032, 0x05e00000, | 	0x05820032, 0x0585b000, 0x0585b032, 0x05e00000, | ||||||
| 	0x05e00052, 0x07100000, 0x07100047, 0x07500000, | 	0x05e00052, 0x07100000, 0x07100047, 0x07500000, | ||||||
| 	0x07500162, 0x07900000, 0x0790012f, 0x07e00000, | 	0x07500163, 0x07900000, 0x07900130, 0x07e00000, | ||||||
| 	0x07e00038, 0x08200000, 0x0a000000, 0x0a0000c3, | 	0x07e00038, 0x08200000, 0x0a000000, 0x0a0000c4, | ||||||
| 	// Entry 40 - 5F | 	// Entry 40 - 5F | ||||||
| 	0x0a500000, 0x0a500035, 0x0a500099, 0x0a900000, | 	0x0a500000, 0x0a500035, 0x0a50009a, 0x0a900000, | ||||||
| 	0x0a900053, 0x0a900099, 0x0b200000, 0x0b200078, | 	0x0a900053, 0x0a90009a, 0x0b200000, 0x0b200079, | ||||||
| 	0x0b500000, 0x0b500099, 0x0b700000, 0x0b720000, | 	0x0b500000, 0x0b50009a, 0x0b700000, 0x0b720000, | ||||||
| 	0x0b720033, 0x0b75a000, 0x0b75a033, 0x0d700000, | 	0x0b720033, 0x0b75b000, 0x0b75b033, 0x0d700000, | ||||||
| 	0x0d700022, 0x0d70006e, 0x0d700078, 0x0d70009e, | 	0x0d700022, 0x0d70006f, 0x0d700079, 0x0d70009f, | ||||||
| 	0x0db00000, 0x0db00035, 0x0db00099, 0x0dc00000, | 	0x0db00000, 0x0db00035, 0x0db0009a, 0x0dc00000, | ||||||
| 	0x0dc00106, 0x0df00000, 0x0df00131, 0x0e500000, | 	0x0dc00107, 0x0df00000, 0x0df00132, 0x0e500000, | ||||||
| 	0x0e500135, 0x0e900000, 0x0e90009b, 0x0e90009c, | 	0x0e500136, 0x0e900000, 0x0e90009c, 0x0e90009d, | ||||||
| 	// Entry 60 - 7F | 	// Entry 60 - 7F | ||||||
| 	0x0fa00000, 0x0fa0005e, 0x0fe00000, 0x0fe00106, | 	0x0fa00000, 0x0fa0005f, 0x0fe00000, 0x0fe00107, | ||||||
| 	0x10000000, 0x1000007b, 0x10100000, 0x10100063, | 	0x10000000, 0x1000007c, 0x10100000, 0x10100064, | ||||||
| 	0x10100082, 0x10800000, 0x108000a4, 0x10d00000, | 	0x10100083, 0x10800000, 0x108000a5, 0x10d00000, | ||||||
| 	0x10d0002e, 0x10d00036, 0x10d0004e, 0x10d00060, | 	0x10d0002e, 0x10d00036, 0x10d0004e, 0x10d00061, | ||||||
| 	0x10d0009e, 0x10d000b2, 0x10d000b7, 0x11700000, | 	0x10d0009f, 0x10d000b3, 0x10d000b8, 0x11700000, | ||||||
| 	0x117000d4, 0x11f00000, 0x11f00060, 0x12400000, | 	0x117000d5, 0x11f00000, 0x11f00061, 0x12400000, | ||||||
| 	0x12400052, 0x12800000, 0x12b00000, 0x12b00114, | 	0x12400052, 0x12800000, 0x12b00000, 0x12b00115, | ||||||
| 	0x12d00000, 0x12d00043, 0x12f00000, 0x12f000a4, | 	0x12d00000, 0x12d00043, 0x12f00000, 0x12f000a5, | ||||||
| 	// Entry 80 - 9F | 	// Entry 80 - 9F | ||||||
| 	0x13000000, 0x13000080, 0x13000122, 0x13600000, | 	0x13000000, 0x13000081, 0x13000123, 0x13600000, | ||||||
| 	0x1360005d, 0x13600087, 0x13900000, 0x13900001, | 	0x1360005e, 0x13600088, 0x13900000, 0x13900001, | ||||||
| 	0x1390001a, 0x13900025, 0x13900026, 0x1390002d, | 	0x1390001a, 0x13900025, 0x13900026, 0x1390002d, | ||||||
| 	0x1390002e, 0x1390002f, 0x13900034, 0x13900036, | 	0x1390002e, 0x1390002f, 0x13900034, 0x13900036, | ||||||
| 	0x1390003a, 0x1390003d, 0x13900042, 0x13900046, | 	0x1390003a, 0x1390003d, 0x13900042, 0x13900046, | ||||||
| 	0x13900048, 0x13900049, 0x1390004a, 0x1390004e, | 	0x13900048, 0x13900049, 0x1390004a, 0x1390004e, | ||||||
| 	0x13900050, 0x13900052, 0x1390005c, 0x1390005d, | 	0x13900050, 0x13900052, 0x1390005d, 0x1390005e, | ||||||
| 	0x13900060, 0x13900061, 0x13900063, 0x13900064, | 	0x13900061, 0x13900062, 0x13900064, 0x13900065, | ||||||
| 	// Entry A0 - BF | 	// Entry A0 - BF | ||||||
| 	0x1390006d, 0x13900072, 0x13900073, 0x13900074, | 	0x1390006e, 0x13900073, 0x13900074, 0x13900075, | ||||||
| 	0x13900075, 0x1390007b, 0x1390007c, 0x1390007f, | 	0x13900076, 0x1390007c, 0x1390007d, 0x13900080, | ||||||
| 	0x13900080, 0x13900081, 0x13900083, 0x1390008a, | 	0x13900081, 0x13900082, 0x13900084, 0x1390008b, | ||||||
| 	0x1390008c, 0x1390008d, 0x13900096, 0x13900097, | 	0x1390008d, 0x1390008e, 0x13900097, 0x13900098, | ||||||
| 	0x13900098, 0x13900099, 0x1390009a, 0x1390009f, | 	0x13900099, 0x1390009a, 0x1390009b, 0x139000a0, | ||||||
| 	0x139000a0, 0x139000a4, 0x139000a7, 0x139000a9, | 	0x139000a1, 0x139000a5, 0x139000a8, 0x139000aa, | ||||||
| 	0x139000ad, 0x139000b1, 0x139000b4, 0x139000b5, | 	0x139000ae, 0x139000b2, 0x139000b5, 0x139000b6, | ||||||
| 	0x139000bf, 0x139000c0, 0x139000c6, 0x139000c7, | 	0x139000c0, 0x139000c1, 0x139000c7, 0x139000c8, | ||||||
| 	// Entry C0 - DF | 	// Entry C0 - DF | ||||||
| 	0x139000ca, 0x139000cb, 0x139000cc, 0x139000ce, | 	0x139000cb, 0x139000cc, 0x139000cd, 0x139000cf, | ||||||
| 	0x139000d0, 0x139000d2, 0x139000d5, 0x139000d6, | 	0x139000d1, 0x139000d3, 0x139000d6, 0x139000d7, | ||||||
| 	0x139000d9, 0x139000dd, 0x139000df, 0x139000e0, | 	0x139000da, 0x139000de, 0x139000e0, 0x139000e1, | ||||||
| 	0x139000e6, 0x139000e7, 0x139000e8, 0x139000eb, | 	0x139000e7, 0x139000e8, 0x139000e9, 0x139000ec, | ||||||
| 	0x139000ec, 0x139000f0, 0x13900107, 0x13900109, | 	0x139000ed, 0x139000f1, 0x13900108, 0x1390010a, | ||||||
| 	0x1390010a, 0x1390010b, 0x1390010c, 0x1390010d, | 	0x1390010b, 0x1390010c, 0x1390010d, 0x1390010e, | ||||||
| 	0x1390010e, 0x1390010f, 0x13900112, 0x13900117, | 	0x1390010f, 0x13900110, 0x13900113, 0x13900118, | ||||||
| 	0x1390011b, 0x1390011d, 0x1390011f, 0x13900125, | 	0x1390011c, 0x1390011e, 0x13900120, 0x13900126, | ||||||
| 	// Entry E0 - FF | 	// Entry E0 - FF | ||||||
| 	0x13900129, 0x1390012c, 0x1390012d, 0x1390012f, | 	0x1390012a, 0x1390012d, 0x1390012e, 0x13900130, | ||||||
| 	0x13900131, 0x13900133, 0x13900135, 0x13900139, | 	0x13900132, 0x13900134, 0x13900136, 0x1390013a, | ||||||
| 	0x1390013c, 0x1390013d, 0x1390013f, 0x13900142, | 	0x1390013d, 0x1390013e, 0x13900140, 0x13900143, | ||||||
| 	0x13900161, 0x13900162, 0x13900164, 0x13c00000, | 	0x13900162, 0x13900163, 0x13900165, 0x13c00000, | ||||||
| 	0x13c00001, 0x13e00000, 0x13e0001f, 0x13e0002c, | 	0x13c00001, 0x13e00000, 0x13e0001f, 0x13e0002c, | ||||||
| 	0x13e0003f, 0x13e00041, 0x13e00048, 0x13e00051, | 	0x13e0003f, 0x13e00041, 0x13e00048, 0x13e00051, | ||||||
| 	0x13e00054, 0x13e00056, 0x13e00059, 0x13e00065, | 	0x13e00054, 0x13e00057, 0x13e0005a, 0x13e00066, | ||||||
| 	0x13e00068, 0x13e00069, 0x13e0006e, 0x13e00086, | 	0x13e00069, 0x13e0006a, 0x13e0006f, 0x13e00087, | ||||||
| 	// Entry 100 - 11F | 	// Entry 100 - 11F | ||||||
| 	0x13e00089, 0x13e0008f, 0x13e00094, 0x13e000cf, | 	0x13e0008a, 0x13e00090, 0x13e00095, 0x13e000d0, | ||||||
| 	0x13e000d8, 0x13e000e2, 0x13e000e4, 0x13e000e7, | 	0x13e000d9, 0x13e000e3, 0x13e000e5, 0x13e000e8, | ||||||
| 	0x13e000ec, 0x13e000f1, 0x13e0011a, 0x13e00135, | 	0x13e000ed, 0x13e000f2, 0x13e0011b, 0x13e00136, | ||||||
| 	0x13e00136, 0x13e0013b, 0x14000000, 0x1400006a, | 	0x13e00137, 0x13e0013c, 0x14000000, 0x1400006b, | ||||||
| 	0x14500000, 0x1450006e, 0x14600000, 0x14600052, | 	0x14500000, 0x1450006f, 0x14600000, 0x14600052, | ||||||
| 	0x14800000, 0x14800024, 0x1480009c, 0x14e00000, | 	0x14800000, 0x14800024, 0x1480009d, 0x14e00000, | ||||||
| 	0x14e00052, 0x14e00084, 0x14e000c9, 0x14e00114, | 	0x14e00052, 0x14e00085, 0x14e000ca, 0x14e00115, | ||||||
| 	0x15100000, 0x15100072, 0x15300000, 0x153000e7, | 	0x15100000, 0x15100073, 0x15300000, 0x153000e8, | ||||||
| 	// Entry 120 - 13F | 	// Entry 120 - 13F | ||||||
| 	0x15800000, 0x15800063, 0x15800076, 0x15e00000, | 	0x15800000, 0x15800064, 0x15800077, 0x15e00000, | ||||||
| 	0x15e00036, 0x15e00037, 0x15e0003a, 0x15e0003b, | 	0x15e00036, 0x15e00037, 0x15e0003a, 0x15e0003b, | ||||||
| 	0x15e0003c, 0x15e00049, 0x15e0004b, 0x15e0004c, | 	0x15e0003c, 0x15e00049, 0x15e0004b, 0x15e0004c, | ||||||
| 	0x15e0004d, 0x15e0004e, 0x15e0004f, 0x15e00052, | 	0x15e0004d, 0x15e0004e, 0x15e0004f, 0x15e00052, | ||||||
| 	0x15e00062, 0x15e00067, 0x15e00078, 0x15e0007a, | 	0x15e00063, 0x15e00068, 0x15e00079, 0x15e0007b, | ||||||
| 	0x15e0007e, 0x15e00084, 0x15e00085, 0x15e00086, | 	0x15e0007f, 0x15e00085, 0x15e00086, 0x15e00087, | ||||||
| 	0x15e00091, 0x15e000a8, 0x15e000b7, 0x15e000ba, | 	0x15e00092, 0x15e000a9, 0x15e000b8, 0x15e000bb, | ||||||
| 	0x15e000bb, 0x15e000be, 0x15e000bf, 0x15e000c3, | 	0x15e000bc, 0x15e000bf, 0x15e000c0, 0x15e000c4, | ||||||
| 	// Entry 140 - 15F | 	// Entry 140 - 15F | ||||||
| 	0x15e000c8, 0x15e000c9, 0x15e000cc, 0x15e000d3, | 	0x15e000c9, 0x15e000ca, 0x15e000cd, 0x15e000d4, | ||||||
| 	0x15e000d4, 0x15e000e5, 0x15e000ea, 0x15e00102, | 	0x15e000d5, 0x15e000e6, 0x15e000eb, 0x15e00103, | ||||||
| 	0x15e00107, 0x15e0010a, 0x15e00114, 0x15e0011c, | 	0x15e00108, 0x15e0010b, 0x15e00115, 0x15e0011d, | ||||||
| 	0x15e00120, 0x15e00122, 0x15e00128, 0x15e0013f, | 	0x15e00121, 0x15e00123, 0x15e00129, 0x15e00140, | ||||||
| 	0x15e00140, 0x15e0015f, 0x16900000, 0x1690009e, | 	0x15e00141, 0x15e00160, 0x16900000, 0x1690009f, | ||||||
| 	0x16d00000, 0x16d000d9, 0x16e00000, 0x16e00096, | 	0x16d00000, 0x16d000da, 0x16e00000, 0x16e00097, | ||||||
| 	0x17e00000, 0x17e0007b, 0x19000000, 0x1900006e, | 	0x17e00000, 0x17e0007c, 0x19000000, 0x1900006f, | ||||||
| 	0x1a300000, 0x1a30004e, 0x1a300078, 0x1a3000b2, | 	0x1a300000, 0x1a30004e, 0x1a300079, 0x1a3000b3, | ||||||
| 	// Entry 160 - 17F | 	// Entry 160 - 17F | ||||||
| 	0x1a400000, 0x1a400099, 0x1a900000, 0x1ab00000, | 	0x1a400000, 0x1a40009a, 0x1a900000, 0x1ab00000, | ||||||
| 	0x1ab000a4, 0x1ac00000, 0x1ac00098, 0x1b400000, | 	0x1ab000a5, 0x1ac00000, 0x1ac00099, 0x1b400000, | ||||||
| 	0x1b400080, 0x1b4000d4, 0x1b4000d6, 0x1b800000, | 	0x1b400081, 0x1b4000d5, 0x1b4000d7, 0x1b800000, | ||||||
| 	0x1b800135, 0x1bc00000, 0x1bc00097, 0x1be00000, | 	0x1b800136, 0x1bc00000, 0x1bc00098, 0x1be00000, | ||||||
| 	0x1be00099, 0x1d100000, 0x1d100033, 0x1d100090, | 	0x1be0009a, 0x1d100000, 0x1d100033, 0x1d100091, | ||||||
| 	0x1d200000, 0x1d200060, 0x1d500000, 0x1d500092, | 	0x1d200000, 0x1d200061, 0x1d500000, 0x1d500093, | ||||||
| 	0x1d700000, 0x1d700028, 0x1e100000, 0x1e100095, | 	0x1d700000, 0x1d700028, 0x1e100000, 0x1e100096, | ||||||
| 	0x1e700000, 0x1e7000d6, 0x1ea00000, 0x1ea00053, | 	0x1e700000, 0x1e7000d7, 0x1ea00000, 0x1ea00053, | ||||||
| 	// Entry 180 - 19F | 	// Entry 180 - 19F | ||||||
| 	0x1f300000, 0x1f500000, 0x1f800000, 0x1f80009d, | 	0x1f300000, 0x1f500000, 0x1f800000, 0x1f80009e, | ||||||
| 	0x1f900000, 0x1f90004e, 0x1f90009e, 0x1f900113, | 	0x1f900000, 0x1f90004e, 0x1f90009f, 0x1f900114, | ||||||
| 	0x1f900138, 0x1fa00000, 0x1fb00000, 0x20000000, | 	0x1f900139, 0x1fa00000, 0x1fb00000, 0x20000000, | ||||||
| 	0x200000a2, 0x20300000, 0x20700000, 0x20700052, | 	0x200000a3, 0x20300000, 0x20700000, 0x20700052, | ||||||
| 	0x20800000, 0x20a00000, 0x20a0012f, 0x20e00000, | 	0x20800000, 0x20a00000, 0x20a00130, 0x20e00000, | ||||||
| 	0x20f00000, 0x21000000, 0x2100007d, 0x21200000, | 	0x20f00000, 0x21000000, 0x2100007e, 0x21200000, | ||||||
| 	0x21200067, 0x21600000, 0x21700000, 0x217000a4, | 	0x21200068, 0x21600000, 0x21700000, 0x217000a5, | ||||||
| 	0x21f00000, 0x22300000, 0x2230012f, 0x22700000, | 	0x21f00000, 0x22300000, 0x22300130, 0x22700000, | ||||||
| 	// Entry 1A0 - 1BF | 	// Entry 1A0 - 1BF | ||||||
| 	0x2270005a, 0x23400000, 0x234000c3, 0x23900000, | 	0x2270005b, 0x23400000, 0x234000c4, 0x23900000, | ||||||
| 	0x239000a4, 0x24200000, 0x242000ae, 0x24400000, | 	0x239000a5, 0x24200000, 0x242000af, 0x24400000, | ||||||
| 	0x24400052, 0x24500000, 0x24500082, 0x24600000, | 	0x24400052, 0x24500000, 0x24500083, 0x24600000, | ||||||
| 	0x246000a4, 0x24a00000, 0x24a000a6, 0x25100000, | 	0x246000a5, 0x24a00000, 0x24a000a7, 0x25100000, | ||||||
| 	0x25100099, 0x25400000, 0x254000aa, 0x254000ab, | 	0x2510009a, 0x25400000, 0x254000ab, 0x254000ac, | ||||||
| 	0x25600000, 0x25600099, 0x26a00000, 0x26a00099, | 	0x25600000, 0x2560009a, 0x26a00000, 0x26a0009a, | ||||||
| 	0x26b00000, 0x26b0012f, 0x26d00000, 0x26d00052, | 	0x26b00000, 0x26b00130, 0x26d00000, 0x26d00052, | ||||||
| 	0x26e00000, 0x26e00060, 0x27400000, 0x28100000, | 	0x26e00000, 0x26e00061, 0x27400000, 0x28100000, | ||||||
| 	// Entry 1C0 - 1DF | 	// Entry 1C0 - 1DF | ||||||
| 	0x2810007b, 0x28a00000, 0x28a000a5, 0x29100000, | 	0x2810007c, 0x28a00000, 0x28a000a6, 0x29100000, | ||||||
| 	0x2910012f, 0x29500000, 0x295000b7, 0x2a300000, | 	0x29100130, 0x29500000, 0x295000b8, 0x2a300000, | ||||||
| 	0x2a300131, 0x2af00000, 0x2af00135, 0x2b500000, | 	0x2a300132, 0x2af00000, 0x2af00136, 0x2b500000, | ||||||
| 	0x2b50002a, 0x2b50004b, 0x2b50004c, 0x2b50004d, | 	0x2b50002a, 0x2b50004b, 0x2b50004c, 0x2b50004d, | ||||||
| 	0x2b800000, 0x2b8000af, 0x2bf00000, 0x2bf0009b, | 	0x2b800000, 0x2b8000b0, 0x2bf00000, 0x2bf0009c, | ||||||
| 	0x2bf0009c, 0x2c000000, 0x2c0000b6, 0x2c200000, | 	0x2bf0009d, 0x2c000000, 0x2c0000b7, 0x2c200000, | ||||||
| 	0x2c20004b, 0x2c400000, 0x2c4000a4, 0x2c500000, | 	0x2c20004b, 0x2c400000, 0x2c4000a5, 0x2c500000, | ||||||
| 	0x2c5000a4, 0x2c700000, 0x2c7000b8, 0x2d100000, | 	0x2c5000a5, 0x2c700000, 0x2c7000b9, 0x2d100000, | ||||||
| 	// Entry 1E0 - 1FF | 	// Entry 1E0 - 1FF | ||||||
| 	0x2d1000a4, 0x2d10012f, 0x2e900000, 0x2e9000a4, | 	0x2d1000a5, 0x2d100130, 0x2e900000, 0x2e9000a5, | ||||||
| 	0x2ed00000, 0x2ed000cc, 0x2f100000, 0x2f1000bf, | 	0x2ed00000, 0x2ed000cd, 0x2f100000, 0x2f1000c0, | ||||||
| 	0x2f200000, 0x2f2000d1, 0x2f400000, 0x2f400052, | 	0x2f200000, 0x2f2000d2, 0x2f400000, 0x2f400052, | ||||||
| 	0x2ff00000, 0x2ff000c2, 0x30400000, 0x30400099, | 	0x2ff00000, 0x2ff000c3, 0x30400000, 0x3040009a, | ||||||
| 	0x30b00000, 0x30b000c5, 0x31000000, 0x31b00000, | 	0x30b00000, 0x30b000c6, 0x31000000, 0x31b00000, | ||||||
| 	0x31b00099, 0x31f00000, 0x31f0003e, 0x31f000d0, | 	0x31b0009a, 0x31f00000, 0x31f0003e, 0x31f000d1, | ||||||
| 	0x31f0010d, 0x32000000, 0x320000cb, 0x32500000, | 	0x31f0010e, 0x32000000, 0x320000cc, 0x32500000, | ||||||
| 	0x32500052, 0x33100000, 0x331000c4, 0x33a00000, | 	0x32500052, 0x33100000, 0x331000c5, 0x33a00000, | ||||||
| 	// Entry 200 - 21F | 	// Entry 200 - 21F | ||||||
| 	0x33a0009c, 0x34100000, 0x34500000, 0x345000d2, | 	0x33a0009d, 0x34100000, 0x34500000, 0x345000d3, | ||||||
| 	0x34700000, 0x347000da, 0x34700110, 0x34e00000, | 	0x34700000, 0x347000db, 0x34700111, 0x34e00000, | ||||||
| 	0x34e00164, 0x35000000, 0x35000060, 0x350000d9, | 	0x34e00165, 0x35000000, 0x35000061, 0x350000da, | ||||||
| 	0x35100000, 0x35100099, 0x351000db, 0x36700000, | 	0x35100000, 0x3510009a, 0x351000dc, 0x36700000, | ||||||
| 	0x36700030, 0x36700036, 0x36700040, 0x3670005b, | 	0x36700030, 0x36700036, 0x36700040, 0x3670005c, | ||||||
| 	0x367000d9, 0x36700116, 0x3670011b, 0x36800000, | 	0x367000da, 0x36700117, 0x3670011c, 0x36800000, | ||||||
| 	0x36800052, 0x36a00000, 0x36a000da, 0x36c00000, | 	0x36800052, 0x36a00000, 0x36a000db, 0x36c00000, | ||||||
| 	0x36c00052, 0x36f00000, 0x37500000, 0x37600000, | 	0x36c00052, 0x36f00000, 0x37500000, 0x37600000, | ||||||
| 	// Entry 220 - 23F | 	// Entry 220 - 23F | ||||||
| 	0x37a00000, 0x38000000, 0x38000117, 0x38700000, | 	0x37a00000, 0x38000000, 0x38000118, 0x38700000, | ||||||
| 	0x38900000, 0x38900131, 0x39000000, 0x3900006f, | 	0x38900000, 0x38900132, 0x39000000, 0x39000070, | ||||||
| 	0x390000a4, 0x39500000, 0x39500099, 0x39800000, | 	0x390000a5, 0x39500000, 0x3950009a, 0x39800000, | ||||||
| 	0x3980007d, 0x39800106, 0x39d00000, 0x39d05000, | 	0x3980007e, 0x39800107, 0x39d00000, 0x39d05000, | ||||||
| 	0x39d050e8, 0x39d36000, 0x39d36099, 0x3a100000, | 	0x39d050e9, 0x39d36000, 0x39d3609a, 0x3a100000, | ||||||
| 	0x3b300000, 0x3b3000e9, 0x3bd00000, 0x3bd00001, | 	0x3b300000, 0x3b3000ea, 0x3bd00000, 0x3bd00001, | ||||||
| 	0x3be00000, 0x3be00024, 0x3c000000, 0x3c00002a, | 	0x3be00000, 0x3be00024, 0x3c000000, 0x3c00002a, | ||||||
| 	0x3c000041, 0x3c00004e, 0x3c00005a, 0x3c000086, | 	0x3c000041, 0x3c00004e, 0x3c00005b, 0x3c000087, | ||||||
| 	// Entry 240 - 25F | 	// Entry 240 - 25F | ||||||
| 	0x3c00008b, 0x3c0000b7, 0x3c0000c6, 0x3c0000d1, | 	0x3c00008c, 0x3c0000b8, 0x3c0000c7, 0x3c0000d2, | ||||||
| 	0x3c0000ee, 0x3c000118, 0x3c000126, 0x3c400000, | 	0x3c0000ef, 0x3c000119, 0x3c000127, 0x3c400000, | ||||||
| 	0x3c40003f, 0x3c400069, 0x3c4000e4, 0x3d400000, | 	0x3c40003f, 0x3c40006a, 0x3c4000e5, 0x3d400000, | ||||||
| 	0x3d40004e, 0x3d900000, 0x3d90003a, 0x3dc00000, | 	0x3d40004e, 0x3d900000, 0x3d90003a, 0x3dc00000, | ||||||
| 	0x3dc000bc, 0x3dc00104, 0x3de00000, 0x3de0012f, | 	0x3dc000bd, 0x3dc00105, 0x3de00000, 0x3de00130, | ||||||
| 	0x3e200000, 0x3e200047, 0x3e2000a5, 0x3e2000ae, | 	0x3e200000, 0x3e200047, 0x3e2000a6, 0x3e2000af, | ||||||
| 	0x3e2000bc, 0x3e200106, 0x3e200130, 0x3e500000, | 	0x3e2000bd, 0x3e200107, 0x3e200131, 0x3e500000, | ||||||
| 	0x3e500107, 0x3e600000, 0x3e60012f, 0x3eb00000, | 	0x3e500108, 0x3e600000, 0x3e600130, 0x3eb00000, | ||||||
| 	// Entry 260 - 27F | 	// Entry 260 - 27F | ||||||
| 	0x3eb00106, 0x3ec00000, 0x3ec000a4, 0x3f300000, | 	0x3eb00107, 0x3ec00000, 0x3ec000a5, 0x3f300000, | ||||||
| 	0x3f30012f, 0x3fa00000, 0x3fa000e8, 0x3fc00000, | 	0x3f300130, 0x3fa00000, 0x3fa000e9, 0x3fc00000, | ||||||
| 	0x3fd00000, 0x3fd00072, 0x3fd000da, 0x3fd0010c, | 	0x3fd00000, 0x3fd00073, 0x3fd000db, 0x3fd0010d, | ||||||
| 	0x3ff00000, 0x3ff000d1, 0x40100000, 0x401000c3, | 	0x3ff00000, 0x3ff000d2, 0x40100000, 0x401000c4, | ||||||
| 	0x40200000, 0x4020004c, 0x40700000, 0x40800000, | 	0x40200000, 0x4020004c, 0x40700000, 0x40800000, | ||||||
| 	0x4085a000, 0x4085a0ba, 0x408e8000, 0x408e80ba, | 	0x4085b000, 0x4085b0bb, 0x408eb000, 0x408eb0bb, | ||||||
| 	0x40c00000, 0x40c000b3, 0x41200000, 0x41200111, | 	0x40c00000, 0x40c000b4, 0x41200000, 0x41200112, | ||||||
| 	0x41600000, 0x4160010f, 0x41c00000, 0x41d00000, | 	0x41600000, 0x41600110, 0x41c00000, 0x41d00000, | ||||||
| 	// Entry 280 - 29F | 	// Entry 280 - 29F | ||||||
| 	0x41e00000, 0x41f00000, 0x41f00072, 0x42200000, | 	0x41e00000, 0x41f00000, 0x41f00073, 0x42200000, | ||||||
| 	0x42300000, 0x42300164, 0x42900000, 0x42900062, | 	0x42300000, 0x42300165, 0x42900000, 0x42900063, | ||||||
| 	0x4290006f, 0x429000a4, 0x42900115, 0x43100000, | 	0x42900070, 0x429000a5, 0x42900116, 0x43100000, | ||||||
| 	0x43100027, 0x431000c2, 0x4310014d, 0x43200000, | 	0x43100027, 0x431000c3, 0x4310014e, 0x43200000, | ||||||
| 	0x43220000, 0x43220033, 0x432200bd, 0x43220105, | 	0x43220000, 0x43220033, 0x432200be, 0x43220106, | ||||||
| 	0x4322014d, 0x4325a000, 0x4325a033, 0x4325a0bd, | 	0x4322014e, 0x4325b000, 0x4325b033, 0x4325b0be, | ||||||
| 	0x4325a105, 0x4325a14d, 0x43700000, 0x43a00000, | 	0x4325b106, 0x4325b14e, 0x43700000, 0x43a00000, | ||||||
| 	0x43b00000, 0x44400000, 0x44400031, 0x44400072, | 	0x43b00000, 0x44400000, 0x44400031, 0x44400073, | ||||||
| 	// Entry 2A0 - 2BF | 	// Entry 2A0 - 2BF | ||||||
| 	0x4440010c, 0x44500000, 0x4450004b, 0x445000a4, | 	0x4440010d, 0x44500000, 0x4450004b, 0x445000a5, | ||||||
| 	0x4450012f, 0x44500131, 0x44e00000, 0x45000000, | 	0x44500130, 0x44500132, 0x44e00000, 0x45000000, | ||||||
| 	0x45000099, 0x450000b3, 0x450000d0, 0x4500010d, | 	0x4500009a, 0x450000b4, 0x450000d1, 0x4500010e, | ||||||
| 	0x46100000, 0x46100099, 0x46400000, 0x464000a4, | 	0x46100000, 0x4610009a, 0x46400000, 0x464000a5, | ||||||
| 	0x46400131, 0x46700000, 0x46700124, 0x46b00000, | 	0x46400132, 0x46700000, 0x46700125, 0x46b00000, | ||||||
| 	0x46b00123, 0x46f00000, 0x46f0006d, 0x46f0006f, | 	0x46b00124, 0x46f00000, 0x46f0006e, 0x46f00070, | ||||||
| 	0x47100000, 0x47600000, 0x47600127, 0x47a00000, | 	0x47100000, 0x47600000, 0x47600128, 0x47a00000, | ||||||
| 	0x48000000, 0x48200000, 0x48200129, 0x48a00000, | 	0x48000000, 0x48200000, 0x4820012a, 0x48a00000, | ||||||
| 	// Entry 2C0 - 2DF | 	// Entry 2C0 - 2DF | ||||||
| 	0x48a0005d, 0x48a0012b, 0x48e00000, 0x49400000, | 	0x48a0005e, 0x48a0012c, 0x48e00000, 0x49400000, | ||||||
| 	0x49400106, 0x4a400000, 0x4a4000d4, 0x4a900000, | 	0x49400107, 0x4a400000, 0x4a4000d5, 0x4a900000, | ||||||
| 	0x4a9000ba, 0x4ac00000, 0x4ac00053, 0x4ae00000, | 	0x4a9000bb, 0x4ac00000, 0x4ac00053, 0x4ae00000, | ||||||
| 	0x4ae00130, 0x4b400000, 0x4b400099, 0x4b4000e8, | 	0x4ae00131, 0x4b400000, 0x4b40009a, 0x4b4000e9, | ||||||
| 	0x4bc00000, 0x4bc05000, 0x4bc05024, 0x4bc20000, | 	0x4bc00000, 0x4bc05000, 0x4bc05024, 0x4bc20000, | ||||||
| 	0x4bc20137, 0x4bc5a000, 0x4bc5a137, 0x4be00000, | 	0x4bc20138, 0x4bc5b000, 0x4bc5b138, 0x4be00000, | ||||||
| 	0x4be5a000, 0x4be5a0b4, 0x4bef1000, 0x4bef10b4, | 	0x4be5b000, 0x4be5b0b5, 0x4bef4000, 0x4bef40b5, | ||||||
| 	0x4c000000, 0x4c300000, 0x4c30013e, 0x4c900000, | 	0x4c000000, 0x4c300000, 0x4c30013f, 0x4c900000, | ||||||
| 	// Entry 2E0 - 2FF | 	// Entry 2E0 - 2FF | ||||||
| 	0x4c900001, 0x4cc00000, 0x4cc0012f, 0x4ce00000, | 	0x4c900001, 0x4cc00000, 0x4cc00130, 0x4ce00000, | ||||||
| 	0x4cf00000, 0x4cf0004e, 0x4e500000, 0x4e500114, | 	0x4cf00000, 0x4cf0004e, 0x4e500000, 0x4e500115, | ||||||
| 	0x4f200000, 0x4fb00000, 0x4fb00131, 0x50900000, | 	0x4f200000, 0x4fb00000, 0x4fb00132, 0x50900000, | ||||||
| 	0x50900052, 0x51200000, 0x51200001, 0x51800000, | 	0x50900052, 0x51200000, 0x51200001, 0x51800000, | ||||||
| 	0x5180003b, 0x518000d6, 0x51f00000, 0x51f3b000, | 	0x5180003b, 0x518000d7, 0x51f00000, 0x51f3b000, | ||||||
| 	0x51f3b053, 0x51f3c000, 0x51f3c08d, 0x52800000, | 	0x51f3b053, 0x51f3c000, 0x51f3c08e, 0x52800000, | ||||||
| 	0x528000ba, 0x52900000, 0x5293b000, 0x5293b053, | 	0x528000bb, 0x52900000, 0x5293b000, 0x5293b053, | ||||||
| 	0x5293b08d, 0x5293b0c6, 0x5293b10d, 0x5293c000, | 	0x5293b08e, 0x5293b0c7, 0x5293b10e, 0x5293c000, | ||||||
| 	// Entry 300 - 31F | 	// Entry 300 - 31F | ||||||
| 	0x5293c08d, 0x5293c0c6, 0x5293c12e, 0x52f00000, | 	0x5293c08e, 0x5293c0c7, 0x5293c12f, 0x52f00000, | ||||||
| 	0x52f00161, | 	0x52f00162, | ||||||
| } // Size: 3116 bytes | } // Size: 3116 bytes | ||||||
|  |  | ||||||
| const specialTagsStr string = "ca-ES-valencia en-US-u-va-posix" | const specialTagsStr string = "ca-ES-valencia en-US-u-va-posix" | ||||||
|  |  | ||||||
| // Total table size 3147 bytes (3KiB); checksum: 6772C83C | // Total table size 3147 bytes (3KiB); checksum: 5A8FFFA5 | ||||||
|   | |||||||
							
								
								
									
										4682
									
								
								vendor/golang.org/x/text/internal/language/tables.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4682
									
								
								vendor/golang.org/x/text/internal/language/tables.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										146
									
								
								vendor/golang.org/x/text/language/tables.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										146
									
								
								vendor/golang.org/x/text/language/tables.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -23,31 +23,31 @@ const ( | |||||||
| 	_419 = 31 | 	_419 = 31 | ||||||
| 	_BR  = 65 | 	_BR  = 65 | ||||||
| 	_CA  = 73 | 	_CA  = 73 | ||||||
| 	_ES  = 110 | 	_ES  = 111 | ||||||
| 	_GB  = 123 | 	_GB  = 124 | ||||||
| 	_MD  = 188 | 	_MD  = 189 | ||||||
| 	_PT  = 238 | 	_PT  = 239 | ||||||
| 	_UK  = 306 | 	_UK  = 307 | ||||||
| 	_US  = 309 | 	_US  = 310 | ||||||
| 	_ZZ  = 357 | 	_ZZ  = 358 | ||||||
| 	_XA  = 323 | 	_XA  = 324 | ||||||
| 	_XC  = 325 | 	_XC  = 326 | ||||||
| 	_XK  = 333 | 	_XK  = 334 | ||||||
| ) | ) | ||||||
| const ( | const ( | ||||||
| 	_Latn = 90 | 	_Latn = 91 | ||||||
| 	_Hani = 57 | 	_Hani = 57 | ||||||
| 	_Hans = 59 | 	_Hans = 59 | ||||||
| 	_Hant = 60 | 	_Hant = 60 | ||||||
| 	_Qaaa = 147 | 	_Qaaa = 149 | ||||||
| 	_Qaai = 155 | 	_Qaai = 157 | ||||||
| 	_Qabx = 196 | 	_Qabx = 198 | ||||||
| 	_Zinh = 252 | 	_Zinh = 255 | ||||||
| 	_Zyyy = 257 | 	_Zyyy = 260 | ||||||
| 	_Zzzz = 258 | 	_Zzzz = 261 | ||||||
| ) | ) | ||||||
|  |  | ||||||
| var regionToGroups = []uint8{ // 358 elements | var regionToGroups = []uint8{ // 359 elements | ||||||
| 	// Entry 0 - 3F | 	// Entry 0 - 3F | ||||||
| 	0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, | 	0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x04, | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, | 	0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x04, 0x00, | ||||||
| @@ -60,51 +60,51 @@ var regionToGroups = []uint8{ // 358 elements | |||||||
| 	// Entry 40 - 7F | 	// Entry 40 - 7F | ||||||
| 	0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, | 	0x04, 0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
| 	0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 	0x04, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
| 	0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, | 	0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, | ||||||
| 	0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, |  | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x08, |  | ||||||
| 	0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, 0x00, |  | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, |  | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, |  | ||||||
| 	// Entry 80 - BF |  | ||||||
| 	0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, 0x00, |  | ||||||
| 	0x00, 0x04, 0x01, 0x00, 0x04, 0x02, 0x00, 0x04, |  | ||||||
| 	0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |  | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |  | ||||||
| 	0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |  | ||||||
| 	0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, |  | ||||||
| 	0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |  | ||||||
| 	0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, |  | ||||||
| 	// Entry C0 - FF |  | ||||||
| 	0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, 0x01, |  | ||||||
| 	0x04, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, 0x04, |  | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |  | ||||||
| 	0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, |  | ||||||
| 	0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, | 	0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, 0x00, | ||||||
| 	0x00, 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, 0x00, | 	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x04, 0x00, | ||||||
|  | 	0x08, 0x00, 0x04, 0x00, 0x00, 0x08, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, 0x04, | ||||||
|  | 	// Entry 80 - BF | ||||||
|  | 	0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x04, 0x00, | ||||||
|  | 	0x00, 0x00, 0x04, 0x01, 0x00, 0x04, 0x02, 0x00, | ||||||
|  | 	0x04, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
| 	0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 	0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x04, 0x00, | ||||||
|  | 	0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x08, 0x08, 0x00, 0x00, 0x00, 0x04, | ||||||
|  | 	// Entry C0 - FF | ||||||
|  | 	0x00, 0x01, 0x00, 0x00, 0x00, 0x00, 0x00, 0x02, | ||||||
|  | 	0x01, 0x04, 0x08, 0x04, 0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x04, 0x00, 0x04, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x00, 0x04, 0x00, 0x05, 0x00, 0x00, | ||||||
|  | 	0x00, 0x00, 0x04, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
| 	// Entry 100 - 13F | 	// Entry 100 - 13F | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, 0x00, | 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x04, | ||||||
| 	0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, 0x04, | 	0x00, 0x00, 0x00, 0x04, 0x04, 0x00, 0x00, 0x00, | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 	0x04, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
| 	0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, 0x00, | 	0x00, 0x08, 0x00, 0x00, 0x00, 0x04, 0x00, 0x00, | ||||||
| 	0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x04, 0x00, | 	0x00, 0x00, 0x00, 0x00, 0x01, 0x00, 0x05, 0x04, | ||||||
| 	0x00, 0x04, 0x00, 0x04, 0x04, 0x05, 0x00, 0x00, | 	0x00, 0x00, 0x04, 0x00, 0x04, 0x04, 0x05, 0x00, | ||||||
| 	// Entry 140 - 17F | 	// Entry 140 - 17F | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
| 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | 	0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, | ||||||
| } // Size: 382 bytes | } // Size: 383 bytes | ||||||
|  |  | ||||||
| var paradigmLocales = [][3]uint16{ // 3 elements | var paradigmLocales = [][3]uint16{ // 3 elements | ||||||
| 	0: [3]uint16{0x139, 0x0, 0x7b}, | 	0: [3]uint16{0x139, 0x0, 0x7c}, | ||||||
| 	1: [3]uint16{0x13e, 0x0, 0x1f}, | 	1: [3]uint16{0x13e, 0x0, 0x1f}, | ||||||
| 	2: [3]uint16{0x3c0, 0x41, 0xee}, | 	2: [3]uint16{0x3c0, 0x41, 0xef}, | ||||||
| } // Size: 42 bytes | } // Size: 42 bytes | ||||||
|  |  | ||||||
| type mutualIntelligibility struct { | type mutualIntelligibility struct { | ||||||
| @@ -249,30 +249,30 @@ var matchLang = []mutualIntelligibility{ // 113 elements | |||||||
| // matchScript holds pairs of scriptIDs where readers of one script | // matchScript holds pairs of scriptIDs where readers of one script | ||||||
| // can typically also read the other. Each is associated with a confidence. | // can typically also read the other. Each is associated with a confidence. | ||||||
| var matchScript = []scriptIntelligibility{ // 26 elements | var matchScript = []scriptIntelligibility{ // 26 elements | ||||||
| 	0:  {wantLang: 0x432, haveLang: 0x432, wantScript: 0x5a, haveScript: 0x20, distance: 0x5}, | 	0:  {wantLang: 0x432, haveLang: 0x432, wantScript: 0x5b, haveScript: 0x20, distance: 0x5}, | ||||||
| 	1:  {wantLang: 0x432, haveLang: 0x432, wantScript: 0x20, haveScript: 0x5a, distance: 0x5}, | 	1:  {wantLang: 0x432, haveLang: 0x432, wantScript: 0x20, haveScript: 0x5b, distance: 0x5}, | ||||||
| 	2:  {wantLang: 0x58, haveLang: 0x3e2, wantScript: 0x5a, haveScript: 0x20, distance: 0xa}, | 	2:  {wantLang: 0x58, haveLang: 0x3e2, wantScript: 0x5b, haveScript: 0x20, distance: 0xa}, | ||||||
| 	3:  {wantLang: 0xa5, haveLang: 0x139, wantScript: 0xe, haveScript: 0x5a, distance: 0xa}, | 	3:  {wantLang: 0xa5, haveLang: 0x139, wantScript: 0xe, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	4:  {wantLang: 0x1d7, haveLang: 0x3e2, wantScript: 0x8, haveScript: 0x20, distance: 0xa}, | 	4:  {wantLang: 0x1d7, haveLang: 0x3e2, wantScript: 0x8, haveScript: 0x20, distance: 0xa}, | ||||||
| 	5:  {wantLang: 0x210, haveLang: 0x139, wantScript: 0x2e, haveScript: 0x5a, distance: 0xa}, | 	5:  {wantLang: 0x210, haveLang: 0x139, wantScript: 0x2e, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	6:  {wantLang: 0x24a, haveLang: 0x139, wantScript: 0x4e, haveScript: 0x5a, distance: 0xa}, | 	6:  {wantLang: 0x24a, haveLang: 0x139, wantScript: 0x4f, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	7:  {wantLang: 0x251, haveLang: 0x139, wantScript: 0x52, haveScript: 0x5a, distance: 0xa}, | 	7:  {wantLang: 0x251, haveLang: 0x139, wantScript: 0x53, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	8:  {wantLang: 0x2b8, haveLang: 0x139, wantScript: 0x57, haveScript: 0x5a, distance: 0xa}, | 	8:  {wantLang: 0x2b8, haveLang: 0x139, wantScript: 0x58, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	9:  {wantLang: 0x304, haveLang: 0x139, wantScript: 0x6e, haveScript: 0x5a, distance: 0xa}, | 	9:  {wantLang: 0x304, haveLang: 0x139, wantScript: 0x6f, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	10: {wantLang: 0x331, haveLang: 0x139, wantScript: 0x75, haveScript: 0x5a, distance: 0xa}, | 	10: {wantLang: 0x331, haveLang: 0x139, wantScript: 0x76, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	11: {wantLang: 0x351, haveLang: 0x139, wantScript: 0x22, haveScript: 0x5a, distance: 0xa}, | 	11: {wantLang: 0x351, haveLang: 0x139, wantScript: 0x22, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	12: {wantLang: 0x395, haveLang: 0x139, wantScript: 0x81, haveScript: 0x5a, distance: 0xa}, | 	12: {wantLang: 0x395, haveLang: 0x139, wantScript: 0x83, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	13: {wantLang: 0x39d, haveLang: 0x139, wantScript: 0x36, haveScript: 0x5a, distance: 0xa}, | 	13: {wantLang: 0x39d, haveLang: 0x139, wantScript: 0x36, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	14: {wantLang: 0x3be, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5a, distance: 0xa}, | 	14: {wantLang: 0x3be, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	15: {wantLang: 0x3fa, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5a, distance: 0xa}, | 	15: {wantLang: 0x3fa, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	16: {wantLang: 0x40c, haveLang: 0x139, wantScript: 0xd4, haveScript: 0x5a, distance: 0xa}, | 	16: {wantLang: 0x40c, haveLang: 0x139, wantScript: 0xd6, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	17: {wantLang: 0x450, haveLang: 0x139, wantScript: 0xe3, haveScript: 0x5a, distance: 0xa}, | 	17: {wantLang: 0x450, haveLang: 0x139, wantScript: 0xe6, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	18: {wantLang: 0x461, haveLang: 0x139, wantScript: 0xe6, haveScript: 0x5a, distance: 0xa}, | 	18: {wantLang: 0x461, haveLang: 0x139, wantScript: 0xe9, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	19: {wantLang: 0x46f, haveLang: 0x139, wantScript: 0x2c, haveScript: 0x5a, distance: 0xa}, | 	19: {wantLang: 0x46f, haveLang: 0x139, wantScript: 0x2c, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	20: {wantLang: 0x476, haveLang: 0x3e2, wantScript: 0x5a, haveScript: 0x20, distance: 0xa}, | 	20: {wantLang: 0x476, haveLang: 0x3e2, wantScript: 0x5b, haveScript: 0x20, distance: 0xa}, | ||||||
| 	21: {wantLang: 0x4b4, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5a, distance: 0xa}, | 	21: {wantLang: 0x4b4, haveLang: 0x139, wantScript: 0x5, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	22: {wantLang: 0x4bc, haveLang: 0x3e2, wantScript: 0x5a, haveScript: 0x20, distance: 0xa}, | 	22: {wantLang: 0x4bc, haveLang: 0x3e2, wantScript: 0x5b, haveScript: 0x20, distance: 0xa}, | ||||||
| 	23: {wantLang: 0x512, haveLang: 0x139, wantScript: 0x3e, haveScript: 0x5a, distance: 0xa}, | 	23: {wantLang: 0x512, haveLang: 0x139, wantScript: 0x3e, haveScript: 0x5b, distance: 0xa}, | ||||||
| 	24: {wantLang: 0x529, haveLang: 0x529, wantScript: 0x3b, haveScript: 0x3c, distance: 0xf}, | 	24: {wantLang: 0x529, haveLang: 0x529, wantScript: 0x3b, haveScript: 0x3c, distance: 0xf}, | ||||||
| 	25: {wantLang: 0x529, haveLang: 0x529, wantScript: 0x3c, haveScript: 0x3b, distance: 0x13}, | 	25: {wantLang: 0x529, haveLang: 0x529, wantScript: 0x3c, haveScript: 0x3b, distance: 0x13}, | ||||||
| } // Size: 232 bytes | } // Size: 232 bytes | ||||||
| @@ -295,4 +295,4 @@ var matchRegion = []regionIntelligibility{ // 15 elements | |||||||
| 	14: {lang: 0x529, script: 0x3c, group: 0x80, distance: 0x5}, | 	14: {lang: 0x529, script: 0x3c, group: 0x80, distance: 0x5}, | ||||||
| } // Size: 114 bytes | } // Size: 114 bytes | ||||||
|  |  | ||||||
| // Total table size 1472 bytes (1KiB); checksum: F86C669 | // Total table size 1473 bytes (1KiB); checksum: 7BB90B5C | ||||||
|   | |||||||
							
								
								
									
										4
									
								
								vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/text/unicode/bidi/tables13.0.0.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,7 +1,7 @@ | |||||||
| // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. | // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. | ||||||
|  |  | ||||||
| //go:build go1.16 | //go:build go1.16 && !go1.21 | ||||||
| // +build go1.16 | // +build go1.16,!go1.21 | ||||||
|  |  | ||||||
| package bidi | package bidi | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										2043
									
								
								vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										2043
									
								
								vendor/golang.org/x/text/unicode/bidi/tables15.0.0.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										4
									
								
								vendor/golang.org/x/text/unicode/norm/tables13.0.0.go
									
									
									
										generated
									
									
										vendored
									
									
								
							
							
						
						
									
										4
									
								
								vendor/golang.org/x/text/unicode/norm/tables13.0.0.go
									
									
									
										generated
									
									
										vendored
									
									
								
							| @@ -1,7 +1,7 @@ | |||||||
| // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. | // Code generated by running "go generate" in golang.org/x/text. DO NOT EDIT. | ||||||
|  |  | ||||||
| //go:build go1.16 | //go:build go1.16 && !go1.21 | ||||||
| // +build go1.16 | // +build go1.16,!go1.21 | ||||||
|  |  | ||||||
| package norm | package norm | ||||||
|  |  | ||||||
|   | |||||||
							
								
								
									
										7908
									
								
								vendor/golang.org/x/text/unicode/norm/tables15.0.0.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
							
						
						
									
										7908
									
								
								vendor/golang.org/x/text/unicode/norm/tables15.0.0.go
									
									
									
										generated
									
									
										vendored
									
									
										Normal file
									
								
							
										
											
												File diff suppressed because it is too large
												Load Diff
											
										
									
								
							
							
								
								
									
										12
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							
							
						
						
									
										12
									
								
								vendor/modules.txt
									
									
									
									
										vendored
									
									
								
							| @@ -139,10 +139,10 @@ github.com/hashicorp/logutils | |||||||
| ## explicit; go 1.18 | ## explicit; go 1.18 | ||||||
| github.com/hashicorp/terraform-exec/internal/version | github.com/hashicorp/terraform-exec/internal/version | ||||||
| github.com/hashicorp/terraform-exec/tfexec | github.com/hashicorp/terraform-exec/tfexec | ||||||
| # github.com/hashicorp/terraform-json v0.17.0 | # github.com/hashicorp/terraform-json v0.17.1 | ||||||
| ## explicit; go 1.18 | ## explicit; go 1.18 | ||||||
| github.com/hashicorp/terraform-json | github.com/hashicorp/terraform-json | ||||||
| # github.com/hashicorp/terraform-plugin-docs v0.15.0 | # github.com/hashicorp/terraform-plugin-docs v0.16.0 | ||||||
| ## explicit; go 1.19 | ## explicit; go 1.19 | ||||||
| github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs | github.com/hashicorp/terraform-plugin-docs/cmd/tfplugindocs | ||||||
| github.com/hashicorp/terraform-plugin-docs/internal/cmd | github.com/hashicorp/terraform-plugin-docs/internal/cmd | ||||||
| @@ -283,7 +283,11 @@ golang.org/x/crypto/hkdf | |||||||
| golang.org/x/crypto/pbkdf2 | golang.org/x/crypto/pbkdf2 | ||||||
| golang.org/x/crypto/scrypt | golang.org/x/crypto/scrypt | ||||||
| golang.org/x/crypto/sha3 | golang.org/x/crypto/sha3 | ||||||
| # golang.org/x/mod v0.10.0 | # golang.org/x/exp v0.0.0-20230626212559-97b1e661b5df | ||||||
|  | ## explicit; go 1.20 | ||||||
|  | golang.org/x/exp/constraints | ||||||
|  | golang.org/x/exp/slices | ||||||
|  | # golang.org/x/mod v0.11.0 | ||||||
| ## explicit; go 1.17 | ## explicit; go 1.17 | ||||||
| golang.org/x/mod/internal/lazyregexp | golang.org/x/mod/internal/lazyregexp | ||||||
| golang.org/x/mod/modfile | golang.org/x/mod/modfile | ||||||
| @@ -302,7 +306,7 @@ golang.org/x/net/trace | |||||||
| ## explicit; go 1.17 | ## explicit; go 1.17 | ||||||
| golang.org/x/sys/cpu | golang.org/x/sys/cpu | ||||||
| golang.org/x/sys/unix | golang.org/x/sys/unix | ||||||
| # golang.org/x/text v0.10.0 | # golang.org/x/text v0.11.0 | ||||||
| ## explicit; go 1.17 | ## explicit; go 1.17 | ||||||
| golang.org/x/text/cases | golang.org/x/text/cases | ||||||
| golang.org/x/text/internal | golang.org/x/text/internal | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user