inputpb

package
v0.0.0-...-7f005ae Latest Latest
Warning

This package is not in the latest version of its module.

Go to latest
Published: Feb 24, 2025 License: BSD-3-Clause Imports: 6 Imported by: 0

Documentation

Index

Constants

This section is empty.

Variables

View Source
var (
	GCSArchive_Format_name = map[int32]string{
		0: "UNKNOWN",
		1: "TAR_GZ",
		2: "TAR_BZ2",
		3: "TAR_XZ",
	}
	GCSArchive_Format_value = map[string]int32{
		"UNKNOWN": 0,
		"TAR_GZ":  1,
		"TAR_BZ2": 2,
		"TAR_XZ":  3,
	}
)

Enum value maps for GCSArchive_Format.

View Source
var File_go_chromium_org_infra_experimental_crderiveinputs_inputpb_inputs_proto protoreflect.FileDescriptor

Functions

This section is empty.

Types

type AptDependency

type AptDependency struct {

	// Set of conditions to evaluate - all must be True for this Dependency to
	// be active.
	//
	// An empty conditions set is True.
	Conditions []*AptDependency_Condition `protobuf:"bytes,1,rep,name=conditions,proto3" json:"conditions,omitempty"`
	// If conditions is met, then install all of these packages.
	// If conditions is not met, and orelse is empty, fail.
	// If conditions is not met, and orelse is not empty, recurse.
	Packages []string       `protobuf:"bytes,2,rep,name=packages,proto3" json:"packages,omitempty"`
	Orelse   *AptDependency `protobuf:"bytes,3,opt,name=orelse,proto3" json:"orelse,omitempty"`
	// contains filtered or unexported fields
}

func (*AptDependency) Descriptor deprecated

func (*AptDependency) Descriptor() ([]byte, []int)

Deprecated: Use AptDependency.ProtoReflect.Descriptor instead.

func (*AptDependency) GetConditions

func (x *AptDependency) GetConditions() []*AptDependency_Condition

func (*AptDependency) GetOrelse

func (x *AptDependency) GetOrelse() *AptDependency

func (*AptDependency) GetPackages

func (x *AptDependency) GetPackages() []string

func (*AptDependency) ProtoMessage

func (*AptDependency) ProtoMessage()

func (*AptDependency) ProtoReflect

func (x *AptDependency) ProtoReflect() protoreflect.Message

func (*AptDependency) Reset

func (x *AptDependency) Reset()

func (*AptDependency) String

func (x *AptDependency) String() string

type AptDependency_Condition

type AptDependency_Condition struct {

	// If package_available is set, check the apt repo for this package being
	// available. If it is, then this condition clause is True.
	PackageAvailable string `protobuf:"bytes,1,opt,name=package_available,json=packageAvailable,proto3" json:"package_available,omitempty"`
	// contains filtered or unexported fields
}

func (*AptDependency_Condition) Descriptor deprecated

func (*AptDependency_Condition) Descriptor() ([]byte, []int)

Deprecated: Use AptDependency_Condition.ProtoReflect.Descriptor instead.

func (*AptDependency_Condition) GetPackageAvailable

func (x *AptDependency_Condition) GetPackageAvailable() string

func (*AptDependency_Condition) ProtoMessage

func (*AptDependency_Condition) ProtoMessage()

func (*AptDependency_Condition) ProtoReflect

func (x *AptDependency_Condition) ProtoReflect() protoreflect.Message

func (*AptDependency_Condition) Reset

func (x *AptDependency_Condition) Reset()

func (*AptDependency_Condition) String

func (x *AptDependency_Condition) String() string

type CIPDPackage

type CIPDPackage struct {
	Pkg     *ResolvableString `protobuf:"bytes,1,opt,name=pkg,proto3" json:"pkg,omitempty"`
	Version *ResolvableString `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	// contains filtered or unexported fields
}

func (*CIPDPackage) Descriptor deprecated

func (*CIPDPackage) Descriptor() ([]byte, []int)

Deprecated: Use CIPDPackage.ProtoReflect.Descriptor instead.

func (*CIPDPackage) GetPkg

func (x *CIPDPackage) GetPkg() *ResolvableString

func (*CIPDPackage) GetVersion

func (x *CIPDPackage) GetVersion() *ResolvableString

func (*CIPDPackage) ProtoMessage

func (*CIPDPackage) ProtoMessage()

func (*CIPDPackage) ProtoReflect

func (x *CIPDPackage) ProtoReflect() protoreflect.Message

func (*CIPDPackage) Reset

func (x *CIPDPackage) Reset()

func (*CIPDPackage) String

func (x *CIPDPackage) String() string

type CIPDPackages

type CIPDPackages struct {
	Packges []*CIPDPackage `protobuf:"bytes,1,rep,name=packges,proto3" json:"packges,omitempty"`
	// contains filtered or unexported fields
}

func (*CIPDPackages) Descriptor deprecated

func (*CIPDPackages) Descriptor() ([]byte, []int)

Deprecated: Use CIPDPackages.ProtoReflect.Descriptor instead.

func (*CIPDPackages) GetPackges

func (x *CIPDPackages) GetPackges() []*CIPDPackage

func (*CIPDPackages) ProtoMessage

func (*CIPDPackages) ProtoMessage()

func (*CIPDPackages) ProtoReflect

func (x *CIPDPackages) ProtoReflect() protoreflect.Message

func (*CIPDPackages) Reset

func (x *CIPDPackages) Reset()

func (*CIPDPackages) String

func (x *CIPDPackages) String() string

type GCSArchive

type GCSArchive struct {
	Archive *GCSBlob `protobuf:"bytes,1,opt,name=archive,proto3" json:"archive,omitempty"`
	// Extract only this subdirectory from the archive.
	//
	// Example, in a tarfile like:
	//
	//	a/stuff
	//	b/deep/something
	//	b/other/blah
	//
	// if this is 'b/deep', then 'something' would be extracted to the Source.path
	// that this GCSArchive belongs to.
	//
	// This was added due to download_nacl_toolchains.py support. Hopefully this
	// can be removed.
	ExtractSubdir string            `protobuf:"bytes,2,opt,name=extract_subdir,json=extractSubdir,proto3" json:"extract_subdir,omitempty"`
	Format        GCSArchive_Format `protobuf:"varint,3,opt,name=format,proto3,enum=GCSArchive_Format" json:"format,omitempty"`
	// contains filtered or unexported fields
}

func (*GCSArchive) Descriptor deprecated

func (*GCSArchive) Descriptor() ([]byte, []int)

Deprecated: Use GCSArchive.ProtoReflect.Descriptor instead.

func (*GCSArchive) GetArchive

func (x *GCSArchive) GetArchive() *GCSBlob

func (*GCSArchive) GetExtractSubdir

func (x *GCSArchive) GetExtractSubdir() string

func (*GCSArchive) GetFormat

func (x *GCSArchive) GetFormat() GCSArchive_Format

func (*GCSArchive) ProtoMessage

func (*GCSArchive) ProtoMessage()

func (*GCSArchive) ProtoReflect

func (x *GCSArchive) ProtoReflect() protoreflect.Message

func (*GCSArchive) Reset

func (x *GCSArchive) Reset()

func (*GCSArchive) String

func (x *GCSArchive) String() string

type GCSArchive_Format

type GCSArchive_Format int32
const (
	GCSArchive_UNKNOWN GCSArchive_Format = 0
	GCSArchive_TAR_GZ  GCSArchive_Format = 1
	GCSArchive_TAR_BZ2 GCSArchive_Format = 2
	GCSArchive_TAR_XZ  GCSArchive_Format = 3
)

func (GCSArchive_Format) Descriptor

func (GCSArchive_Format) Enum

func (GCSArchive_Format) EnumDescriptor deprecated

func (GCSArchive_Format) EnumDescriptor() ([]byte, []int)

Deprecated: Use GCSArchive_Format.Descriptor instead.

func (GCSArchive_Format) Number

func (GCSArchive_Format) String

func (x GCSArchive_Format) String() string

func (GCSArchive_Format) Type

type GCSArchives

type GCSArchives struct {

	// unfortunately, download_nacl_toolchains.py unpacks multiple archives on top
	// of each other...
	//
	// For the purpose of this manifest, they are unpacked in order... if there
	// are conflicts, ideally the unpacker should yell about that.
	Archives []*GCSArchive `protobuf:"bytes,1,rep,name=archives,proto3" json:"archives,omitempty"`
	// contains filtered or unexported fields
}

func (*GCSArchives) Descriptor deprecated

func (*GCSArchives) Descriptor() ([]byte, []int)

Deprecated: Use GCSArchives.ProtoReflect.Descriptor instead.

func (*GCSArchives) GetArchives

func (x *GCSArchives) GetArchives() []*GCSArchive

func (*GCSArchives) ProtoMessage

func (*GCSArchives) ProtoMessage()

func (*GCSArchives) ProtoReflect

func (x *GCSArchives) ProtoReflect() protoreflect.Message

func (*GCSArchives) Reset

func (x *GCSArchives) Reset()

func (*GCSArchives) String

func (x *GCSArchives) String() string

type GCSBlob

type GCSBlob struct {
	Bucket string        `protobuf:"bytes,1,opt,name=bucket,proto3" json:"bucket,omitempty"`
	Object string        `protobuf:"bytes,2,opt,name=object,proto3" json:"object,omitempty"`
	Hash   *GCSBlob_Hash `protobuf:"bytes,3,opt,name=hash,proto3" json:"hash,omitempty"`
	// contains filtered or unexported fields
}

func (*GCSBlob) Descriptor deprecated

func (*GCSBlob) Descriptor() ([]byte, []int)

Deprecated: Use GCSBlob.ProtoReflect.Descriptor instead.

func (*GCSBlob) GetBucket

func (x *GCSBlob) GetBucket() string

func (*GCSBlob) GetHash

func (x *GCSBlob) GetHash() *GCSBlob_Hash

func (*GCSBlob) GetObject

func (x *GCSBlob) GetObject() string

func (*GCSBlob) ProtoMessage

func (*GCSBlob) ProtoMessage()

func (*GCSBlob) ProtoReflect

func (x *GCSBlob) ProtoReflect() protoreflect.Message

func (*GCSBlob) Reset

func (x *GCSBlob) Reset()

func (*GCSBlob) String

func (x *GCSBlob) String() string

type GCSBlob_Hash

type GCSBlob_Hash struct {
	Size   *wrapperspb.Int64Value `protobuf:"bytes,1,opt,name=size,proto3" json:"size,omitempty"`
	Sha256 []byte                 `protobuf:"bytes,2,opt,name=sha256,proto3" json:"sha256,omitempty"`
	// If we had to resolve this Hash against GCS, this records the generation
	// number we consumed. Resolution only occurs if size and sha256 are not both
	// supplied by the originating pin file.
	Generation *wrapperspb.Int64Value `protobuf:"bytes,3,opt,name=generation,proto3" json:"generation,omitempty"`
	// These hash values may be present in the source, but will all be resolved
	// to sha2 by crderiveinputs.
	Sha1 []byte `protobuf:"bytes,4,opt,name=sha1,proto3" json:"sha1,omitempty"`
	// contains filtered or unexported fields
}

Hash, when resolved, always has size/sha2.

There are other unresolved inputs which can be supplied here, but Oracle will always resolve them to size/sha2.

func (*GCSBlob_Hash) Descriptor deprecated

func (*GCSBlob_Hash) Descriptor() ([]byte, []int)

Deprecated: Use GCSBlob_Hash.ProtoReflect.Descriptor instead.

func (*GCSBlob_Hash) GetGeneration

func (x *GCSBlob_Hash) GetGeneration() *wrapperspb.Int64Value

func (*GCSBlob_Hash) GetSha1

func (x *GCSBlob_Hash) GetSha1() []byte

func (*GCSBlob_Hash) GetSha256

func (x *GCSBlob_Hash) GetSha256() []byte

func (*GCSBlob_Hash) GetSize

func (x *GCSBlob_Hash) GetSize() *wrapperspb.Int64Value

func (*GCSBlob_Hash) ProtoMessage

func (*GCSBlob_Hash) ProtoMessage()

func (*GCSBlob_Hash) ProtoReflect

func (x *GCSBlob_Hash) ProtoReflect() protoreflect.Message

func (*GCSBlob_Hash) Reset

func (x *GCSBlob_Hash) Reset()

func (*GCSBlob_Hash) String

func (x *GCSBlob_Hash) String() string

type GitCheckout

type GitCheckout struct {
	Repo    string            `protobuf:"bytes,1,opt,name=repo,proto3" json:"repo,omitempty"`
	Version *ResolvableString `protobuf:"bytes,2,opt,name=version,proto3" json:"version,omitempty"`
	// contains filtered or unexported fields
}

func (*GitCheckout) Descriptor deprecated

func (*GitCheckout) Descriptor() ([]byte, []int)

Deprecated: Use GitCheckout.ProtoReflect.Descriptor instead.

func (*GitCheckout) GetRepo

func (x *GitCheckout) GetRepo() string

func (*GitCheckout) GetVersion

func (x *GitCheckout) GetVersion() *ResolvableString

func (*GitCheckout) ProtoMessage

func (*GitCheckout) ProtoMessage()

func (*GitCheckout) ProtoReflect

func (x *GitCheckout) ProtoReflect() protoreflect.Message

func (*GitCheckout) Reset

func (x *GitCheckout) Reset()

func (*GitCheckout) String

func (x *GitCheckout) String() string

type LinuxSystemDeps

type LinuxSystemDeps struct {

	// This is actually unconstrained in chromium - install-build-deps will check
	// that the base os is one of 4 unpinned distributions:
	//
	// * "Ubuntu 18.04 LTS (bionic with EoL April 2028)"
	// * "Ubuntu 20.04 LTS (focal with EoL April 2030)"
	// * "Ubuntu 22.04 LTS (jammy with EoL April 2032)"
	// * "Debian 10 (buster) or later"
	BaseImage string           `protobuf:"bytes,1,opt,name=base_image,json=baseImage,proto3" json:"base_image,omitempty"`
	AptDep    []*AptDependency `protobuf:"bytes,2,rep,name=apt_dep,json=aptDep,proto3" json:"apt_dep,omitempty"`
	// contains filtered or unexported fields
}

func (*LinuxSystemDeps) Descriptor deprecated

func (*LinuxSystemDeps) Descriptor() ([]byte, []int)

Deprecated: Use LinuxSystemDeps.ProtoReflect.Descriptor instead.

func (*LinuxSystemDeps) GetAptDep

func (x *LinuxSystemDeps) GetAptDep() []*AptDependency

func (*LinuxSystemDeps) GetBaseImage

func (x *LinuxSystemDeps) GetBaseImage() string

func (*LinuxSystemDeps) ProtoMessage

func (*LinuxSystemDeps) ProtoMessage()

func (*LinuxSystemDeps) ProtoReflect

func (x *LinuxSystemDeps) ProtoReflect() protoreflect.Message

func (*LinuxSystemDeps) Reset

func (x *LinuxSystemDeps) Reset()

func (*LinuxSystemDeps) String

func (x *LinuxSystemDeps) String() string

type Manifest

type Manifest struct {

	// Types that are valid to be assigned to System:
	//
	//	*Manifest_LinuxDeps
	System        isManifest_System               `protobuf_oneof:"system"`
	GclientInputs map[string]*Manifest_GclientVal `` /* 174-byte string literal not displayed */
	Sources       map[string]*Source              `` /* 141-byte string literal not displayed */
	// Map of spec sha2 => VpythonEnv.
	Virtualenvs map[string]*VpythonEnv `` /* 149-byte string literal not displayed */
	// contains filtered or unexported fields
}

func (*Manifest) Descriptor deprecated

func (*Manifest) Descriptor() ([]byte, []int)

Deprecated: Use Manifest.ProtoReflect.Descriptor instead.

func (*Manifest) GetGclientInputs

func (x *Manifest) GetGclientInputs() map[string]*Manifest_GclientVal

func (*Manifest) GetLinuxDeps

func (x *Manifest) GetLinuxDeps() *LinuxSystemDeps

func (*Manifest) GetSources

func (x *Manifest) GetSources() map[string]*Source

func (*Manifest) GetSystem

func (x *Manifest) GetSystem() isManifest_System

func (*Manifest) GetVirtualenvs

func (x *Manifest) GetVirtualenvs() map[string]*VpythonEnv

func (*Manifest) ProtoMessage

func (*Manifest) ProtoMessage()

func (*Manifest) ProtoReflect

func (x *Manifest) ProtoReflect() protoreflect.Message

func (*Manifest) Reset

func (x *Manifest) Reset()

func (*Manifest) String

func (x *Manifest) String() string

type Manifest_GclientVal

type Manifest_GclientVal struct {

	// Types that are valid to be assigned to Value:
	//
	//	*Manifest_GclientVal_StrVal
	//	*Manifest_GclientVal_BoolVal
	Value isManifest_GclientVal_Value `protobuf_oneof:"value"`
	// contains filtered or unexported fields
}

func (*Manifest_GclientVal) Descriptor deprecated

func (*Manifest_GclientVal) Descriptor() ([]byte, []int)

Deprecated: Use Manifest_GclientVal.ProtoReflect.Descriptor instead.

func (*Manifest_GclientVal) GetBoolVal

func (x *Manifest_GclientVal) GetBoolVal() bool

func (*Manifest_GclientVal) GetStrVal

func (x *Manifest_GclientVal) GetStrVal() string

func (*Manifest_GclientVal) GetValue

func (x *Manifest_GclientVal) GetValue() isManifest_GclientVal_Value

func (*Manifest_GclientVal) ProtoMessage

func (*Manifest_GclientVal) ProtoMessage()

func (*Manifest_GclientVal) ProtoReflect

func (x *Manifest_GclientVal) ProtoReflect() protoreflect.Message

func (*Manifest_GclientVal) Reset

func (x *Manifest_GclientVal) Reset()

func (*Manifest_GclientVal) String

func (x *Manifest_GclientVal) String() string

type Manifest_GclientVal_BoolVal

type Manifest_GclientVal_BoolVal struct {
	BoolVal bool `protobuf:"varint,2,opt,name=boolVal,proto3,oneof"`
}

type Manifest_GclientVal_StrVal

type Manifest_GclientVal_StrVal struct {
	StrVal string `protobuf:"bytes,1,opt,name=strVal,proto3,oneof"`
}

type Manifest_LinuxDeps

type Manifest_LinuxDeps struct {
	// LinuxSystemDeps is derived from build/install-build-deps.py.
	LinuxDeps *LinuxSystemDeps `protobuf:"bytes,1,opt,name=linux_deps,json=linuxDeps,proto3,oneof"` // TODO: Mac, Windows, ???? dependencies.
}

type RawFileContent

type RawFileContent struct {
	RawContent string `protobuf:"bytes,1,opt,name=raw_content,json=rawContent,proto3" json:"raw_content,omitempty"`
	Source     string `protobuf:"bytes,2,opt,name=source,proto3" json:"source,omitempty"` // NOTE: This probably needs to be structured.
	// contains filtered or unexported fields
}

func (*RawFileContent) Descriptor deprecated

func (*RawFileContent) Descriptor() ([]byte, []int)

Deprecated: Use RawFileContent.ProtoReflect.Descriptor instead.

func (*RawFileContent) GetRawContent

func (x *RawFileContent) GetRawContent() string

func (*RawFileContent) GetSource

func (x *RawFileContent) GetSource() string

func (*RawFileContent) ProtoMessage

func (*RawFileContent) ProtoMessage()

func (*RawFileContent) ProtoReflect

func (x *RawFileContent) ProtoReflect() protoreflect.Message

func (*RawFileContent) Reset

func (x *RawFileContent) Reset()

func (*RawFileContent) String

func (x *RawFileContent) String() string

type ResolvableString

type ResolvableString struct {
	Requested        string `protobuf:"bytes,1,opt,name=requested,proto3" json:"requested,omitempty"`
	Resolved         string `protobuf:"bytes,2,opt,name=resolved,proto3" json:"resolved,omitempty"`
	ResolutionSource string `protobuf:"bytes,3,opt,name=resolution_source,json=resolutionSource,proto3" json:"resolution_source,omitempty"` // NOTE: This probably needs to be structured
	// contains filtered or unexported fields
}

func (*ResolvableString) Descriptor deprecated

func (*ResolvableString) Descriptor() ([]byte, []int)

Deprecated: Use ResolvableString.ProtoReflect.Descriptor instead.

func (*ResolvableString) GetRequested

func (x *ResolvableString) GetRequested() string

func (*ResolvableString) GetResolutionSource

func (x *ResolvableString) GetResolutionSource() string

func (*ResolvableString) GetResolved

func (x *ResolvableString) GetResolved() string

func (*ResolvableString) ProtoMessage

func (*ResolvableString) ProtoMessage()

func (*ResolvableString) ProtoReflect

func (x *ResolvableString) ProtoReflect() protoreflect.Message

func (*ResolvableString) Reset

func (x *ResolvableString) Reset()

func (*ResolvableString) String

func (x *ResolvableString) String() string

type Source

type Source struct {
	Path string `protobuf:"bytes,1,opt,name=path,proto3" json:"path,omitempty"`
	// Types that are valid to be assigned to Content:
	//
	//	*Source_RawFile
	//	*Source_GcsFile
	//	*Source_Git
	//	*Source_Cipd
	//	*Source_GcsArchives
	Content isSource_Content `protobuf_oneof:"content"`
	// contains filtered or unexported fields
}

func (*Source) Descriptor deprecated

func (*Source) Descriptor() ([]byte, []int)

Deprecated: Use Source.ProtoReflect.Descriptor instead.

func (*Source) GetCipd

func (x *Source) GetCipd() *CIPDPackages

func (*Source) GetContent

func (x *Source) GetContent() isSource_Content

func (*Source) GetGcsArchives

func (x *Source) GetGcsArchives() *GCSArchives

func (*Source) GetGcsFile

func (x *Source) GetGcsFile() *GCSBlob

func (*Source) GetGit

func (x *Source) GetGit() *GitCheckout

func (*Source) GetPath

func (x *Source) GetPath() string

func (*Source) GetRawFile

func (x *Source) GetRawFile() *RawFileContent

func (*Source) ProtoMessage

func (*Source) ProtoMessage()

func (*Source) ProtoReflect

func (x *Source) ProtoReflect() protoreflect.Message

func (*Source) Reset

func (x *Source) Reset()

func (*Source) String

func (x *Source) String() string

type Source_Cipd

type Source_Cipd struct {
	Cipd *CIPDPackages `protobuf:"bytes,7,opt,name=cipd,proto3,oneof"`
}

type Source_GcsArchives

type Source_GcsArchives struct {
	GcsArchives *GCSArchives `protobuf:"bytes,8,opt,name=gcs_archives,json=gcsArchives,proto3,oneof"`
}

type Source_GcsFile

type Source_GcsFile struct {
	GcsFile *GCSBlob `protobuf:"bytes,5,opt,name=gcs_file,json=gcsFile,proto3,oneof"`
}

type Source_Git

type Source_Git struct {
	// This Source is the root of some archive/directory.
	Git *GitCheckout `protobuf:"bytes,6,opt,name=git,proto3,oneof"`
}

type Source_RawFile

type Source_RawFile struct {
	// This Source is a singluar file.
	RawFile *RawFileContent `protobuf:"bytes,4,opt,name=raw_file,json=rawFile,proto3,oneof"`
}

type VpythonEnv

type VpythonEnv struct {
	ManifestSha2      string         `protobuf:"bytes,1,opt,name=manifest_sha2,json=manifestSha2,proto3" json:"manifest_sha2,omitempty"`
	PythonInterpreter *CIPDPackage   `protobuf:"bytes,2,opt,name=python_interpreter,json=pythonInterpreter,proto3" json:"python_interpreter,omitempty"`
	Wheel             []*CIPDPackage `protobuf:"bytes,3,rep,name=wheel,proto3" json:"wheel,omitempty"`
	// contains filtered or unexported fields
}

func (*VpythonEnv) Descriptor deprecated

func (*VpythonEnv) Descriptor() ([]byte, []int)

Deprecated: Use VpythonEnv.ProtoReflect.Descriptor instead.

func (*VpythonEnv) GetManifestSha2

func (x *VpythonEnv) GetManifestSha2() string

func (*VpythonEnv) GetPythonInterpreter

func (x *VpythonEnv) GetPythonInterpreter() *CIPDPackage

func (*VpythonEnv) GetWheel

func (x *VpythonEnv) GetWheel() []*CIPDPackage

func (*VpythonEnv) ProtoMessage

func (*VpythonEnv) ProtoMessage()

func (*VpythonEnv) ProtoReflect

func (x *VpythonEnv) ProtoReflect() protoreflect.Message

func (*VpythonEnv) Reset

func (x *VpythonEnv) Reset()

func (*VpythonEnv) String

func (x *VpythonEnv) String() string

Jump to

Keyboard shortcuts

? : This menu
/ : Search site
f or F : Jump to
y or Y : Canonical URL