tines

package
v0.0.0-...-dc8c9eb Latest Latest
Warning

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

Go to latest
Published: Jun 9, 2023 License: MIT Imports: 13 Imported by: 1

Documentation

Index

Constants

This section is empty.

Variables

This section is empty.

Functions

func CheckResponse

func CheckResponse(r *http.Response, req *http.Request) error

CheckResponse checks the API response for errors, and returns them if present. A response is considered an error if it has a status code outside the 200 range. The caller is responsible to analyze the response body. The body can contain JSON (if the error is intended) or xml (sometimes Jira just failes).

Types

type Agent

type Agent struct {
	ID                 int                    `json:"id" structs:"id,omitempty"`
	UserID             int                    `json:"user_id" structs:"user_id,omitempty"`
	Name               string                 `json:"name" structs:"name"`
	Schedule           interface{}            `json:"schedule" structs:"schedule,omitempty"`
	EventsCount        int                    `json:"events_count" structs:"events_count,omitempty"`
	LastCheckAt        interface{}            `json:"last_check_at" structs:"last_check_at,omitempty"`
	LastReceiveAt      time.Time              `json:"last_receive_at" structs:"last_receive_at,omitempty"`
	LastCheckedEventID int                    `json:"last_checked_event_id" structs:"last_checked_event_id,omitempty"`
	CreatedAt          time.Time              `json:"created_at" structs:"created_at,omitempty"`
	UpdatedAt          time.Time              `json:"updated_at" structs:"updated_at,omitempty"`
	LastWebRequestAt   interface{}            `json:"last_web_request_at" structs:"last_web_request_at,omitempty"`
	KeepEventsFor      int                    `json:"keep_events_for" structs:"keep_events_for,omitempty"`
	LastEventAt        time.Time              `json:"last_event_at" structs:"last_event_at,omitempty"`
	LastErrorLogAt     interface{}            `json:"last_error_log_at" structs:"last_error_log_at,omitempty"`
	Disabled           *bool                  `json:"disabled" structs:"disabled,omitempty"`
	MonitorFailures    *bool                  `json:"monitor_failures" structs:"monitor_failures,omitempty"`
	MonitorAllEvents   *bool                  `json:"monitor_all_events" structs:"monitor_all_events,omitempty"`
	GUID               string                 `json:"guid" structs:"guid,omitempty"`
	StoryID            int                    `json:"story_id" structs:"story_id"`
	SourceIds          []int                  `json:"source_ids" structs:"source_ids,omitempty"`
	ReceiverIds        []int                  `json:"receiver_ids" structs:"receiver_ids,omitempty"`
	Type               string                 `json:"type" structs:"type,omitempty"`
	Position           map[string]interface{} `json:"position" structs:"position,omitempty"`
	Unknowns           tcontainer.MarshalMap
}

Agent structure

func (*Agent) MarshalJSON

func (i *Agent) MarshalJSON() ([]byte, error)

MarshalJSON is a custom JSON marshal function for the Agent* structs. It handles Tines options and maps those from / to "Unknowns" key.

func (*Agent) UnmarshalJSON

func (i *Agent) UnmarshalJSON(data []byte) error

UnmarshalJSON is a custom JSON marshal function for the Agent structs. It handles Tines custom options and maps those from / to "Unknowns" key.

type AgentService

type AgentService struct {
	// contains filtered or unexported fields
}

AgentService handles fields for the Tines instance / API.

func (*AgentService) Create

func (s *AgentService) Create(agent *Agent) (*Agent, *Response, error)

Create wraps CreateWithContext using the background context.

func (*AgentService) CreateWithContext

func (s *AgentService) CreateWithContext(ctx context.Context, agent *Agent) (*Agent, *Response, error)

CreateWithContext creates an agent.

func (*AgentService) Delete

func (s *AgentService) Delete(agentID int) (*Response, error)

Delete wraps GetWithContext using the background context.

func (*AgentService) DeleteWithContext

func (s *AgentService) DeleteWithContext(ctx context.Context, agentID int) (*Response, error)

DeleteWithContext deletes an agent.

func (*AgentService) Get

func (s *AgentService) Get(agentID int) (*Agent, *Response, error)

Get wraps GetWithContext using the background context.

func (*AgentService) GetWithContext

func (s *AgentService) GetWithContext(ctx context.Context, agentID int) (*Agent, *Response, error)

GetWithContext returns an agent for the given agent key.

func (*AgentService) Update

func (s *AgentService) Update(agentID int, agent *Agent) (*Agent, *Response, error)

Update wraps UpdateWithContext using the background context.

func (*AgentService) UpdateWithContext

func (s *AgentService) UpdateWithContext(ctx context.Context, agentID int, agent *Agent) (*Agent, *Response, error)

UpdateWithContext updates an agent for the given agent key.

type Annotation

type Annotation struct {
	ID       int                    `json:"id" structs:"id,omitempty"`
	StoryID  int                    `json:"story_id" structs:"story_id"`
	Content  string                 `json:"content" structs:"content,omitempty"`
	Position map[string]interface{} `json:"position" structs:"position,omitempty"`
	Unknowns tcontainer.MarshalMap
}

Annotation structure

func (*Annotation) MarshalJSON

func (i *Annotation) MarshalJSON() ([]byte, error)

MarshalJSON is a custom JSON marshal function for the Annotation* structs. It handles Tines options and maps those from / to "Unknowns" key.

func (*Annotation) UnmarshalJSON

func (i *Annotation) UnmarshalJSON(data []byte) error

UnmarshalJSON is a custom JSON marshal function for the Annotation structs. It handles Tines custom options and maps those from / to "Unknowns" key.

type AnnotationService

type AnnotationService struct {
	// contains filtered or unexported fields
}

AnnotationService handles fields for the Tines instance / API.

func (*AnnotationService) Create

func (s *AnnotationService) Create(annotation *Annotation) (*Annotation, *Response, error)

Create wraps CreateWithContext using the background context.

func (*AnnotationService) CreateWithContext

func (s *AnnotationService) CreateWithContext(ctx context.Context, annotation *Annotation) (*Annotation, *Response, error)

CreateWithContext creates an annotation.

func (*AnnotationService) Delete

func (s *AnnotationService) Delete(annotationID int) (*Response, error)

Delete wraps GetWithContext using the background context.

func (*AnnotationService) DeleteWithContext

func (s *AnnotationService) DeleteWithContext(ctx context.Context, annotationID int) (*Response, error)

DeleteWithContext deletes an annotation.

func (*AnnotationService) Get

func (s *AnnotationService) Get(annotationID int) (*Annotation, *Response, error)

Get wraps GetWithContext using the background context.

func (*AnnotationService) GetWithContext

func (s *AnnotationService) GetWithContext(ctx context.Context, annotationID int) (*Annotation, *Response, error)

GetWithContext returns an annotation for the given annotation key.

func (*AnnotationService) Update

func (s *AnnotationService) Update(annotationID int, annotation *Annotation) (*Annotation, *Response, error)

Update wraps UpdateWithContext using the background context.

func (*AnnotationService) UpdateWithContext

func (s *AnnotationService) UpdateWithContext(ctx context.Context, annotationID int, annotation *Annotation) (*Annotation, *Response, error)

UpdateWithContext updates an annotation for the given annotation key.

type Client

type Client struct {
	Agent          *AgentService
	GlobalResource *GlobalResourceService
	Story          *StoryService
	Annotation     *AnnotationService
	Credential     *CredentialService
	Team           *TeamService
	Folder         *FolderService
	// contains filtered or unexported fields
}

A Client manages communication with the Tines API.

func NewClient

func NewClient(httpClient httpClient, baseURL string, userEmail string, userToken string) (*Client, error)

NewClient returns a new Tines API client. If a nil httpClient is provided, http.DefaultClient will be used. baseURL is the HTTP endpoint of your Tines instance and should always be specified with a trailing slash.

func (*Client) Do

func (c *Client) Do(req *http.Request, v interface{}) (*Response, error)

Do sends an API request and returns the API response. The API response is JSON decoded and stored in the value pointed to by v, or returned as an error if an API error has occurred.

func (*Client) GetBaseURL

func (c *Client) GetBaseURL() url.URL

GetBaseURL will return you the Base URL. This is the same URL as in the NewClient constructor

func (*Client) NewRequest

func (c *Client) NewRequest(method, urlStr string, body interface{}) (*http.Request, error)

NewRequest wraps NewRequestWithContext using the background context.

func (*Client) NewRequestWithContext

func (c *Client) NewRequestWithContext(ctx context.Context, method, urlStr string, body interface{}) (*http.Request, error)

NewRequestWithContext creates an API request. A relative URL can be provided in urlStr, in which case it is resolved relative to the baseURL of the Client. If specified, the value pointed to by body is JSON encoded and included as the request body.

type Credential

type Credential struct {
	ID                         int    `json:"id" structs:"id,omitempty"`
	Name                       string `json:"name" structs:"name,omitempty"`
	Mode                       string `json:"mode" structs:"mode,omitempty"`
	TeamID                     int    `json:"team_id" structs:"team_id,omitempty"`
	FolderID                   int    `json:"folder_id" structs:"folder_id,omitempty"`
	ReadAccess                 string `json:"read_access" structs:"read_access,omitempty"`
	Value                      string `json:"value" structs:"value,omitempty"`
	JWTAlgorithm               string `json:"jwt_algorithm" structs:"jwt_algorithm,omitempty"`
	JWTPayload                 string `json:"jwt_payload" structs:"jwt_payload,omitempty"`
	JWTAutoGenerateTimeClaims  bool   `json:"jwt_auto_generate_time_claims" structs:"jwt_auto_generate_time_claims,omitempty"`
	JWTPrivateKey              string `json:"jwt_private_key" structs:"jwt_private_key,omitempty"`
	OAuthURL                   string `json:"oauth_url" structs:"oauth_url,omitempty"`
	OAuthTokenURL              string `json:"oauth_token_url" structs:"oauth_token_url,omitempty"`
	OAuthClientID              string `json:"oauth_client_id" structs:"oauth_client_id,omitempty"`
	OAuthClientSecret          string `json:"oauth_client_secret" structs:"oauth_client_secret,omitempty"`
	OAuthScope                 string `json:"oauth_scope" structs:"oauth_scope,omitempty"`
	OAuthGrantType             string `json:"oauth_grant_type" structs:"oauth_grant_type,omitempty"`
	AWSAuthenticationType      string `json:"aws_authentication_type" structs:"aws_authentication_type,omitempty"`
	AWSAccessKey               string `json:"aws_access_key" structs:"aws_access_key,omitempty"`
	AWSSecretKey               string `json:"aws_secret_key" structs:"aws_secret_key,omitempty"`
	AWSAssumedRoleARN          string `json:"aws_assumed_role_arn" structs:"aws_assumed_role_arn,omitempty"`
	AWSAssumedRoleExternalID   string `json:"aws_assumed_role_external_id" structs:"aws_assumed_role_external_id,omitempty"`
	HTTPRequestOptions         string `json:"http_request_options" structs:"http_request_options,omitempty"`
	HTTPRequestLocationOfToken string `json:"http_request_location_of_token" structs:"http_request_location_of_token,omitempty"`
	MTLSClientCertificate      string `json:"mtls_client_certificate" structs:"mtls_client_certificate,omitempty"`
	MTLSClientPrivateKey       string `json:"mtls_client_private_key" structs:"mtls_client_private_key,omitempty"`
	MTLSRootCertificate        string `json:"mtls_root_certificate" structs:"mtls_root_certificate,omitempty"`
	Description                string `json:"description" structs:"description,omitempty"`
	Unknowns                   tcontainer.MarshalMap
}

Credential structure

func (*Credential) MarshalJSON

func (i *Credential) MarshalJSON() ([]byte, error)

MarshalJSON is a custom JSON marshal function for the Credential* structs. It handles Tines options and maps those from / to "Unknowns" key.

func (*Credential) UnmarshalJSON

func (i *Credential) UnmarshalJSON(data []byte) error

UnmarshalJSON is a custom JSON marshal function for the Credential structs. It handles Tines custom options and maps those from / to "Unknowns" key.

type CredentialService

type CredentialService struct {
	// contains filtered or unexported fields
}

CredentialService handles fields for the Tines instance / API.

func (*CredentialService) Create

func (s *CredentialService) Create(credential *Credential) (*Credential, *Response, error)

Create wraps CreateWithContext using the background context.

func (*CredentialService) CreateWithContext

func (s *CredentialService) CreateWithContext(ctx context.Context, credential *Credential) (*Credential, *Response, error)

CreateWithContext creates a credential.

func (*CredentialService) Delete

func (s *CredentialService) Delete(credentialID int) (*Response, error)

Delete wraps DeleteWithContext using the background context.

func (*CredentialService) DeleteWithContext

func (s *CredentialService) DeleteWithContext(ctx context.Context, credentialID int) (*Response, error)

DeleteWithContext deletes a credential.

func (*CredentialService) Get

func (s *CredentialService) Get(credentialID int) (*Credential, *Response, error)

Get wraps GetWithContext using the background context.

func (*CredentialService) GetWithContext

func (s *CredentialService) GetWithContext(ctx context.Context, credentialID int) (*Credential, *Response, error)

GetWithContext returns a credential for the given credential id.

func (*CredentialService) Update

func (s *CredentialService) Update(globalResouceID int, credential *Credential) (*Credential, *Response, error)

Update wraps UpdateWithContext using the background context.

func (*CredentialService) UpdateWithContext

func (s *CredentialService) UpdateWithContext(ctx context.Context, credentialID int, credential *Credential) (*Credential, *Response, error)

UpdateWithContext updates a credential.

type Folder

type Folder struct {
	ID          int    `json:"id" structs:"id,omitempty"`
	Name        string `json:"name" structs:"name,omitempty"`
	ContentType string `json:"content_type" structs:"content_type,omitempty"`
	TeamID      int    `json:"team_id" structs:"team_id,omitempty"`
	Size        int    `json:"size" structs:"size,omitempty"`
	Unknowns    tcontainer.MarshalMap
}

Folder structure

func (*Folder) MarshalJSON

func (i *Folder) MarshalJSON() ([]byte, error)

MarshalJSON is a custom JSON marshal function for the Folder* structs. It handles Tines options and maps those from / to "Unknowns" key.

func (*Folder) UnmarshalJSON

func (i *Folder) UnmarshalJSON(data []byte) error

UnmarshalJSON is a custom JSON marshal function for the Folder structs. It handles Tines custom options and maps those from / to "Unknowns" key.

type FolderService

type FolderService struct {
	// contains filtered or unexported fields
}

FolderService handles fields for the Tines instance / API.

func (*FolderService) Create

func (s *FolderService) Create(folder *Folder) (*Folder, *Response, error)

Create wraps CreateWithContext using the background context.

func (*FolderService) CreateWithContext

func (s *FolderService) CreateWithContext(ctx context.Context, folder *Folder) (*Folder, *Response, error)

CreateWithContext creates an folder.

func (*FolderService) Delete

func (s *FolderService) Delete(folderID int) (*Response, error)

Delete wraps GetWithContext using the background context.

func (*FolderService) DeleteWithContext

func (s *FolderService) DeleteWithContext(ctx context.Context, folderID int) (*Response, error)

DeleteWithContext deletes an folder.

func (*FolderService) Get

func (s *FolderService) Get(folderID int) (*Folder, *Response, error)

Get wraps GetWithContext using the background context.

func (*FolderService) GetWithContext

func (s *FolderService) GetWithContext(ctx context.Context, folderID int) (*Folder, *Response, error)

GetWithContext returns an folder for the given folder key.

func (*FolderService) Update

func (s *FolderService) Update(folderID int, folder *Folder) (*Folder, *Response, error)

Update wraps UpdateWithContext using the background context.

func (*FolderService) UpdateWithContext

func (s *FolderService) UpdateWithContext(ctx context.Context, folderID int, folder *Folder) (*Folder, *Response, error)

UpdateWithContext updates an folder for the given folder key.

type GlobalResource

type GlobalResource struct {
	ID          int       `json:"id" structs:"id,omitempty"`
	UserID      int       `json:"user_id" structs:"user_id,omitempty"`
	Name        string    `json:"name" structs:"name,omitempty"`
	Value       string    `json:"value" structs:"value,omitempty"`
	ReadAccess  string    `json:"read_access" structs:"read_access,omitempty"`
	CreatedAt   time.Time `json:"created_at" structs:"created_at,omitempty"`
	UpdatedAt   time.Time `json:"updated_at" structs:"updated_at,omitempty"`
	Slug        string    `json:"slug" structs:"slug,omitempty"`
	TeamID      int       `json:"team_id" structs:"team_id,omitempty"`
	FolderID    int       `json:"folder_id" structs:"folder_id,omitempty"`
	Description string    `json:"description" structs:"description,omitempty"`
	Unknowns    tcontainer.MarshalMap
}

GlobalResource structure

func (*GlobalResource) MarshalJSON

func (i *GlobalResource) MarshalJSON() ([]byte, error)

MarshalJSON is a custom JSON marshal function for the GlobalResource* structs. It handles Tines options and maps those from / to "Unknowns" key.

func (*GlobalResource) UnmarshalJSON

func (i *GlobalResource) UnmarshalJSON(data []byte) error

UnmarshalJSON is a custom JSON marshal function for the GlobalResource structs. It handles Tines custom options and maps those from / to "Unknowns" key.

type GlobalResourceService

type GlobalResourceService struct {
	// contains filtered or unexported fields
}

GlobalResourceService handles fields for the Tines instance / API.

func (*GlobalResourceService) Create

func (s *GlobalResourceService) Create(globalresource *GlobalResource) (*GlobalResource, *Response, error)

Create wraps CreateWithContext using the background context.

func (*GlobalResourceService) CreateWithContext

func (s *GlobalResourceService) CreateWithContext(ctx context.Context, globalresource *GlobalResource) (*GlobalResource, *Response, error)

CreateWithContext creates a global resource.

func (*GlobalResourceService) Delete

func (s *GlobalResourceService) Delete(globalResourceID int) (*Response, error)

Delete wraps DeleteWithContext using the background context.

func (*GlobalResourceService) DeleteWithContext

func (s *GlobalResourceService) DeleteWithContext(ctx context.Context, globalResourceID int) (*Response, error)

DeleteWithContext deletes a global resource.

func (*GlobalResourceService) Get

func (s *GlobalResourceService) Get(globalResourceID int) (*GlobalResource, *Response, error)

Get wraps GetWithContext using the background context.

func (*GlobalResourceService) GetWithContext

func (s *GlobalResourceService) GetWithContext(ctx context.Context, globalResourceID int) (*GlobalResource, *Response, error)

GetWithContext returns an agent for the given global resource id.

func (*GlobalResourceService) Update

func (s *GlobalResourceService) Update(globalResouceID int, globalresource *GlobalResource) (*GlobalResource, *Response, error)

Update wraps UpdateWithContext using the background context.

func (*GlobalResourceService) UpdateWithContext

func (s *GlobalResourceService) UpdateWithContext(ctx context.Context, globalResourceID int, globalresource *GlobalResource) (*GlobalResource, *Response, error)

UpdateWithContext Updates a global resource.

type Response

type Response struct {
	*http.Response

	StartAt    int
	MaxResults int
	Total      int
}

Response represents Tines API response. It wraps http.Response returned from API and provides information about paging.

type Story

type Story struct {
	ID                 int         `json:"id" structs:"id,omitempty"`
	UserID             int         `json:"user_id" structs:"user_id,omitempty"`
	Name               string      `json:"name" structs:"name,omitempty"`
	CreatedAt          time.Time   `json:"created_at" structs:"created_at,omitempty"`
	UpdatedAt          time.Time   `json:"updated_at" structs:"updated_at,omitempty"`
	Description        string      `json:"description" structs:"description,omitempty"`
	GUID               string      `json:"guid" structs:"guid,omitempty"`
	SendToStoryEnabled *bool       `json:"send_to_story_enabled" structs:"send_to_story_enabled,omitempty"`
	SendToStoryAccess  string      `json:"send_to_story_access" structs:"send_to_story_access,omitempty"`
	EntryAgentID       int         `json:"entry_agent_id" structs:"entry_agent_id,omitempty"`
	ExitAgents         []int       `json:"exit_agent_ids" structs:"exit_agent_ids,omitempty"`
	DiagramLayout      interface{} `json:"diagram_layout" structs:"diagram_layout,omitempty"`
	Disabled           *bool       `json:"disabled" structs:"disabled,omitempty"`
	KeepEventsFor      int         `json:"keep_events_for" structs:"keep_events_for,omitempty"`
	Priority           *bool       `json:"priority" structs:"priority,omitempty"`
	TeamID             int         `json:"team_id" structs:"team_id,omitempty"`
	FolderID           int         `json:"folder_id" structs:"folder_id,omitempty"`
	Slug               string      `json:"slug" structs:"slug,omitempty"`
	PublishedState     string      `json:"published_state" structs:"published_state,omitempty"`
	Unknowns           tcontainer.MarshalMap
}

Story structure

func (*Story) MarshalJSON

func (i *Story) MarshalJSON() ([]byte, error)

MarshalJSON is a custom JSON marshal function for the Story* structs. It handles Tines options and maps those from / to "Unknowns" key.

func (*Story) UnmarshalJSON

func (i *Story) UnmarshalJSON(data []byte) error

UnmarshalJSON is a custom JSON marshal function for the Story structs. It handles Tines custom options and maps those from / to "Unknowns" key.

type StoryService

type StoryService struct {
	// contains filtered or unexported fields
}

StoryService handles fields for the Tines instance / API.

func (*StoryService) Create

func (s *StoryService) Create(story *Story) (*Story, *Response, error)

Create wraps CreateWithContext using the background context.

func (*StoryService) CreateWithContext

func (s *StoryService) CreateWithContext(ctx context.Context, story *Story) (*Story, *Response, error)

// CreateWithContext creates a story.

func (*StoryService) Delete

func (s *StoryService) Delete(storyID int) (*Response, error)

Delete wraps DeleteWithContext using the background context.

func (*StoryService) DeleteWithContext

func (s *StoryService) DeleteWithContext(ctx context.Context, storyID int) (*Response, error)

StoryWithContext deletes a story.

func (*StoryService) Get

func (s *StoryService) Get(storyID int) (*Story, *Response, error)

Get wraps GetWithContext using the background context.

func (*StoryService) GetWithContext

func (s *StoryService) GetWithContext(ctx context.Context, storyID int) (*Story, *Response, error)

GetWithContext returns an agent for the given global resource id.

func (*StoryService) Update

func (s *StoryService) Update(storyID int, story *Story) (*Story, *Response, error)

Update wraps UpdateWithContext using the background context.

func (*StoryService) UpdateWithContext

func (s *StoryService) UpdateWithContext(ctx context.Context, storyID int, story *Story) (*Story, *Response, error)

UpdateWithContext Updates a story.

type Team

type Team struct {
	ID       int    `json:"id" structs:"id,omitempty"`
	Name     string `json:"name" structs:"name,omitempty"`
	Unknowns tcontainer.MarshalMap
}

Team structure

func (*Team) MarshalJSON

func (i *Team) MarshalJSON() ([]byte, error)

MarshalJSON is a custom JSON marshal function for the Team* structs. It handles Tines options and maps those from / to "Unknowns" key.

func (*Team) UnmarshalJSON

func (i *Team) UnmarshalJSON(data []byte) error

UnmarshalJSON is a custom JSON marshal function for the Team structs. It handles Tines custom options and maps those from / to "Unknowns" key.

type TeamService

type TeamService struct {
	// contains filtered or unexported fields
}

TeamService handles fields for the Tines instance / API.

func (*TeamService) Create

func (s *TeamService) Create(team *Team) (*Team, *Response, error)

Create wraps CreateWithContext using the background context.

func (*TeamService) CreateWithContext

func (s *TeamService) CreateWithContext(ctx context.Context, team *Team) (*Team, *Response, error)

CreateWithContext creates an team.

func (*TeamService) Delete

func (s *TeamService) Delete(teamID int) (*Response, error)

Delete wraps GetWithContext using the background context.

func (*TeamService) DeleteWithContext

func (s *TeamService) DeleteWithContext(ctx context.Context, teamID int) (*Response, error)

DeleteWithContext deletes an team.

func (*TeamService) Get

func (s *TeamService) Get(teamID int) (*Team, *Response, error)

Get wraps GetWithContext using the background context.

func (*TeamService) GetWithContext

func (s *TeamService) GetWithContext(ctx context.Context, teamID int) (*Team, *Response, error)

GetWithContext returns an team for the given team key.

func (*TeamService) Update

func (s *TeamService) Update(teamID int, team *Team) (*Team, *Response, error)

Update wraps UpdateWithContext using the background context.

func (*TeamService) UpdateWithContext

func (s *TeamService) UpdateWithContext(ctx context.Context, teamID int, team *Team) (*Team, *Response, error)

UpdateWithContext updates an team for the given team key.

Jump to

Keyboard shortcuts

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