diff --git a/vendor/cloud.google.com/go/compute/metadata/metadata.go b/vendor/cloud.google.com/go/compute/metadata/metadata.go index 4ff4e2f1..125b7033 100644 --- a/vendor/cloud.google.com/go/compute/metadata/metadata.go +++ b/vendor/cloud.google.com/go/compute/metadata/metadata.go @@ -227,9 +227,6 @@ func InternalIP() (string, error) { return defaultClient.InternalIP() } // ExternalIP returns the instance's primary external (public) IP address. func ExternalIP() (string, error) { return defaultClient.ExternalIP() } -// Email calls Client.Email on the default client. -func Email(serviceAccount string) (string, error) { return defaultClient.Email(serviceAccount) } - // Hostname returns the instance's hostname. This will be of the form // ".c..internal". func Hostname() (string, error) { return defaultClient.Hostname() } @@ -370,16 +367,6 @@ func (c *Client) InternalIP() (string, error) { return c.getTrimmed("instance/network-interfaces/0/ip") } -// Email returns the email address associated with the service account. -// The account may be empty or the string "default" to use the instance's -// main account. -func (c *Client) Email(serviceAccount string) (string, error) { - if serviceAccount == "" { - serviceAccount = "default" - } - return c.getTrimmed("instance/service-accounts/" + serviceAccount + "/email") -} - // ExternalIP returns the instance's primary external (public) IP address. func (c *Client) ExternalIP() (string, error) { return c.getTrimmed("instance/network-interfaces/0/access-configs/0/external-ip") diff --git a/vendor/code.cloudfoundry.org/bytefmt/bytes.go b/vendor/code.cloudfoundry.org/bytefmt/bytes.go index e0e09bbe..73956047 100644 --- a/vendor/code.cloudfoundry.org/bytefmt/bytes.go +++ b/vendor/code.cloudfoundry.org/bytefmt/bytes.go @@ -18,11 +18,15 @@ const ( MEGABYTE GIGABYTE TERABYTE + PETABYTE + EXABYTE ) var invalidByteQuantityError = errors.New("byte quantity must be a positive integer with a unit of measurement like M, MB, MiB, G, GiB, or GB") // ByteSize returns a human-readable byte string of the form 10M, 12.5K, and so forth. The following units are available: +// E: Exabyte +// P: Petabyte // T: Terabyte // G: Gigabyte // M: Megabyte @@ -34,6 +38,12 @@ func ByteSize(bytes uint64) string { value := float64(bytes) switch { + case bytes >= EXABYTE: + unit = "E" + value = value / EXABYTE + case bytes >= PETABYTE: + unit = "P" + value = value / PETABYTE case bytes >= TERABYTE: unit = "T" value = value / TERABYTE @@ -49,7 +59,7 @@ func ByteSize(bytes uint64) string { case bytes >= BYTE: unit = "B" case bytes == 0: - return "0" + return "0B" } result := strconv.FormatFloat(value, 'f', 1, 64) @@ -72,6 +82,8 @@ func ToMegabytes(s string) (uint64, error) { // MB = M = MiB = 1024 * K // GB = G = GiB = 1024 * M // TB = T = TiB = 1024 * G +// PB = P = PiB = 1024 * T +// EB = E = EiB = 1024 * P func ToBytes(s string) (uint64, error) { s = strings.TrimSpace(s) s = strings.ToUpper(s) @@ -84,11 +96,15 @@ func ToBytes(s string) (uint64, error) { bytesString, multiple := s[:i], s[i:] bytes, err := strconv.ParseFloat(bytesString, 64) - if err != nil || bytes <= 0 { + if err != nil || bytes < 0 { return 0, invalidByteQuantityError } switch multiple { + case "E", "EB", "EIB": + return uint64(bytes * EXABYTE), nil + case "P", "PB", "PIB": + return uint64(bytes * PETABYTE), nil case "T", "TB", "TIB": return uint64(bytes * TERABYTE), nil case "G", "GB", "GIB": diff --git a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/build/client.go b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/build/client.go index 0d1a2346..0520ee58 100644 --- a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/build/client.go +++ b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/build/client.go @@ -24,22 +24,409 @@ import ( var ResourceAreaId, _ = uuid.Parse("965220d5-5bb9-42cf-8d67-9b146df2a5a4") -type Client struct { +type Client interface { + // Adds a tag to a build. + AddBuildTag(context.Context, AddBuildTagArgs) (*[]string, error) + // Adds tags to a build. + AddBuildTags(context.Context, AddBuildTagsArgs) (*[]string, error) + // [Preview API] Adds a tag to a definition + AddDefinitionTag(context.Context, AddDefinitionTagArgs) (*[]string, error) + // [Preview API] Adds multiple tags to a definition. + AddDefinitionTags(context.Context, AddDefinitionTagsArgs) (*[]string, error) + // [Preview API] + AuthorizeDefinitionResources(context.Context, AuthorizeDefinitionResourcesArgs) (*[]DefinitionResourceReference, error) + // [Preview API] + AuthorizeProjectResources(context.Context, AuthorizeProjectResourcesArgs) (*[]DefinitionResourceReference, error) + // Associates an artifact with a build. + CreateArtifact(context.Context, CreateArtifactArgs) (*BuildArtifact, error) + // Creates a new definition. + CreateDefinition(context.Context, CreateDefinitionArgs) (*BuildDefinition, error) + // [Preview API] Creates a new folder. + CreateFolder(context.Context, CreateFolderArgs) (*Folder, error) + // Deletes a build. + DeleteBuild(context.Context, DeleteBuildArgs) error + // Removes a tag from a build. + DeleteBuildTag(context.Context, DeleteBuildTagArgs) (*[]string, error) + // Deletes a definition and all associated builds. + DeleteDefinition(context.Context, DeleteDefinitionArgs) error + // [Preview API] Removes a tag from a definition. + DeleteDefinitionTag(context.Context, DeleteDefinitionTagArgs) (*[]string, error) + // [Preview API] Deletes a definition folder. Definitions and their corresponding builds will also be deleted. + DeleteFolder(context.Context, DeleteFolderArgs) error + // Deletes a build definition template. + DeleteTemplate(context.Context, DeleteTemplateArgs) error + // Gets a specific artifact for a build. + GetArtifact(context.Context, GetArtifactArgs) (*BuildArtifact, error) + // Gets a specific artifact for a build. + GetArtifactContentZip(context.Context, GetArtifactContentZipArgs) (io.ReadCloser, error) + // Gets all artifacts for a build. + GetArtifacts(context.Context, GetArtifactsArgs) (*[]BuildArtifact, error) + // [Preview API] Gets a specific attachment. + GetAttachment(context.Context, GetAttachmentArgs) (io.ReadCloser, error) + // [Preview API] Gets the list of attachments of a specific type that are associated with a build. + GetAttachments(context.Context, GetAttachmentsArgs) (*[]Attachment, error) + // Gets a build + GetBuild(context.Context, GetBuildArgs) (*Build, error) + // [Preview API] Gets a badge that indicates the status of the most recent build for the specified branch. + GetBuildBadge(context.Context, GetBuildBadgeArgs) (*BuildBadge, error) + // [Preview API] Gets a badge that indicates the status of the most recent build for the specified branch. + GetBuildBadgeData(context.Context, GetBuildBadgeDataArgs) (*string, error) + // Gets the changes associated with a build + GetBuildChanges(context.Context, GetBuildChangesArgs) (*GetBuildChangesResponseValue, error) + // Gets a controller + GetBuildController(context.Context, GetBuildControllerArgs) (*BuildController, error) + // Gets controller, optionally filtered by name + GetBuildControllers(context.Context, GetBuildControllersArgs) (*[]BuildController, error) + // Gets an individual log file for a build. + GetBuildLog(context.Context, GetBuildLogArgs) (io.ReadCloser, error) + // Gets an individual log file for a build. + GetBuildLogLines(context.Context, GetBuildLogLinesArgs) (*[]string, error) + // Gets the logs for a build. + GetBuildLogs(context.Context, GetBuildLogsArgs) (*[]BuildLog, error) + // Gets the logs for a build. + GetBuildLogsZip(context.Context, GetBuildLogsZipArgs) (io.ReadCloser, error) + // Gets an individual log file for a build. + GetBuildLogZip(context.Context, GetBuildLogZipArgs) (io.ReadCloser, error) + // Gets all build definition options supported by the system. + GetBuildOptionDefinitions(context.Context, GetBuildOptionDefinitionsArgs) (*[]BuildOptionDefinition, error) + // [Preview API] Gets properties for a build. + GetBuildProperties(context.Context, GetBuildPropertiesArgs) (interface{}, error) + // [Preview API] Gets a build report. + GetBuildReport(context.Context, GetBuildReportArgs) (*BuildReportMetadata, error) + // [Preview API] Gets a build report. + GetBuildReportHtmlContent(context.Context, GetBuildReportHtmlContentArgs) (io.ReadCloser, error) + // Gets a list of builds. + GetBuilds(context.Context, GetBuildsArgs) (*GetBuildsResponseValue, error) + // Gets the build settings. + GetBuildSettings(context.Context, GetBuildSettingsArgs) (*BuildSettings, error) + // Gets the tags for a build. + GetBuildTags(context.Context, GetBuildTagsArgs) (*[]string, error) + // Gets details for a build + GetBuildTimeline(context.Context, GetBuildTimelineArgs) (*Timeline, error) + // Gets the work items associated with a build. + GetBuildWorkItemsRefs(context.Context, GetBuildWorkItemsRefsArgs) (*[]webapi.ResourceRef, error) + // Gets the work items associated with a build, filtered to specific commits. + GetBuildWorkItemsRefsFromCommits(context.Context, GetBuildWorkItemsRefsFromCommitsArgs) (*[]webapi.ResourceRef, error) + // [Preview API] Gets the changes made to the repository between two given builds. + GetChangesBetweenBuilds(context.Context, GetChangesBetweenBuildsArgs) (*[]Change, error) + // Gets a definition, optionally at a specific revision. + GetDefinition(context.Context, GetDefinitionArgs) (*BuildDefinition, error) + // [Preview API] Gets build metrics for a definition. + GetDefinitionMetrics(context.Context, GetDefinitionMetricsArgs) (*[]BuildMetric, error) + // [Preview API] Gets properties for a definition. + GetDefinitionProperties(context.Context, GetDefinitionPropertiesArgs) (interface{}, error) + // [Preview API] + GetDefinitionResources(context.Context, GetDefinitionResourcesArgs) (*[]DefinitionResourceReference, error) + // Gets all revisions of a definition. + GetDefinitionRevisions(context.Context, GetDefinitionRevisionsArgs) (*[]BuildDefinitionRevision, error) + // Gets a list of definitions. + GetDefinitions(context.Context, GetDefinitionsArgs) (*GetDefinitionsResponseValue, error) + // [Preview API] Gets the tags for a definition. + GetDefinitionTags(context.Context, GetDefinitionTagsArgs) (*[]string, error) + // Gets a file from the build. + GetFile(context.Context, GetFileArgs) (io.ReadCloser, error) + // [Preview API] Gets the contents of a file in the given source code repository. + GetFileContents(context.Context, GetFileContentsArgs) (io.ReadCloser, error) + // [Preview API] Gets a list of build definition folders. + GetFolders(context.Context, GetFoldersArgs) (*[]Folder, error) + // [Preview API] Gets the latest build for a definition, optionally scoped to a specific branch. + GetLatestBuild(context.Context, GetLatestBuildArgs) (*Build, error) + // [Preview API] Gets the contents of a directory in the given source code repository. + GetPathContents(context.Context, GetPathContentsArgs) (*[]SourceRepositoryItem, error) + // [Preview API] Gets build metrics for a project. + GetProjectMetrics(context.Context, GetProjectMetricsArgs) (*[]BuildMetric, error) + // [Preview API] + GetProjectResources(context.Context, GetProjectResourcesArgs) (*[]DefinitionResourceReference, error) + // [Preview API] Gets a pull request object from source provider. + GetPullRequest(context.Context, GetPullRequestArgs) (*PullRequest, error) + // [Preview API] Gets information about build resources in the system. + GetResourceUsage(context.Context, GetResourceUsageArgs) (*BuildResourceUsage, error) + // [Preview API]

Gets the build status for a definition, optionally scoped to a specific branch, stage, job, and configuration.

If there are more than one, then it is required to pass in a stageName value when specifying a jobName, and the same rule then applies for both if passing a configuration parameter.

+ GetStatusBadge(context.Context, GetStatusBadgeArgs) (*string, error) + // Gets a list of all build and definition tags in the project. + GetTags(context.Context, GetTagsArgs) (*[]string, error) + // Gets a specific build definition template. + GetTemplate(context.Context, GetTemplateArgs) (*BuildDefinitionTemplate, error) + // Gets all definition templates. + GetTemplates(context.Context, GetTemplatesArgs) (*[]BuildDefinitionTemplate, error) + // [Preview API] Gets all the work items between two builds. + GetWorkItemsBetweenBuilds(context.Context, GetWorkItemsBetweenBuildsArgs) (*[]webapi.ResourceRef, error) + // [Preview API] Gets a list of branches for the given source code repository. + ListBranches(context.Context, ListBranchesArgs) (*[]string, error) + // [Preview API] Gets a list of source code repositories. + ListRepositories(context.Context, ListRepositoriesArgs) (*SourceRepositories, error) + // [Preview API] Get a list of source providers and their capabilities. + ListSourceProviders(context.Context, ListSourceProvidersArgs) (*[]SourceProviderAttributes, error) + // [Preview API] Gets a list of webhooks installed in the given source code repository. + ListWebhooks(context.Context, ListWebhooksArgs) (*[]RepositoryWebhook, error) + // Queues a build + QueueBuild(context.Context, QueueBuildArgs) (*Build, error) + // Restores a deleted definition + RestoreDefinition(context.Context, RestoreDefinitionArgs) (*BuildDefinition, error) + // [Preview API] Recreates the webhooks for the specified triggers in the given source code repository. + RestoreWebhooks(context.Context, RestoreWebhooksArgs) error + // Updates an existing build definition template. + SaveTemplate(context.Context, SaveTemplateArgs) (*BuildDefinitionTemplate, error) + // Updates a build. + UpdateBuild(context.Context, UpdateBuildArgs) (*Build, error) + // [Preview API] Updates properties for a build. + UpdateBuildProperties(context.Context, UpdateBuildPropertiesArgs) (interface{}, error) + // Updates multiple builds. + UpdateBuilds(context.Context, UpdateBuildsArgs) (*[]Build, error) + // Updates the build settings. + UpdateBuildSettings(context.Context, UpdateBuildSettingsArgs) (*BuildSettings, error) + // Updates an existing definition. + UpdateDefinition(context.Context, UpdateDefinitionArgs) (*BuildDefinition, error) + // [Preview API] Updates properties for a definition. + UpdateDefinitionProperties(context.Context, UpdateDefinitionPropertiesArgs) (interface{}, error) + // [Preview API] Updates an existing folder at given existing path + UpdateFolder(context.Context, UpdateFolderArgs) (*Folder, error) +} + +type ClientImpl struct { Client azuredevops.Client } -func NewClient(ctx context.Context, connection *azuredevops.Connection) (*Client, error) { +func NewClient(ctx context.Context, connection *azuredevops.Connection) (Client, error) { client, err := connection.GetClientByResourceAreaId(ctx, ResourceAreaId) if err != nil { return nil, err } - return &Client{ + return &ClientImpl{ Client: *client, }, nil } +// Adds a tag to a build. +func (client *ClientImpl) AddBuildTag(ctx context.Context, args AddBuildTagArgs) (*[]string, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + if args.Tag == nil || *args.Tag == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Tag"} + } + routeValues["tag"] = *args.Tag + + locationId, _ := uuid.Parse("6e6114b2-8161-44c8-8f6c-c5505782427f") + resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []string + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the AddBuildTag function +type AddBuildTagArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int + // (required) The tag to add. + Tag *string +} + +// Adds tags to a build. +func (client *ClientImpl) AddBuildTags(ctx context.Context, args AddBuildTagsArgs) (*[]string, error) { + if args.Tags == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Tags"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + + body, marshalErr := json.Marshal(*args.Tags) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("6e6114b2-8161-44c8-8f6c-c5505782427f") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []string + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the AddBuildTags function +type AddBuildTagsArgs struct { + // (required) The tags to add. + Tags *[]string + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int +} + +// [Preview API] Adds a tag to a definition +func (client *ClientImpl) AddDefinitionTag(ctx context.Context, args AddDefinitionTagArgs) (*[]string, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.DefinitionId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} + } + routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) + if args.Tag == nil || *args.Tag == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Tag"} + } + routeValues["tag"] = *args.Tag + + locationId, _ := uuid.Parse("cb894432-134a-4d31-a839-83beceaace4b") + resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1-preview.2", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []string + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the AddDefinitionTag function +type AddDefinitionTagArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the definition. + DefinitionId *int + // (required) The tag to add. + Tag *string +} + +// [Preview API] Adds multiple tags to a definition. +func (client *ClientImpl) AddDefinitionTags(ctx context.Context, args AddDefinitionTagsArgs) (*[]string, error) { + if args.Tags == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Tags"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.DefinitionId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} + } + routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) + + body, marshalErr := json.Marshal(*args.Tags) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("cb894432-134a-4d31-a839-83beceaace4b") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.2", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []string + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the AddDefinitionTags function +type AddDefinitionTagsArgs struct { + // (required) The tags to add. + Tags *[]string + // (required) Project ID or project name + Project *string + // (required) The ID of the definition. + DefinitionId *int +} + +// [Preview API] +func (client *ClientImpl) AuthorizeDefinitionResources(ctx context.Context, args AuthorizeDefinitionResourcesArgs) (*[]DefinitionResourceReference, error) { + if args.Resources == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Resources"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.DefinitionId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} + } + routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) + + body, marshalErr := json.Marshal(*args.Resources) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("ea623316-1967-45eb-89ab-e9e6110cf2d6") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []DefinitionResourceReference + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the AuthorizeDefinitionResources function +type AuthorizeDefinitionResourcesArgs struct { + // (required) + Resources *[]DefinitionResourceReference + // (required) Project ID or project name + Project *string + // (required) + DefinitionId *int +} + +// [Preview API] +func (client *ClientImpl) AuthorizeProjectResources(ctx context.Context, args AuthorizeProjectResourcesArgs) (*[]DefinitionResourceReference, error) { + if args.Resources == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Resources"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + + body, marshalErr := json.Marshal(*args.Resources) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("398c85bc-81aa-4822-947c-a194a05f0fef") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []DefinitionResourceReference + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the AuthorizeProjectResources function +type AuthorizeProjectResourcesArgs struct { + // (required) + Resources *[]DefinitionResourceReference + // (required) Project ID or project name + Project *string +} + // Associates an artifact with a build. -func (client *Client) CreateArtifact(ctx context.Context, args CreateArtifactArgs) (*BuildArtifact, error) { +func (client *ClientImpl) CreateArtifact(ctx context.Context, args CreateArtifactArgs) (*BuildArtifact, error) { if args.Artifact == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Artifact"} } @@ -78,8 +465,285 @@ type CreateArtifactArgs struct { BuildId *int } +// Creates a new definition. +func (client *ClientImpl) CreateDefinition(ctx context.Context, args CreateDefinitionArgs) (*BuildDefinition, error) { + if args.Definition == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Definition"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + + queryParams := url.Values{} + if args.DefinitionToCloneId != nil { + queryParams.Add("definitionToCloneId", strconv.Itoa(*args.DefinitionToCloneId)) + } + if args.DefinitionToCloneRevision != nil { + queryParams.Add("definitionToCloneRevision", strconv.Itoa(*args.DefinitionToCloneRevision)) + } + body, marshalErr := json.Marshal(*args.Definition) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("dbeaf647-6167-421a-bda9-c9327b25e2e6") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue BuildDefinition + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateDefinition function +type CreateDefinitionArgs struct { + // (required) The definition. + Definition *BuildDefinition + // (required) Project ID or project name + Project *string + // (optional) + DefinitionToCloneId *int + // (optional) + DefinitionToCloneRevision *int +} + +// [Preview API] Creates a new folder. +func (client *ClientImpl) CreateFolder(ctx context.Context, args CreateFolderArgs) (*Folder, error) { + if args.Folder == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Folder"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + + queryParams := url.Values{} + if args.Path == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "path"} + } + queryParams.Add("path", *args.Path) + body, marshalErr := json.Marshal(*args.Folder) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("a906531b-d2da-4f55-bda7-f3e676cc50d9") + resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1-preview.2", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue Folder + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateFolder function +type CreateFolderArgs struct { + // (required) The folder. + Folder *Folder + // (required) Project ID or project name + Project *string + // (required) The full path of the folder. + Path *string +} + +// Deletes a build. +func (client *ClientImpl) DeleteBuild(ctx context.Context, args DeleteBuildArgs) error { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + + locationId, _ := uuid.Parse("0cd358e1-9217-4d94-8269-1c1ee6f93dcf") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeleteBuild function +type DeleteBuildArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int +} + +// Removes a tag from a build. +func (client *ClientImpl) DeleteBuildTag(ctx context.Context, args DeleteBuildTagArgs) (*[]string, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + if args.Tag == nil || *args.Tag == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Tag"} + } + routeValues["tag"] = *args.Tag + + locationId, _ := uuid.Parse("6e6114b2-8161-44c8-8f6c-c5505782427f") + resp, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []string + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the DeleteBuildTag function +type DeleteBuildTagArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int + // (required) The tag to remove. + Tag *string +} + +// Deletes a definition and all associated builds. +func (client *ClientImpl) DeleteDefinition(ctx context.Context, args DeleteDefinitionArgs) error { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.DefinitionId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} + } + routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) + + locationId, _ := uuid.Parse("dbeaf647-6167-421a-bda9-c9327b25e2e6") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeleteDefinition function +type DeleteDefinitionArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the definition. + DefinitionId *int +} + +// [Preview API] Removes a tag from a definition. +func (client *ClientImpl) DeleteDefinitionTag(ctx context.Context, args DeleteDefinitionTagArgs) (*[]string, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.DefinitionId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} + } + routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) + if args.Tag == nil || *args.Tag == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Tag"} + } + routeValues["tag"] = *args.Tag + + locationId, _ := uuid.Parse("cb894432-134a-4d31-a839-83beceaace4b") + resp, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.2", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []string + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the DeleteDefinitionTag function +type DeleteDefinitionTagArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the definition. + DefinitionId *int + // (required) The tag to remove. + Tag *string +} + +// [Preview API] Deletes a definition folder. Definitions and their corresponding builds will also be deleted. +func (client *ClientImpl) DeleteFolder(ctx context.Context, args DeleteFolderArgs) error { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + + queryParams := url.Values{} + if args.Path == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "path"} + } + queryParams.Add("path", *args.Path) + locationId, _ := uuid.Parse("a906531b-d2da-4f55-bda7-f3e676cc50d9") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.2", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeleteFolder function +type DeleteFolderArgs struct { + // (required) Project ID or project name + Project *string + // (required) The full path to the folder. + Path *string +} + +// Deletes a build definition template. +func (client *ClientImpl) DeleteTemplate(ctx context.Context, args DeleteTemplateArgs) error { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.TemplateId == nil || *args.TemplateId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.TemplateId"} + } + routeValues["templateId"] = *args.TemplateId + + locationId, _ := uuid.Parse("e884571e-7f92-4d6a-9274-3f5649900835") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeleteTemplate function +type DeleteTemplateArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the template. + TemplateId *string +} + // Gets a specific artifact for a build. -func (client *Client) GetArtifact(ctx context.Context, args GetArtifactArgs) (*BuildArtifact, error) { +func (client *ClientImpl) GetArtifact(ctx context.Context, args GetArtifactArgs) (*BuildArtifact, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -117,7 +781,7 @@ type GetArtifactArgs struct { } // Gets a specific artifact for a build. -func (client *Client) GetArtifactContentZip(ctx context.Context, args GetArtifactContentZipArgs) (io.ReadCloser, error) { +func (client *ClientImpl) GetArtifactContentZip(ctx context.Context, args GetArtifactContentZipArgs) (io.ReadCloser, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -153,7 +817,7 @@ type GetArtifactContentZipArgs struct { } // Gets all artifacts for a build. -func (client *Client) GetArtifacts(ctx context.Context, args GetArtifactsArgs) (*[]BuildArtifact, error) { +func (client *ClientImpl) GetArtifacts(ctx context.Context, args GetArtifactsArgs) (*[]BuildArtifact, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -183,93 +847,8 @@ type GetArtifactsArgs struct { BuildId *int } -// Gets a file from the build. -func (client *Client) GetFile(ctx context.Context, args GetFileArgs) (io.ReadCloser, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - - queryParams := url.Values{} - if args.ArtifactName == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "artifactName"} - } - queryParams.Add("artifactName", *args.ArtifactName) - if args.FileId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "fileId"} - } - queryParams.Add("fileId", *args.FileId) - if args.FileName == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "fileName"} - } - queryParams.Add("fileName", *args.FileName) - locationId, _ := uuid.Parse("1db06c96-014e-44e1-ac91-90b2d4b3e984") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/octet-stream", nil) - if err != nil { - return nil, err - } - - return resp.Body, err -} - -// Arguments for the GetFile function -type GetFileArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int - // (required) The name of the artifact. - ArtifactName *string - // (required) The primary key for the file. - FileId *string - // (required) The name that the file will be set to. - FileName *string -} - -// [Preview API] Gets the list of attachments of a specific type that are associated with a build. -func (client *Client) GetAttachments(ctx context.Context, args GetAttachmentsArgs) (*[]Attachment, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - if args.Type == nil || *args.Type == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Type"} - } - routeValues["type"] = *args.Type - - locationId, _ := uuid.Parse("f2192269-89fa-4f94-baf6-8fb128c55159") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.2", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []Attachment - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetAttachments function -type GetAttachmentsArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int - // (required) The type of attachment. - Type *string -} - // [Preview API] Gets a specific attachment. -func (client *Client) GetAttachment(ctx context.Context, args GetAttachmentArgs) (io.ReadCloser, error) { +func (client *ClientImpl) GetAttachment(ctx context.Context, args GetAttachmentArgs) (io.ReadCloser, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -321,125 +900,82 @@ type GetAttachmentArgs struct { Name *string } -// [Preview API] -func (client *Client) AuthorizeProjectResources(ctx context.Context, args AuthorizeProjectResourcesArgs) (*[]DefinitionResourceReference, error) { - if args.Resources == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Resources"} - } +// [Preview API] Gets the list of attachments of a specific type that are associated with a build. +func (client *ClientImpl) GetAttachments(ctx context.Context, args GetAttachmentsArgs) (*[]Attachment, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} } routeValues["project"] = *args.Project - - body, marshalErr := json.Marshal(*args.Resources) - if marshalErr != nil { - return nil, marshalErr + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} } - locationId, _ := uuid.Parse("398c85bc-81aa-4822-947c-a194a05f0fef") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + if args.Type == nil || *args.Type == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Type"} + } + routeValues["type"] = *args.Type + + locationId, _ := uuid.Parse("f2192269-89fa-4f94-baf6-8fb128c55159") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.2", routeValues, nil, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue []DefinitionResourceReference + var responseValue []Attachment err = client.Client.UnmarshalCollectionBody(resp, &responseValue) return &responseValue, err } -// Arguments for the AuthorizeProjectResources function -type AuthorizeProjectResourcesArgs struct { - // (required) - Resources *[]DefinitionResourceReference +// Arguments for the GetAttachments function +type GetAttachmentsArgs struct { // (required) Project ID or project name Project *string -} - -// [Preview API] -func (client *Client) GetProjectResources(ctx context.Context, args GetProjectResourcesArgs) (*[]DefinitionResourceReference, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - - queryParams := url.Values{} - if args.Type != nil { - queryParams.Add("type", *args.Type) - } - if args.Id != nil { - queryParams.Add("id", *args.Id) - } - locationId, _ := uuid.Parse("398c85bc-81aa-4822-947c-a194a05f0fef") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []DefinitionResourceReference - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetProjectResources function -type GetProjectResourcesArgs struct { - // (required) Project ID or project name - Project *string - // (optional) + // (required) The ID of the build. + BuildId *int + // (required) The type of attachment. Type *string - // (optional) - Id *string } -// [Preview API] Gets a list of branches for the given source code repository. -func (client *Client) ListBranches(ctx context.Context, args ListBranchesArgs) (*[]string, error) { +// Gets a build +func (client *ClientImpl) GetBuild(ctx context.Context, args GetBuildArgs) (*Build, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} } routeValues["project"] = *args.Project - if args.ProviderName == nil || *args.ProviderName == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProviderName"} + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} } - routeValues["providerName"] = *args.ProviderName + routeValues["buildId"] = strconv.Itoa(*args.BuildId) queryParams := url.Values{} - if args.ServiceEndpointId != nil { - queryParams.Add("serviceEndpointId", (*args.ServiceEndpointId).String()) + if args.PropertyFilters != nil { + queryParams.Add("propertyFilters", *args.PropertyFilters) } - if args.Repository != nil { - queryParams.Add("repository", *args.Repository) - } - if args.BranchName != nil { - queryParams.Add("branchName", *args.BranchName) - } - locationId, _ := uuid.Parse("e05d4403-9b81-4244-8763-20fde28d1976") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + locationId, _ := uuid.Parse("0cd358e1-9217-4d94-8269-1c1ee6f93dcf") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue []string - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + var responseValue Build + err = client.Client.UnmarshalBody(resp, &responseValue) return &responseValue, err } -// Arguments for the ListBranches function -type ListBranchesArgs struct { +// Arguments for the GetBuild function +type GetBuildArgs struct { // (required) Project ID or project name Project *string - // (required) The name of the source provider. - ProviderName *string - // (optional) If specified, the ID of the service endpoint to query. Can only be omitted for providers that do not use service endpoints, e.g. TFVC or TFGit. - ServiceEndpointId *uuid.UUID - // (optional) The vendor-specific identifier or the name of the repository to get branches. Can only be omitted for providers that do not support multiple repositories. - Repository *string - // (optional) If supplied, the name of the branch to check for specifically. - BranchName *string + // (required) + BuildId *int + // (optional) + PropertyFilters *string } // [Preview API] Gets a badge that indicates the status of the most recent build for the specified branch. -func (client *Client) GetBuildBadge(ctx context.Context, args GetBuildBadgeArgs) (*BuildBadge, error) { +func (client *ClientImpl) GetBuildBadge(ctx context.Context, args GetBuildBadgeArgs) (*BuildBadge, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -481,7 +1017,7 @@ type GetBuildBadgeArgs struct { } // [Preview API] Gets a badge that indicates the status of the most recent build for the specified branch. -func (client *Client) GetBuildBadgeData(ctx context.Context, args GetBuildBadgeDataArgs) (*string, error) { +func (client *ClientImpl) GetBuildBadgeData(ctx context.Context, args GetBuildBadgeDataArgs) (*string, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -522,37 +1058,8 @@ type GetBuildBadgeDataArgs struct { BranchName *string } -// Deletes a build. -func (client *Client) DeleteBuild(ctx context.Context, args DeleteBuildArgs) error { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.BuildId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - - locationId, _ := uuid.Parse("0cd358e1-9217-4d94-8269-1c1ee6f93dcf") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeleteBuild function -type DeleteBuildArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int -} - -// Gets a build -func (client *Client) GetBuild(ctx context.Context, args GetBuildArgs) (*Build, error) { +// Gets the changes associated with a build +func (client *ClientImpl) GetBuildChanges(ctx context.Context, args GetBuildChangesArgs) (*GetBuildChangesResponseValue, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -564,32 +1071,432 @@ func (client *Client) GetBuild(ctx context.Context, args GetBuildArgs) (*Build, routeValues["buildId"] = strconv.Itoa(*args.BuildId) queryParams := url.Values{} - if args.PropertyFilters != nil { - queryParams.Add("propertyFilters", *args.PropertyFilters) + if args.ContinuationToken != nil { + queryParams.Add("continuationToken", *args.ContinuationToken) } - locationId, _ := uuid.Parse("0cd358e1-9217-4d94-8269-1c1ee6f93dcf") + if args.Top != nil { + queryParams.Add("$top", strconv.Itoa(*args.Top)) + } + if args.IncludeSourceChange != nil { + queryParams.Add("includeSourceChange", strconv.FormatBool(*args.IncludeSourceChange)) + } + locationId, _ := uuid.Parse("54572c7b-bbd3-45d4-80dc-28be08941620") resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue Build - err = client.Client.UnmarshalBody(resp, &responseValue) + var responseValue GetBuildChangesResponseValue + responseValue.ContinuationToken = resp.Header.Get(azuredevops.HeaderKeyContinuationToken) + err = client.Client.UnmarshalCollectionBody(resp, &responseValue.Value) return &responseValue, err } -// Arguments for the GetBuild function -type GetBuildArgs struct { +// Arguments for the GetBuildChanges function +type GetBuildChangesArgs struct { // (required) Project ID or project name Project *string // (required) BuildId *int // (optional) - PropertyFilters *string + ContinuationToken *string + // (optional) The maximum number of changes to return + Top *int + // (optional) + IncludeSourceChange *bool +} + +// Return type for the GetBuildChanges function +type GetBuildChangesResponseValue struct { + Value []Change + // The continuation token to be used to get the next page of results. + ContinuationToken string +} + +// Gets a controller +func (client *ClientImpl) GetBuildController(ctx context.Context, args GetBuildControllerArgs) (*BuildController, error) { + routeValues := make(map[string]string) + if args.ControllerId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ControllerId"} + } + routeValues["controllerId"] = strconv.Itoa(*args.ControllerId) + + locationId, _ := uuid.Parse("fcac1932-2ee1-437f-9b6f-7f696be858f6") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue BuildController + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetBuildController function +type GetBuildControllerArgs struct { + // (required) + ControllerId *int +} + +// Gets controller, optionally filtered by name +func (client *ClientImpl) GetBuildControllers(ctx context.Context, args GetBuildControllersArgs) (*[]BuildController, error) { + queryParams := url.Values{} + if args.Name != nil { + queryParams.Add("name", *args.Name) + } + locationId, _ := uuid.Parse("fcac1932-2ee1-437f-9b6f-7f696be858f6") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", nil, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []BuildController + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetBuildControllers function +type GetBuildControllersArgs struct { + // (optional) + Name *string +} + +// Gets an individual log file for a build. +func (client *ClientImpl) GetBuildLog(ctx context.Context, args GetBuildLogArgs) (io.ReadCloser, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + if args.LogId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.LogId"} + } + routeValues["logId"] = strconv.Itoa(*args.LogId) + + queryParams := url.Values{} + if args.StartLine != nil { + queryParams.Add("startLine", strconv.FormatUint(*args.StartLine, 10)) + } + if args.EndLine != nil { + queryParams.Add("endLine", strconv.FormatUint(*args.EndLine, 10)) + } + locationId, _ := uuid.Parse("35a80daf-7f30-45fc-86e8-6b813d9c90df") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "text/plain", nil) + if err != nil { + return nil, err + } + + return resp.Body, err +} + +// Arguments for the GetBuildLog function +type GetBuildLogArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int + // (required) The ID of the log file. + LogId *int + // (optional) The start line. + StartLine *uint64 + // (optional) The end line. + EndLine *uint64 +} + +// Gets an individual log file for a build. +func (client *ClientImpl) GetBuildLogLines(ctx context.Context, args GetBuildLogLinesArgs) (*[]string, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + if args.LogId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.LogId"} + } + routeValues["logId"] = strconv.Itoa(*args.LogId) + + queryParams := url.Values{} + if args.StartLine != nil { + queryParams.Add("startLine", strconv.FormatUint(*args.StartLine, 10)) + } + if args.EndLine != nil { + queryParams.Add("endLine", strconv.FormatUint(*args.EndLine, 10)) + } + locationId, _ := uuid.Parse("35a80daf-7f30-45fc-86e8-6b813d9c90df") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []string + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetBuildLogLines function +type GetBuildLogLinesArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int + // (required) The ID of the log file. + LogId *int + // (optional) The start line. + StartLine *uint64 + // (optional) The end line. + EndLine *uint64 +} + +// Gets the logs for a build. +func (client *ClientImpl) GetBuildLogs(ctx context.Context, args GetBuildLogsArgs) (*[]BuildLog, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + + locationId, _ := uuid.Parse("35a80daf-7f30-45fc-86e8-6b813d9c90df") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []BuildLog + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetBuildLogs function +type GetBuildLogsArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int +} + +// Gets the logs for a build. +func (client *ClientImpl) GetBuildLogsZip(ctx context.Context, args GetBuildLogsZipArgs) (io.ReadCloser, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + + locationId, _ := uuid.Parse("35a80daf-7f30-45fc-86e8-6b813d9c90df") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/zip", nil) + if err != nil { + return nil, err + } + + return resp.Body, err +} + +// Arguments for the GetBuildLogsZip function +type GetBuildLogsZipArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int +} + +// Gets an individual log file for a build. +func (client *ClientImpl) GetBuildLogZip(ctx context.Context, args GetBuildLogZipArgs) (io.ReadCloser, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + if args.LogId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.LogId"} + } + routeValues["logId"] = strconv.Itoa(*args.LogId) + + queryParams := url.Values{} + if args.StartLine != nil { + queryParams.Add("startLine", strconv.FormatUint(*args.StartLine, 10)) + } + if args.EndLine != nil { + queryParams.Add("endLine", strconv.FormatUint(*args.EndLine, 10)) + } + locationId, _ := uuid.Parse("35a80daf-7f30-45fc-86e8-6b813d9c90df") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/zip", nil) + if err != nil { + return nil, err + } + + return resp.Body, err +} + +// Arguments for the GetBuildLogZip function +type GetBuildLogZipArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int + // (required) The ID of the log file. + LogId *int + // (optional) The start line. + StartLine *uint64 + // (optional) The end line. + EndLine *uint64 +} + +// Gets all build definition options supported by the system. +func (client *ClientImpl) GetBuildOptionDefinitions(ctx context.Context, args GetBuildOptionDefinitionsArgs) (*[]BuildOptionDefinition, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + + locationId, _ := uuid.Parse("591cb5a4-2d46-4f3a-a697-5cd42b6bd332") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []BuildOptionDefinition + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetBuildOptionDefinitions function +type GetBuildOptionDefinitionsArgs struct { + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Gets properties for a build. +func (client *ClientImpl) GetBuildProperties(ctx context.Context, args GetBuildPropertiesArgs) (interface{}, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + + queryParams := url.Values{} + if args.Filter != nil { + listAsString := strings.Join((*args.Filter)[:], ",") + queryParams.Add("filter", listAsString) + } + locationId, _ := uuid.Parse("0a6312e9-0627-49b7-8083-7d74a64849c9") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue interface{} + err = client.Client.UnmarshalBody(resp, responseValue) + return responseValue, err +} + +// Arguments for the GetBuildProperties function +type GetBuildPropertiesArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int + // (optional) A comma-delimited list of properties. If specified, filters to these specific properties. + Filter *[]string +} + +// [Preview API] Gets a build report. +func (client *ClientImpl) GetBuildReport(ctx context.Context, args GetBuildReportArgs) (*BuildReportMetadata, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + + queryParams := url.Values{} + if args.Type != nil { + queryParams.Add("type", *args.Type) + } + locationId, _ := uuid.Parse("45bcaa88-67e1-4042-a035-56d3b4a7d44c") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.2", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue BuildReportMetadata + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetBuildReport function +type GetBuildReportArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int + // (optional) + Type *string +} + +// [Preview API] Gets a build report. +func (client *ClientImpl) GetBuildReportHtmlContent(ctx context.Context, args GetBuildReportHtmlContentArgs) (io.ReadCloser, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + + queryParams := url.Values{} + if args.Type != nil { + queryParams.Add("type", *args.Type) + } + locationId, _ := uuid.Parse("45bcaa88-67e1-4042-a035-56d3b4a7d44c") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.2", routeValues, queryParams, nil, "", "text/html", nil) + if err != nil { + return nil, err + } + + return resp.Body, err +} + +// Arguments for the GetBuildReportHtmlContent function +type GetBuildReportHtmlContentArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int + // (optional) + Type *string } // Gets a list of builds. -func (client *Client) GetBuilds(ctx context.Context, args GetBuildsArgs) (*GetBuildsResponseValue, error) { +func (client *ClientImpl) GetBuilds(ctx context.Context, args GetBuildsArgs) (*GetBuildsResponseValue, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -739,61 +1646,32 @@ type GetBuildsResponseValue struct { ContinuationToken string } -// Queues a build -func (client *Client) QueueBuild(ctx context.Context, args QueueBuildArgs) (*Build, error) { - if args.Build == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Build"} - } +// Gets the build settings. +func (client *ClientImpl) GetBuildSettings(ctx context.Context, args GetBuildSettingsArgs) (*BuildSettings, error) { routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project } - routeValues["project"] = *args.Project - queryParams := url.Values{} - if args.IgnoreWarnings != nil { - queryParams.Add("ignoreWarnings", strconv.FormatBool(*args.IgnoreWarnings)) - } - if args.CheckInTicket != nil { - queryParams.Add("checkInTicket", *args.CheckInTicket) - } - if args.SourceBuildId != nil { - queryParams.Add("sourceBuildId", strconv.Itoa(*args.SourceBuildId)) - } - body, marshalErr := json.Marshal(*args.Build) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("0cd358e1-9217-4d94-8269-1c1ee6f93dcf") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) + locationId, _ := uuid.Parse("aa8c1c9c-ef8b-474a-b8c4-785c7b191d0d") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue Build + var responseValue BuildSettings err = client.Client.UnmarshalBody(resp, &responseValue) return &responseValue, err } -// Arguments for the QueueBuild function -type QueueBuildArgs struct { - // (required) - Build *Build - // (required) Project ID or project name +// Arguments for the GetBuildSettings function +type GetBuildSettingsArgs struct { + // (optional) Project ID or project name Project *string - // (optional) - IgnoreWarnings *bool - // (optional) - CheckInTicket *string - // (optional) - SourceBuildId *int } -// Updates a build. -func (client *Client) UpdateBuild(ctx context.Context, args UpdateBuildArgs) (*Build, error) { - if args.Build == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Build"} - } +// Gets the tags for a build. +func (client *ClientImpl) GetBuildTags(ctx context.Context, args GetBuildTagsArgs) (*[]string, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -804,73 +1682,27 @@ func (client *Client) UpdateBuild(ctx context.Context, args UpdateBuildArgs) (*B } routeValues["buildId"] = strconv.Itoa(*args.BuildId) - queryParams := url.Values{} - if args.Retry != nil { - queryParams.Add("retry", strconv.FormatBool(*args.Retry)) - } - body, marshalErr := json.Marshal(*args.Build) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("0cd358e1-9217-4d94-8269-1c1ee6f93dcf") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) + locationId, _ := uuid.Parse("6e6114b2-8161-44c8-8f6c-c5505782427f") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue Build - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdateBuild function -type UpdateBuildArgs struct { - // (required) The build. - Build *Build - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int - // (optional) - Retry *bool -} - -// Updates multiple builds. -func (client *Client) UpdateBuilds(ctx context.Context, args UpdateBuildsArgs) (*[]Build, error) { - if args.Builds == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Builds"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - - body, marshalErr := json.Marshal(*args.Builds) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("0cd358e1-9217-4d94-8269-1c1ee6f93dcf") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []Build + var responseValue []string err = client.Client.UnmarshalCollectionBody(resp, &responseValue) return &responseValue, err } -// Arguments for the UpdateBuilds function -type UpdateBuildsArgs struct { - // (required) The builds to update. - Builds *[]Build +// Arguments for the GetBuildTags function +type GetBuildTagsArgs struct { // (required) Project ID or project name Project *string + // (required) The ID of the build. + BuildId *int } -// Gets the changes associated with a build -func (client *Client) GetBuildChanges(ctx context.Context, args GetBuildChangesArgs) (*GetBuildChangesResponseValue, error) { +// Gets details for a build +func (client *ClientImpl) GetBuildTimeline(ctx context.Context, args GetBuildTimelineArgs) (*Timeline, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -880,52 +1712,127 @@ func (client *Client) GetBuildChanges(ctx context.Context, args GetBuildChangesA return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} } routeValues["buildId"] = strconv.Itoa(*args.BuildId) + if args.TimelineId != nil { + routeValues["timelineId"] = (*args.TimelineId).String() + } queryParams := url.Values{} - if args.ContinuationToken != nil { - queryParams.Add("continuationToken", *args.ContinuationToken) + if args.ChangeId != nil { + queryParams.Add("changeId", strconv.Itoa(*args.ChangeId)) } - if args.Top != nil { - queryParams.Add("$top", strconv.Itoa(*args.Top)) + if args.PlanId != nil { + queryParams.Add("planId", (*args.PlanId).String()) } - if args.IncludeSourceChange != nil { - queryParams.Add("includeSourceChange", strconv.FormatBool(*args.IncludeSourceChange)) - } - locationId, _ := uuid.Parse("54572c7b-bbd3-45d4-80dc-28be08941620") + locationId, _ := uuid.Parse("8baac422-4c6e-4de5-8532-db96d92acffa") resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue GetBuildChangesResponseValue - responseValue.ContinuationToken = resp.Header.Get(azuredevops.HeaderKeyContinuationToken) - err = client.Client.UnmarshalCollectionBody(resp, &responseValue.Value) + var responseValue Timeline + err = client.Client.UnmarshalBody(resp, &responseValue) return &responseValue, err } -// Arguments for the GetBuildChanges function -type GetBuildChangesArgs struct { +// Arguments for the GetBuildTimeline function +type GetBuildTimelineArgs struct { // (required) Project ID or project name Project *string // (required) BuildId *int // (optional) - ContinuationToken *string - // (optional) The maximum number of changes to return - Top *int + TimelineId *uuid.UUID // (optional) - IncludeSourceChange *bool + ChangeId *int + // (optional) + PlanId *uuid.UUID } -// Return type for the GetBuildChanges function -type GetBuildChangesResponseValue struct { - Value []Change - // The continuation token to be used to get the next page of results. - ContinuationToken string +// Gets the work items associated with a build. +func (client *ClientImpl) GetBuildWorkItemsRefs(ctx context.Context, args GetBuildWorkItemsRefsArgs) (*[]webapi.ResourceRef, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + + queryParams := url.Values{} + if args.Top != nil { + queryParams.Add("$top", strconv.Itoa(*args.Top)) + } + locationId, _ := uuid.Parse("5a21f5d2-5642-47e4-a0bd-1356e6731bee") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []webapi.ResourceRef + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetBuildWorkItemsRefs function +type GetBuildWorkItemsRefsArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int + // (optional) The maximum number of work items to return. + Top *int +} + +// Gets the work items associated with a build, filtered to specific commits. +func (client *ClientImpl) GetBuildWorkItemsRefsFromCommits(ctx context.Context, args GetBuildWorkItemsRefsFromCommitsArgs) (*[]webapi.ResourceRef, error) { + if args.CommitIds == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.CommitIds"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + + queryParams := url.Values{} + if args.Top != nil { + queryParams.Add("$top", strconv.Itoa(*args.Top)) + } + body, marshalErr := json.Marshal(*args.CommitIds) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("5a21f5d2-5642-47e4-a0bd-1356e6731bee") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []webapi.ResourceRef + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetBuildWorkItemsRefsFromCommits function +type GetBuildWorkItemsRefsFromCommitsArgs struct { + // (required) A comma-delimited list of commit IDs. + CommitIds *[]string + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int + // (optional) The maximum number of work items to return, or the number of commits to consider if no commit IDs are specified. + Top *int } // [Preview API] Gets the changes made to the repository between two given builds. -func (client *Client) GetChangesBetweenBuilds(ctx context.Context, args GetChangesBetweenBuildsArgs) (*[]Change, error) { +func (client *ClientImpl) GetChangesBetweenBuilds(ctx context.Context, args GetChangesBetweenBuildsArgs) (*[]Change, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -965,130 +1872,8 @@ type GetChangesBetweenBuildsArgs struct { Top *int } -// Gets a controller -func (client *Client) GetBuildController(ctx context.Context, args GetBuildControllerArgs) (*BuildController, error) { - routeValues := make(map[string]string) - if args.ControllerId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ControllerId"} - } - routeValues["controllerId"] = strconv.Itoa(*args.ControllerId) - - locationId, _ := uuid.Parse("fcac1932-2ee1-437f-9b6f-7f696be858f6") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue BuildController - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetBuildController function -type GetBuildControllerArgs struct { - // (required) - ControllerId *int -} - -// Gets controller, optionally filtered by name -func (client *Client) GetBuildControllers(ctx context.Context, args GetBuildControllersArgs) (*[]BuildController, error) { - queryParams := url.Values{} - if args.Name != nil { - queryParams.Add("name", *args.Name) - } - locationId, _ := uuid.Parse("fcac1932-2ee1-437f-9b6f-7f696be858f6") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", nil, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []BuildController - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetBuildControllers function -type GetBuildControllersArgs struct { - // (optional) - Name *string -} - -// Creates a new definition. -func (client *Client) CreateDefinition(ctx context.Context, args CreateDefinitionArgs) (*BuildDefinition, error) { - if args.Definition == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Definition"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - - queryParams := url.Values{} - if args.DefinitionToCloneId != nil { - queryParams.Add("definitionToCloneId", strconv.Itoa(*args.DefinitionToCloneId)) - } - if args.DefinitionToCloneRevision != nil { - queryParams.Add("definitionToCloneRevision", strconv.Itoa(*args.DefinitionToCloneRevision)) - } - body, marshalErr := json.Marshal(*args.Definition) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("dbeaf647-6167-421a-bda9-c9327b25e2e6") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue BuildDefinition - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateDefinition function -type CreateDefinitionArgs struct { - // (required) The definition. - Definition *BuildDefinition - // (required) Project ID or project name - Project *string - // (optional) - DefinitionToCloneId *int - // (optional) - DefinitionToCloneRevision *int -} - -// Deletes a definition and all associated builds. -func (client *Client) DeleteDefinition(ctx context.Context, args DeleteDefinitionArgs) error { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.DefinitionId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} - } - routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) - - locationId, _ := uuid.Parse("dbeaf647-6167-421a-bda9-c9327b25e2e6") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeleteDefinition function -type DeleteDefinitionArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the definition. - DefinitionId *int -} - // Gets a definition, optionally at a specific revision. -func (client *Client) GetDefinition(ctx context.Context, args GetDefinitionArgs) (*BuildDefinition, error) { +func (client *ClientImpl) GetDefinition(ctx context.Context, args GetDefinitionArgs) (*BuildDefinition, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1140,8 +1925,145 @@ type GetDefinitionArgs struct { IncludeLatestBuilds *bool } +// [Preview API] Gets build metrics for a definition. +func (client *ClientImpl) GetDefinitionMetrics(ctx context.Context, args GetDefinitionMetricsArgs) (*[]BuildMetric, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.DefinitionId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} + } + routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) + + queryParams := url.Values{} + if args.MinMetricsTime != nil { + queryParams.Add("minMetricsTime", (*args.MinMetricsTime).String()) + } + locationId, _ := uuid.Parse("d973b939-0ce0-4fec-91d8-da3940fa1827") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []BuildMetric + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetDefinitionMetrics function +type GetDefinitionMetricsArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the definition. + DefinitionId *int + // (optional) The date from which to calculate metrics. + MinMetricsTime *azuredevops.Time +} + +// [Preview API] Gets properties for a definition. +func (client *ClientImpl) GetDefinitionProperties(ctx context.Context, args GetDefinitionPropertiesArgs) (interface{}, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.DefinitionId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} + } + routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) + + queryParams := url.Values{} + if args.Filter != nil { + listAsString := strings.Join((*args.Filter)[:], ",") + queryParams.Add("filter", listAsString) + } + locationId, _ := uuid.Parse("d9826ad7-2a68-46a9-a6e9-677698777895") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue interface{} + err = client.Client.UnmarshalBody(resp, responseValue) + return responseValue, err +} + +// Arguments for the GetDefinitionProperties function +type GetDefinitionPropertiesArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the definition. + DefinitionId *int + // (optional) A comma-delimited list of properties. If specified, filters to these specific properties. + Filter *[]string +} + +// [Preview API] +func (client *ClientImpl) GetDefinitionResources(ctx context.Context, args GetDefinitionResourcesArgs) (*[]DefinitionResourceReference, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.DefinitionId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} + } + routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) + + locationId, _ := uuid.Parse("ea623316-1967-45eb-89ab-e9e6110cf2d6") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []DefinitionResourceReference + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetDefinitionResources function +type GetDefinitionResourcesArgs struct { + // (required) Project ID or project name + Project *string + // (required) + DefinitionId *int +} + +// Gets all revisions of a definition. +func (client *ClientImpl) GetDefinitionRevisions(ctx context.Context, args GetDefinitionRevisionsArgs) (*[]BuildDefinitionRevision, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.DefinitionId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} + } + routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) + + locationId, _ := uuid.Parse("7c116775-52e5-453e-8c5d-914d9762d8c4") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []BuildDefinitionRevision + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetDefinitionRevisions function +type GetDefinitionRevisionsArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the definition. + DefinitionId *int +} + // Gets a list of definitions. -func (client *Client) GetDefinitions(ctx context.Context, args GetDefinitionsArgs) (*GetDefinitionsResponseValue, error) { +func (client *ClientImpl) GetDefinitions(ctx context.Context, args GetDefinitionsArgs) (*GetDefinitionsResponseValue, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1259,8 +2181,8 @@ type GetDefinitionsResponseValue struct { ContinuationToken string } -// Restores a deleted definition -func (client *Client) RestoreDefinition(ctx context.Context, args RestoreDefinitionArgs) (*BuildDefinition, error) { +// [Preview API] Gets the tags for a definition. +func (client *ClientImpl) GetDefinitionTags(ctx context.Context, args GetDefinitionTagsArgs) (*[]string, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1272,84 +2194,80 @@ func (client *Client) RestoreDefinition(ctx context.Context, args RestoreDefinit routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) queryParams := url.Values{} - if args.Deleted == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "deleted"} + if args.Revision != nil { + queryParams.Add("revision", strconv.Itoa(*args.Revision)) } - queryParams.Add("deleted", strconv.FormatBool(*args.Deleted)) - locationId, _ := uuid.Parse("dbeaf647-6167-421a-bda9-c9327b25e2e6") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) + locationId, _ := uuid.Parse("cb894432-134a-4d31-a839-83beceaace4b") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.2", routeValues, queryParams, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue BuildDefinition - err = client.Client.UnmarshalBody(resp, &responseValue) + var responseValue []string + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) return &responseValue, err } -// Arguments for the RestoreDefinition function -type RestoreDefinitionArgs struct { - // (required) Project ID or project name - Project *string - // (required) The identifier of the definition to restore. - DefinitionId *int - // (required) When false, restores a deleted definition. - Deleted *bool -} - -// Updates an existing definition. -func (client *Client) UpdateDefinition(ctx context.Context, args UpdateDefinitionArgs) (*BuildDefinition, error) { - if args.Definition == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Definition"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.DefinitionId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} - } - routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) - - queryParams := url.Values{} - if args.SecretsSourceDefinitionId != nil { - queryParams.Add("secretsSourceDefinitionId", strconv.Itoa(*args.SecretsSourceDefinitionId)) - } - if args.SecretsSourceDefinitionRevision != nil { - queryParams.Add("secretsSourceDefinitionRevision", strconv.Itoa(*args.SecretsSourceDefinitionRevision)) - } - body, marshalErr := json.Marshal(*args.Definition) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("dbeaf647-6167-421a-bda9-c9327b25e2e6") - resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue BuildDefinition - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdateDefinition function -type UpdateDefinitionArgs struct { - // (required) The new version of the defintion. - Definition *BuildDefinition +// Arguments for the GetDefinitionTags function +type GetDefinitionTagsArgs struct { // (required) Project ID or project name Project *string // (required) The ID of the definition. DefinitionId *int - // (optional) - SecretsSourceDefinitionId *int - // (optional) - SecretsSourceDefinitionRevision *int + // (optional) The definition revision number. If not specified, uses the latest revision of the definition. + Revision *int +} + +// Gets a file from the build. +func (client *ClientImpl) GetFile(ctx context.Context, args GetFileArgs) (io.ReadCloser, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + + queryParams := url.Values{} + if args.ArtifactName == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "artifactName"} + } + queryParams.Add("artifactName", *args.ArtifactName) + if args.FileId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "fileId"} + } + queryParams.Add("fileId", *args.FileId) + if args.FileName == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "fileName"} + } + queryParams.Add("fileName", *args.FileName) + locationId, _ := uuid.Parse("1db06c96-014e-44e1-ac91-90b2d4b3e984") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/octet-stream", nil) + if err != nil { + return nil, err + } + + return resp.Body, err +} + +// Arguments for the GetFile function +type GetFileArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int + // (required) The name of the artifact. + ArtifactName *string + // (required) The primary key for the file. + FileId *string + // (required) The name that the file will be set to. + FileName *string } // [Preview API] Gets the contents of a file in the given source code repository. -func (client *Client) GetFileContents(ctx context.Context, args GetFileContentsArgs) (io.ReadCloser, error) { +func (client *ClientImpl) GetFileContents(ctx context.Context, args GetFileContentsArgs) (io.ReadCloser, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1398,79 +2316,8 @@ type GetFileContentsArgs struct { Path *string } -// [Preview API] Creates a new folder. -func (client *Client) CreateFolder(ctx context.Context, args CreateFolderArgs) (*Folder, error) { - if args.Folder == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Folder"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - - queryParams := url.Values{} - if args.Path == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "path"} - } - queryParams.Add("path", *args.Path) - body, marshalErr := json.Marshal(*args.Folder) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("a906531b-d2da-4f55-bda7-f3e676cc50d9") - resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1-preview.2", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue Folder - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateFolder function -type CreateFolderArgs struct { - // (required) The folder. - Folder *Folder - // (required) Project ID or project name - Project *string - // (required) The full path of the folder. - Path *string -} - -// [Preview API] Deletes a definition folder. Definitions and their corresponding builds will also be deleted. -func (client *Client) DeleteFolder(ctx context.Context, args DeleteFolderArgs) error { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - - queryParams := url.Values{} - if args.Path == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "path"} - } - queryParams.Add("path", *args.Path) - locationId, _ := uuid.Parse("a906531b-d2da-4f55-bda7-f3e676cc50d9") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.2", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeleteFolder function -type DeleteFolderArgs struct { - // (required) Project ID or project name - Project *string - // (required) The full path to the folder. - Path *string -} - // [Preview API] Gets a list of build definition folders. -func (client *Client) GetFolders(ctx context.Context, args GetFoldersArgs) (*[]Folder, error) { +func (client *ClientImpl) GetFolders(ctx context.Context, args GetFoldersArgs) (*[]Folder, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1505,49 +2352,8 @@ type GetFoldersArgs struct { QueryOrder *FolderQueryOrder } -// [Preview API] Updates an existing folder at given existing path -func (client *Client) UpdateFolder(ctx context.Context, args UpdateFolderArgs) (*Folder, error) { - if args.Folder == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Folder"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - - queryParams := url.Values{} - if args.Path == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "path"} - } - queryParams.Add("path", *args.Path) - body, marshalErr := json.Marshal(*args.Folder) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("a906531b-d2da-4f55-bda7-f3e676cc50d9") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.2", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue Folder - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdateFolder function -type UpdateFolderArgs struct { - // (required) The new version of the folder. - Folder *Folder - // (required) Project ID or project name - Project *string - // (required) The full path to the folder. - Path *string -} - // [Preview API] Gets the latest build for a definition, optionally scoped to a specific branch. -func (client *Client) GetLatestBuild(ctx context.Context, args GetLatestBuildArgs) (*Build, error) { +func (client *ClientImpl) GetLatestBuild(ctx context.Context, args GetLatestBuildArgs) (*Build, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1583,305 +2389,8 @@ type GetLatestBuildArgs struct { BranchName *string } -// Gets an individual log file for a build. -func (client *Client) GetBuildLog(ctx context.Context, args GetBuildLogArgs) (io.ReadCloser, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - if args.LogId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.LogId"} - } - routeValues["logId"] = strconv.Itoa(*args.LogId) - - queryParams := url.Values{} - if args.StartLine != nil { - queryParams.Add("startLine", strconv.FormatUint(*args.StartLine, 10)) - } - if args.EndLine != nil { - queryParams.Add("endLine", strconv.FormatUint(*args.EndLine, 10)) - } - locationId, _ := uuid.Parse("35a80daf-7f30-45fc-86e8-6b813d9c90df") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "text/plain", nil) - if err != nil { - return nil, err - } - - return resp.Body, err -} - -// Arguments for the GetBuildLog function -type GetBuildLogArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int - // (required) The ID of the log file. - LogId *int - // (optional) The start line. - StartLine *uint64 - // (optional) The end line. - EndLine *uint64 -} - -// Gets an individual log file for a build. -func (client *Client) GetBuildLogLines(ctx context.Context, args GetBuildLogLinesArgs) (*[]string, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - if args.LogId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.LogId"} - } - routeValues["logId"] = strconv.Itoa(*args.LogId) - - queryParams := url.Values{} - if args.StartLine != nil { - queryParams.Add("startLine", strconv.FormatUint(*args.StartLine, 10)) - } - if args.EndLine != nil { - queryParams.Add("endLine", strconv.FormatUint(*args.EndLine, 10)) - } - locationId, _ := uuid.Parse("35a80daf-7f30-45fc-86e8-6b813d9c90df") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []string - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetBuildLogLines function -type GetBuildLogLinesArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int - // (required) The ID of the log file. - LogId *int - // (optional) The start line. - StartLine *uint64 - // (optional) The end line. - EndLine *uint64 -} - -// Gets the logs for a build. -func (client *Client) GetBuildLogs(ctx context.Context, args GetBuildLogsArgs) (*[]BuildLog, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - - locationId, _ := uuid.Parse("35a80daf-7f30-45fc-86e8-6b813d9c90df") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []BuildLog - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetBuildLogs function -type GetBuildLogsArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int -} - -// Gets the logs for a build. -func (client *Client) GetBuildLogsZip(ctx context.Context, args GetBuildLogsZipArgs) (io.ReadCloser, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - - locationId, _ := uuid.Parse("35a80daf-7f30-45fc-86e8-6b813d9c90df") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/zip", nil) - if err != nil { - return nil, err - } - - return resp.Body, err -} - -// Arguments for the GetBuildLogsZip function -type GetBuildLogsZipArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int -} - -// Gets an individual log file for a build. -func (client *Client) GetBuildLogZip(ctx context.Context, args GetBuildLogZipArgs) (io.ReadCloser, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - if args.LogId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.LogId"} - } - routeValues["logId"] = strconv.Itoa(*args.LogId) - - queryParams := url.Values{} - if args.StartLine != nil { - queryParams.Add("startLine", strconv.FormatUint(*args.StartLine, 10)) - } - if args.EndLine != nil { - queryParams.Add("endLine", strconv.FormatUint(*args.EndLine, 10)) - } - locationId, _ := uuid.Parse("35a80daf-7f30-45fc-86e8-6b813d9c90df") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/zip", nil) - if err != nil { - return nil, err - } - - return resp.Body, err -} - -// Arguments for the GetBuildLogZip function -type GetBuildLogZipArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int - // (required) The ID of the log file. - LogId *int - // (optional) The start line. - StartLine *uint64 - // (optional) The end line. - EndLine *uint64 -} - -// [Preview API] Gets build metrics for a project. -func (client *Client) GetProjectMetrics(ctx context.Context, args GetProjectMetricsArgs) (*[]BuildMetric, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.MetricAggregationType != nil && *args.MetricAggregationType != "" { - routeValues["metricAggregationType"] = *args.MetricAggregationType - } - - queryParams := url.Values{} - if args.MinMetricsTime != nil { - queryParams.Add("minMetricsTime", (*args.MinMetricsTime).String()) - } - locationId, _ := uuid.Parse("7433fae7-a6bc-41dc-a6e2-eef9005ce41a") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []BuildMetric - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetProjectMetrics function -type GetProjectMetricsArgs struct { - // (required) Project ID or project name - Project *string - // (optional) The aggregation type to use (hourly, daily). - MetricAggregationType *string - // (optional) The date from which to calculate metrics. - MinMetricsTime *azuredevops.Time -} - -// [Preview API] Gets build metrics for a definition. -func (client *Client) GetDefinitionMetrics(ctx context.Context, args GetDefinitionMetricsArgs) (*[]BuildMetric, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.DefinitionId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} - } - routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) - - queryParams := url.Values{} - if args.MinMetricsTime != nil { - queryParams.Add("minMetricsTime", (*args.MinMetricsTime).String()) - } - locationId, _ := uuid.Parse("d973b939-0ce0-4fec-91d8-da3940fa1827") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []BuildMetric - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetDefinitionMetrics function -type GetDefinitionMetricsArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the definition. - DefinitionId *int - // (optional) The date from which to calculate metrics. - MinMetricsTime *azuredevops.Time -} - -// Gets all build definition options supported by the system. -func (client *Client) GetBuildOptionDefinitions(ctx context.Context, args GetBuildOptionDefinitionsArgs) (*[]BuildOptionDefinition, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - - locationId, _ := uuid.Parse("591cb5a4-2d46-4f3a-a697-5cd42b6bd332") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []BuildOptionDefinition - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetBuildOptionDefinitions function -type GetBuildOptionDefinitionsArgs struct { - // (optional) Project ID or project name - Project *string -} - // [Preview API] Gets the contents of a directory in the given source code repository. -func (client *Client) GetPathContents(ctx context.Context, args GetPathContentsArgs) (*[]SourceRepositoryItem, error) { +func (client *ClientImpl) GetPathContents(ctx context.Context, args GetPathContentsArgs) (*[]SourceRepositoryItem, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1932,164 +2441,80 @@ type GetPathContentsArgs struct { Path *string } -// [Preview API] Gets properties for a build. -func (client *Client) GetBuildProperties(ctx context.Context, args GetBuildPropertiesArgs) (interface{}, error) { +// [Preview API] Gets build metrics for a project. +func (client *ClientImpl) GetProjectMetrics(ctx context.Context, args GetProjectMetricsArgs) (*[]BuildMetric, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} } routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + if args.MetricAggregationType != nil && *args.MetricAggregationType != "" { + routeValues["metricAggregationType"] = *args.MetricAggregationType } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) queryParams := url.Values{} - if args.Filter != nil { - listAsString := strings.Join((*args.Filter)[:], ",") - queryParams.Add("filter", listAsString) + if args.MinMetricsTime != nil { + queryParams.Add("minMetricsTime", (*args.MinMetricsTime).String()) } - locationId, _ := uuid.Parse("0a6312e9-0627-49b7-8083-7d74a64849c9") + locationId, _ := uuid.Parse("7433fae7-a6bc-41dc-a6e2-eef9005ce41a") resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue interface{} - err = client.Client.UnmarshalBody(resp, responseValue) - return responseValue, err + var responseValue []BuildMetric + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err } -// Arguments for the GetBuildProperties function -type GetBuildPropertiesArgs struct { +// Arguments for the GetProjectMetrics function +type GetProjectMetricsArgs struct { // (required) Project ID or project name Project *string - // (required) The ID of the build. - BuildId *int - // (optional) A comma-delimited list of properties. If specified, filters to these specific properties. - Filter *[]string + // (optional) The aggregation type to use (hourly, daily). + MetricAggregationType *string + // (optional) The date from which to calculate metrics. + MinMetricsTime *azuredevops.Time } -// [Preview API] Updates properties for a build. -func (client *Client) UpdateBuildProperties(ctx context.Context, args UpdateBuildPropertiesArgs) (interface{}, error) { - if args.Document == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Document"} - } +// [Preview API] +func (client *ClientImpl) GetProjectResources(ctx context.Context, args GetProjectResourcesArgs) (*[]DefinitionResourceReference, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} } routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - - body, marshalErr := json.Marshal(*args.Document) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("0a6312e9-0627-49b7-8083-7d74a64849c9") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json-patch+json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue interface{} - err = client.Client.UnmarshalBody(resp, responseValue) - return responseValue, err -} - -// Arguments for the UpdateBuildProperties function -type UpdateBuildPropertiesArgs struct { - // (required) A json-patch document describing the properties to update. - Document *[]webapi.JsonPatchOperation - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int -} - -// [Preview API] Gets properties for a definition. -func (client *Client) GetDefinitionProperties(ctx context.Context, args GetDefinitionPropertiesArgs) (interface{}, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.DefinitionId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} - } - routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) queryParams := url.Values{} - if args.Filter != nil { - listAsString := strings.Join((*args.Filter)[:], ",") - queryParams.Add("filter", listAsString) + if args.Type != nil { + queryParams.Add("type", *args.Type) } - locationId, _ := uuid.Parse("d9826ad7-2a68-46a9-a6e9-677698777895") + if args.Id != nil { + queryParams.Add("id", *args.Id) + } + locationId, _ := uuid.Parse("398c85bc-81aa-4822-947c-a194a05f0fef") resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue interface{} - err = client.Client.UnmarshalBody(resp, responseValue) - return responseValue, err + var responseValue []DefinitionResourceReference + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err } -// Arguments for the GetDefinitionProperties function -type GetDefinitionPropertiesArgs struct { +// Arguments for the GetProjectResources function +type GetProjectResourcesArgs struct { // (required) Project ID or project name Project *string - // (required) The ID of the definition. - DefinitionId *int - // (optional) A comma-delimited list of properties. If specified, filters to these specific properties. - Filter *[]string -} - -// [Preview API] Updates properties for a definition. -func (client *Client) UpdateDefinitionProperties(ctx context.Context, args UpdateDefinitionPropertiesArgs) (interface{}, error) { - if args.Document == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Document"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.DefinitionId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} - } - routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) - - body, marshalErr := json.Marshal(*args.Document) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("d9826ad7-2a68-46a9-a6e9-677698777895") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json-patch+json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue interface{} - err = client.Client.UnmarshalBody(resp, responseValue) - return responseValue, err -} - -// Arguments for the UpdateDefinitionProperties function -type UpdateDefinitionPropertiesArgs struct { - // (required) A json-patch document describing the properties to update. - Document *[]webapi.JsonPatchOperation - // (required) Project ID or project name - Project *string - // (required) The ID of the definition. - DefinitionId *int + // (optional) + Type *string + // (optional) + Id *string } // [Preview API] Gets a pull request object from source provider. -func (client *Client) GetPullRequest(ctx context.Context, args GetPullRequestArgs) (*PullRequest, error) { +func (client *ClientImpl) GetPullRequest(ctx context.Context, args GetPullRequestArgs) (*PullRequest, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -2136,208 +2561,8 @@ type GetPullRequestArgs struct { ServiceEndpointId *uuid.UUID } -// [Preview API] Gets a build report. -func (client *Client) GetBuildReport(ctx context.Context, args GetBuildReportArgs) (*BuildReportMetadata, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - - queryParams := url.Values{} - if args.Type != nil { - queryParams.Add("type", *args.Type) - } - locationId, _ := uuid.Parse("45bcaa88-67e1-4042-a035-56d3b4a7d44c") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.2", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue BuildReportMetadata - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetBuildReport function -type GetBuildReportArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int - // (optional) - Type *string -} - -// [Preview API] Gets a build report. -func (client *Client) GetBuildReportHtmlContent(ctx context.Context, args GetBuildReportHtmlContentArgs) (io.ReadCloser, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - - queryParams := url.Values{} - if args.Type != nil { - queryParams.Add("type", *args.Type) - } - locationId, _ := uuid.Parse("45bcaa88-67e1-4042-a035-56d3b4a7d44c") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.2", routeValues, queryParams, nil, "", "text/html", nil) - if err != nil { - return nil, err - } - - return resp.Body, err -} - -// Arguments for the GetBuildReportHtmlContent function -type GetBuildReportHtmlContentArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int - // (optional) - Type *string -} - -// [Preview API] Gets a list of source code repositories. -func (client *Client) ListRepositories(ctx context.Context, args ListRepositoriesArgs) (*SourceRepositories, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.ProviderName == nil || *args.ProviderName == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProviderName"} - } - routeValues["providerName"] = *args.ProviderName - - queryParams := url.Values{} - if args.ServiceEndpointId != nil { - queryParams.Add("serviceEndpointId", (*args.ServiceEndpointId).String()) - } - if args.Repository != nil { - queryParams.Add("repository", *args.Repository) - } - if args.ResultSet != nil { - queryParams.Add("resultSet", string(*args.ResultSet)) - } - if args.PageResults != nil { - queryParams.Add("pageResults", strconv.FormatBool(*args.PageResults)) - } - if args.ContinuationToken != nil { - queryParams.Add("continuationToken", *args.ContinuationToken) - } - locationId, _ := uuid.Parse("d44d1680-f978-4834-9b93-8c6e132329c9") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue SourceRepositories - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the ListRepositories function -type ListRepositoriesArgs struct { - // (required) Project ID or project name - Project *string - // (required) The name of the source provider. - ProviderName *string - // (optional) If specified, the ID of the service endpoint to query. Can only be omitted for providers that do not use service endpoints, e.g. TFVC or TFGit. - ServiceEndpointId *uuid.UUID - // (optional) If specified, the vendor-specific identifier or the name of a single repository to get. - Repository *string - // (optional) 'top' for the repositories most relevant for the endpoint. If not set, all repositories are returned. Ignored if 'repository' is set. - ResultSet *ResultSet - // (optional) If set to true, this will limit the set of results and will return a continuation token to continue the query. - PageResults *bool - // (optional) When paging results, this is a continuation token, returned by a previous call to this method, that can be used to return the next set of repositories. - ContinuationToken *string -} - -// [Preview API] -func (client *Client) AuthorizeDefinitionResources(ctx context.Context, args AuthorizeDefinitionResourcesArgs) (*[]DefinitionResourceReference, error) { - if args.Resources == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Resources"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.DefinitionId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} - } - routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) - - body, marshalErr := json.Marshal(*args.Resources) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("ea623316-1967-45eb-89ab-e9e6110cf2d6") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []DefinitionResourceReference - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the AuthorizeDefinitionResources function -type AuthorizeDefinitionResourcesArgs struct { - // (required) - Resources *[]DefinitionResourceReference - // (required) Project ID or project name - Project *string - // (required) - DefinitionId *int -} - -// [Preview API] -func (client *Client) GetDefinitionResources(ctx context.Context, args GetDefinitionResourcesArgs) (*[]DefinitionResourceReference, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.DefinitionId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} - } - routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) - - locationId, _ := uuid.Parse("ea623316-1967-45eb-89ab-e9e6110cf2d6") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []DefinitionResourceReference - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetDefinitionResources function -type GetDefinitionResourcesArgs struct { - // (required) Project ID or project name - Project *string - // (required) - DefinitionId *int -} - // [Preview API] Gets information about build resources in the system. -func (client *Client) GetResourceUsage(ctx context.Context, args GetResourceUsageArgs) (*BuildResourceUsage, error) { +func (client *ClientImpl) GetResourceUsage(ctx context.Context, args GetResourceUsageArgs) (*BuildResourceUsage, error) { locationId, _ := uuid.Parse("3813d06c-9e36-4ea1-aac3-61a485d60e3d") resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.2", nil, nil, nil, "", "application/json", nil) if err != nil { @@ -2353,121 +2578,8 @@ func (client *Client) GetResourceUsage(ctx context.Context, args GetResourceUsag type GetResourceUsageArgs struct { } -// Gets all revisions of a definition. -func (client *Client) GetDefinitionRevisions(ctx context.Context, args GetDefinitionRevisionsArgs) (*[]BuildDefinitionRevision, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.DefinitionId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} - } - routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) - - locationId, _ := uuid.Parse("7c116775-52e5-453e-8c5d-914d9762d8c4") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []BuildDefinitionRevision - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetDefinitionRevisions function -type GetDefinitionRevisionsArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the definition. - DefinitionId *int -} - -// Gets the build settings. -func (client *Client) GetBuildSettings(ctx context.Context, args GetBuildSettingsArgs) (*BuildSettings, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - - locationId, _ := uuid.Parse("aa8c1c9c-ef8b-474a-b8c4-785c7b191d0d") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue BuildSettings - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetBuildSettings function -type GetBuildSettingsArgs struct { - // (optional) Project ID or project name - Project *string -} - -// Updates the build settings. -func (client *Client) UpdateBuildSettings(ctx context.Context, args UpdateBuildSettingsArgs) (*BuildSettings, error) { - if args.Settings == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Settings"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - - body, marshalErr := json.Marshal(*args.Settings) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("aa8c1c9c-ef8b-474a-b8c4-785c7b191d0d") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue BuildSettings - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdateBuildSettings function -type UpdateBuildSettingsArgs struct { - // (required) The new settings. - Settings *BuildSettings - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Get a list of source providers and their capabilities. -func (client *Client) ListSourceProviders(ctx context.Context, args ListSourceProvidersArgs) (*[]SourceProviderAttributes, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - - locationId, _ := uuid.Parse("3ce81729-954f-423d-a581-9fea01d25186") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []SourceProviderAttributes - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the ListSourceProviders function -type ListSourceProvidersArgs struct { - // (required) Project ID or project name - Project *string -} - // [Preview API]

Gets the build status for a definition, optionally scoped to a specific branch, stage, job, and configuration.

If there are more than one, then it is required to pass in a stageName value when specifying a jobName, and the same rule then applies for both if passing a configuration parameter.

-func (client *Client) GetStatusBadge(ctx context.Context, args GetStatusBadgeArgs) (*string, error) { +func (client *ClientImpl) GetStatusBadge(ctx context.Context, args GetStatusBadgeArgs) (*string, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -2523,153 +2635,8 @@ type GetStatusBadgeArgs struct { Label *string } -// Adds a tag to a build. -func (client *Client) AddBuildTag(ctx context.Context, args AddBuildTagArgs) (*[]string, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - if args.Tag == nil || *args.Tag == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Tag"} - } - routeValues["tag"] = *args.Tag - - locationId, _ := uuid.Parse("6e6114b2-8161-44c8-8f6c-c5505782427f") - resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []string - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the AddBuildTag function -type AddBuildTagArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int - // (required) The tag to add. - Tag *string -} - -// Adds tags to a build. -func (client *Client) AddBuildTags(ctx context.Context, args AddBuildTagsArgs) (*[]string, error) { - if args.Tags == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Tags"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - - body, marshalErr := json.Marshal(*args.Tags) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("6e6114b2-8161-44c8-8f6c-c5505782427f") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []string - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the AddBuildTags function -type AddBuildTagsArgs struct { - // (required) The tags to add. - Tags *[]string - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int -} - -// Removes a tag from a build. -func (client *Client) DeleteBuildTag(ctx context.Context, args DeleteBuildTagArgs) (*[]string, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - if args.Tag == nil || *args.Tag == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Tag"} - } - routeValues["tag"] = *args.Tag - - locationId, _ := uuid.Parse("6e6114b2-8161-44c8-8f6c-c5505782427f") - resp, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []string - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the DeleteBuildTag function -type DeleteBuildTagArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int - // (required) The tag to remove. - Tag *string -} - -// Gets the tags for a build. -func (client *Client) GetBuildTags(ctx context.Context, args GetBuildTagsArgs) (*[]string, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - - locationId, _ := uuid.Parse("6e6114b2-8161-44c8-8f6c-c5505782427f") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []string - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetBuildTags function -type GetBuildTagsArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int -} - // Gets a list of all build and definition tags in the project. -func (client *Client) GetTags(ctx context.Context, args GetTagsArgs) (*[]string, error) { +func (client *ClientImpl) GetTags(ctx context.Context, args GetTagsArgs) (*[]string, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -2693,188 +2660,8 @@ type GetTagsArgs struct { Project *string } -// [Preview API] Adds a tag to a definition -func (client *Client) AddDefinitionTag(ctx context.Context, args AddDefinitionTagArgs) (*[]string, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.DefinitionId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} - } - routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) - if args.Tag == nil || *args.Tag == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Tag"} - } - routeValues["tag"] = *args.Tag - - locationId, _ := uuid.Parse("cb894432-134a-4d31-a839-83beceaace4b") - resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1-preview.2", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []string - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the AddDefinitionTag function -type AddDefinitionTagArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the definition. - DefinitionId *int - // (required) The tag to add. - Tag *string -} - -// [Preview API] Adds multiple tags to a definition. -func (client *Client) AddDefinitionTags(ctx context.Context, args AddDefinitionTagsArgs) (*[]string, error) { - if args.Tags == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Tags"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.DefinitionId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} - } - routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) - - body, marshalErr := json.Marshal(*args.Tags) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("cb894432-134a-4d31-a839-83beceaace4b") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.2", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []string - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the AddDefinitionTags function -type AddDefinitionTagsArgs struct { - // (required) The tags to add. - Tags *[]string - // (required) Project ID or project name - Project *string - // (required) The ID of the definition. - DefinitionId *int -} - -// [Preview API] Removes a tag from a definition. -func (client *Client) DeleteDefinitionTag(ctx context.Context, args DeleteDefinitionTagArgs) (*[]string, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.DefinitionId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} - } - routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) - if args.Tag == nil || *args.Tag == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Tag"} - } - routeValues["tag"] = *args.Tag - - locationId, _ := uuid.Parse("cb894432-134a-4d31-a839-83beceaace4b") - resp, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.2", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []string - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the DeleteDefinitionTag function -type DeleteDefinitionTagArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the definition. - DefinitionId *int - // (required) The tag to remove. - Tag *string -} - -// [Preview API] Gets the tags for a definition. -func (client *Client) GetDefinitionTags(ctx context.Context, args GetDefinitionTagsArgs) (*[]string, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.DefinitionId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} - } - routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) - - queryParams := url.Values{} - if args.Revision != nil { - queryParams.Add("revision", strconv.Itoa(*args.Revision)) - } - locationId, _ := uuid.Parse("cb894432-134a-4d31-a839-83beceaace4b") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.2", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []string - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetDefinitionTags function -type GetDefinitionTagsArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the definition. - DefinitionId *int - // (optional) The definition revision number. If not specified, uses the latest revision of the definition. - Revision *int -} - -// Deletes a build definition template. -func (client *Client) DeleteTemplate(ctx context.Context, args DeleteTemplateArgs) error { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.TemplateId == nil || *args.TemplateId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.TemplateId"} - } - routeValues["templateId"] = *args.TemplateId - - locationId, _ := uuid.Parse("e884571e-7f92-4d6a-9274-3f5649900835") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeleteTemplate function -type DeleteTemplateArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the template. - TemplateId *string -} - // Gets a specific build definition template. -func (client *Client) GetTemplate(ctx context.Context, args GetTemplateArgs) (*BuildDefinitionTemplate, error) { +func (client *ClientImpl) GetTemplate(ctx context.Context, args GetTemplateArgs) (*BuildDefinitionTemplate, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -2905,7 +2692,7 @@ type GetTemplateArgs struct { } // Gets all definition templates. -func (client *Client) GetTemplates(ctx context.Context, args GetTemplatesArgs) (*[]BuildDefinitionTemplate, error) { +func (client *ClientImpl) GetTemplates(ctx context.Context, args GetTemplatesArgs) (*[]BuildDefinitionTemplate, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -2929,95 +2716,310 @@ type GetTemplatesArgs struct { Project *string } -// Updates an existing build definition template. -func (client *Client) SaveTemplate(ctx context.Context, args SaveTemplateArgs) (*BuildDefinitionTemplate, error) { - if args.Template == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Template"} +// [Preview API] Gets all the work items between two builds. +func (client *ClientImpl) GetWorkItemsBetweenBuilds(ctx context.Context, args GetWorkItemsBetweenBuildsArgs) (*[]webapi.ResourceRef, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + + queryParams := url.Values{} + if args.FromBuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "fromBuildId"} + } + queryParams.Add("fromBuildId", strconv.Itoa(*args.FromBuildId)) + if args.ToBuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "toBuildId"} + } + queryParams.Add("toBuildId", strconv.Itoa(*args.ToBuildId)) + if args.Top != nil { + queryParams.Add("$top", strconv.Itoa(*args.Top)) + } + locationId, _ := uuid.Parse("52ba8915-5518-42e3-a4bb-b0182d159e2d") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.2", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []webapi.ResourceRef + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetWorkItemsBetweenBuilds function +type GetWorkItemsBetweenBuildsArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the first build. + FromBuildId *int + // (required) The ID of the last build. + ToBuildId *int + // (optional) The maximum number of work items to return. + Top *int +} + +// [Preview API] Gets a list of branches for the given source code repository. +func (client *ClientImpl) ListBranches(ctx context.Context, args ListBranchesArgs) (*[]string, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.ProviderName == nil || *args.ProviderName == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProviderName"} + } + routeValues["providerName"] = *args.ProviderName + + queryParams := url.Values{} + if args.ServiceEndpointId != nil { + queryParams.Add("serviceEndpointId", (*args.ServiceEndpointId).String()) + } + if args.Repository != nil { + queryParams.Add("repository", *args.Repository) + } + if args.BranchName != nil { + queryParams.Add("branchName", *args.BranchName) + } + locationId, _ := uuid.Parse("e05d4403-9b81-4244-8763-20fde28d1976") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []string + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the ListBranches function +type ListBranchesArgs struct { + // (required) Project ID or project name + Project *string + // (required) The name of the source provider. + ProviderName *string + // (optional) If specified, the ID of the service endpoint to query. Can only be omitted for providers that do not use service endpoints, e.g. TFVC or TFGit. + ServiceEndpointId *uuid.UUID + // (optional) The vendor-specific identifier or the name of the repository to get branches. Can only be omitted for providers that do not support multiple repositories. + Repository *string + // (optional) If supplied, the name of the branch to check for specifically. + BranchName *string +} + +// [Preview API] Gets a list of source code repositories. +func (client *ClientImpl) ListRepositories(ctx context.Context, args ListRepositoriesArgs) (*SourceRepositories, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.ProviderName == nil || *args.ProviderName == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProviderName"} + } + routeValues["providerName"] = *args.ProviderName + + queryParams := url.Values{} + if args.ServiceEndpointId != nil { + queryParams.Add("serviceEndpointId", (*args.ServiceEndpointId).String()) + } + if args.Repository != nil { + queryParams.Add("repository", *args.Repository) + } + if args.ResultSet != nil { + queryParams.Add("resultSet", string(*args.ResultSet)) + } + if args.PageResults != nil { + queryParams.Add("pageResults", strconv.FormatBool(*args.PageResults)) + } + if args.ContinuationToken != nil { + queryParams.Add("continuationToken", *args.ContinuationToken) + } + locationId, _ := uuid.Parse("d44d1680-f978-4834-9b93-8c6e132329c9") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue SourceRepositories + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the ListRepositories function +type ListRepositoriesArgs struct { + // (required) Project ID or project name + Project *string + // (required) The name of the source provider. + ProviderName *string + // (optional) If specified, the ID of the service endpoint to query. Can only be omitted for providers that do not use service endpoints, e.g. TFVC or TFGit. + ServiceEndpointId *uuid.UUID + // (optional) If specified, the vendor-specific identifier or the name of a single repository to get. + Repository *string + // (optional) 'top' for the repositories most relevant for the endpoint. If not set, all repositories are returned. Ignored if 'repository' is set. + ResultSet *ResultSet + // (optional) If set to true, this will limit the set of results and will return a continuation token to continue the query. + PageResults *bool + // (optional) When paging results, this is a continuation token, returned by a previous call to this method, that can be used to return the next set of repositories. + ContinuationToken *string +} + +// [Preview API] Get a list of source providers and their capabilities. +func (client *ClientImpl) ListSourceProviders(ctx context.Context, args ListSourceProvidersArgs) (*[]SourceProviderAttributes, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + + locationId, _ := uuid.Parse("3ce81729-954f-423d-a581-9fea01d25186") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []SourceProviderAttributes + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the ListSourceProviders function +type ListSourceProvidersArgs struct { + // (required) Project ID or project name + Project *string +} + +// [Preview API] Gets a list of webhooks installed in the given source code repository. +func (client *ClientImpl) ListWebhooks(ctx context.Context, args ListWebhooksArgs) (*[]RepositoryWebhook, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.ProviderName == nil || *args.ProviderName == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProviderName"} + } + routeValues["providerName"] = *args.ProviderName + + queryParams := url.Values{} + if args.ServiceEndpointId != nil { + queryParams.Add("serviceEndpointId", (*args.ServiceEndpointId).String()) + } + if args.Repository != nil { + queryParams.Add("repository", *args.Repository) + } + locationId, _ := uuid.Parse("8f20ff82-9498-4812-9f6e-9c01bdc50e99") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []RepositoryWebhook + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the ListWebhooks function +type ListWebhooksArgs struct { + // (required) Project ID or project name + Project *string + // (required) The name of the source provider. + ProviderName *string + // (optional) If specified, the ID of the service endpoint to query. Can only be omitted for providers that do not use service endpoints, e.g. TFVC or TFGit. + ServiceEndpointId *uuid.UUID + // (optional) If specified, the vendor-specific identifier or the name of the repository to get webhooks. Can only be omitted for providers that do not support multiple repositories. + Repository *string +} + +// Queues a build +func (client *ClientImpl) QueueBuild(ctx context.Context, args QueueBuildArgs) (*Build, error) { + if args.Build == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Build"} } routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} } routeValues["project"] = *args.Project - if args.TemplateId == nil || *args.TemplateId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.TemplateId"} - } - routeValues["templateId"] = *args.TemplateId - body, marshalErr := json.Marshal(*args.Template) + queryParams := url.Values{} + if args.IgnoreWarnings != nil { + queryParams.Add("ignoreWarnings", strconv.FormatBool(*args.IgnoreWarnings)) + } + if args.CheckInTicket != nil { + queryParams.Add("checkInTicket", *args.CheckInTicket) + } + if args.SourceBuildId != nil { + queryParams.Add("sourceBuildId", strconv.Itoa(*args.SourceBuildId)) + } + body, marshalErr := json.Marshal(*args.Build) if marshalErr != nil { return nil, marshalErr } - locationId, _ := uuid.Parse("e884571e-7f92-4d6a-9274-3f5649900835") - resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + locationId, _ := uuid.Parse("0cd358e1-9217-4d94-8269-1c1ee6f93dcf") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) if err != nil { return nil, err } - var responseValue BuildDefinitionTemplate + var responseValue Build err = client.Client.UnmarshalBody(resp, &responseValue) return &responseValue, err } -// Arguments for the SaveTemplate function -type SaveTemplateArgs struct { - // (required) The new version of the template. - Template *BuildDefinitionTemplate +// Arguments for the QueueBuild function +type QueueBuildArgs struct { + // (required) + Build *Build // (required) Project ID or project name Project *string - // (required) The ID of the template. - TemplateId *string + // (optional) + IgnoreWarnings *bool + // (optional) + CheckInTicket *string + // (optional) + SourceBuildId *int } -// Gets details for a build -func (client *Client) GetBuildTimeline(ctx context.Context, args GetBuildTimelineArgs) (*Timeline, error) { +// Restores a deleted definition +func (client *ClientImpl) RestoreDefinition(ctx context.Context, args RestoreDefinitionArgs) (*BuildDefinition, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} } routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - if args.TimelineId != nil { - routeValues["timelineId"] = (*args.TimelineId).String() + if args.DefinitionId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} } + routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) queryParams := url.Values{} - if args.ChangeId != nil { - queryParams.Add("changeId", strconv.Itoa(*args.ChangeId)) + if args.Deleted == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "deleted"} } - if args.PlanId != nil { - queryParams.Add("planId", (*args.PlanId).String()) - } - locationId, _ := uuid.Parse("8baac422-4c6e-4de5-8532-db96d92acffa") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) + queryParams.Add("deleted", strconv.FormatBool(*args.Deleted)) + locationId, _ := uuid.Parse("dbeaf647-6167-421a-bda9-c9327b25e2e6") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue Timeline + var responseValue BuildDefinition err = client.Client.UnmarshalBody(resp, &responseValue) return &responseValue, err } -// Arguments for the GetBuildTimeline function -type GetBuildTimelineArgs struct { +// Arguments for the RestoreDefinition function +type RestoreDefinitionArgs struct { // (required) Project ID or project name Project *string - // (required) - BuildId *int - // (optional) - TimelineId *uuid.UUID - // (optional) - ChangeId *int - // (optional) - PlanId *uuid.UUID + // (required) The identifier of the definition to restore. + DefinitionId *int + // (required) When false, restores a deleted definition. + Deleted *bool } // [Preview API] Recreates the webhooks for the specified triggers in the given source code repository. -func (client *Client) RestoreWebhooks(ctx context.Context, args RestoreWebhooksArgs) error { +func (client *ClientImpl) RestoreWebhooks(ctx context.Context, args RestoreWebhooksArgs) error { if args.TriggerTypes == nil { return &azuredevops.ArgumentNilError{ArgumentName: "args.TriggerTypes"} } @@ -3065,133 +3067,295 @@ type RestoreWebhooksArgs struct { Repository *string } -// [Preview API] Gets a list of webhooks installed in the given source code repository. -func (client *Client) ListWebhooks(ctx context.Context, args ListWebhooksArgs) (*[]RepositoryWebhook, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.ProviderName == nil || *args.ProviderName == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProviderName"} - } - routeValues["providerName"] = *args.ProviderName - - queryParams := url.Values{} - if args.ServiceEndpointId != nil { - queryParams.Add("serviceEndpointId", (*args.ServiceEndpointId).String()) - } - if args.Repository != nil { - queryParams.Add("repository", *args.Repository) - } - locationId, _ := uuid.Parse("8f20ff82-9498-4812-9f6e-9c01bdc50e99") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []RepositoryWebhook - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the ListWebhooks function -type ListWebhooksArgs struct { - // (required) Project ID or project name - Project *string - // (required) The name of the source provider. - ProviderName *string - // (optional) If specified, the ID of the service endpoint to query. Can only be omitted for providers that do not use service endpoints, e.g. TFVC or TFGit. - ServiceEndpointId *uuid.UUID - // (optional) If specified, the vendor-specific identifier or the name of the repository to get webhooks. Can only be omitted for providers that do not support multiple repositories. - Repository *string -} - -// Gets the work items associated with a build. -func (client *Client) GetBuildWorkItemsRefs(ctx context.Context, args GetBuildWorkItemsRefsArgs) (*[]webapi.ResourceRef, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} - } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) - - queryParams := url.Values{} - if args.Top != nil { - queryParams.Add("$top", strconv.Itoa(*args.Top)) - } - locationId, _ := uuid.Parse("5a21f5d2-5642-47e4-a0bd-1356e6731bee") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []webapi.ResourceRef - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetBuildWorkItemsRefs function -type GetBuildWorkItemsRefsArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the build. - BuildId *int - // (optional) The maximum number of work items to return. - Top *int -} - -// Gets the work items associated with a build, filtered to specific commits. -func (client *Client) GetBuildWorkItemsRefsFromCommits(ctx context.Context, args GetBuildWorkItemsRefsFromCommitsArgs) (*[]webapi.ResourceRef, error) { - if args.CommitIds == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.CommitIds"} +// Updates an existing build definition template. +func (client *ClientImpl) SaveTemplate(ctx context.Context, args SaveTemplateArgs) (*BuildDefinitionTemplate, error) { + if args.Template == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Template"} } routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} } routeValues["project"] = *args.Project - if args.BuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + if args.TemplateId == nil || *args.TemplateId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.TemplateId"} } - routeValues["buildId"] = strconv.Itoa(*args.BuildId) + routeValues["templateId"] = *args.TemplateId - queryParams := url.Values{} - if args.Top != nil { - queryParams.Add("$top", strconv.Itoa(*args.Top)) - } - body, marshalErr := json.Marshal(*args.CommitIds) + body, marshalErr := json.Marshal(*args.Template) if marshalErr != nil { return nil, marshalErr } - locationId, _ := uuid.Parse("5a21f5d2-5642-47e4-a0bd-1356e6731bee") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) + locationId, _ := uuid.Parse("e884571e-7f92-4d6a-9274-3f5649900835") + resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) if err != nil { return nil, err } - var responseValue []webapi.ResourceRef - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + var responseValue BuildDefinitionTemplate + err = client.Client.UnmarshalBody(resp, &responseValue) return &responseValue, err } -// Arguments for the GetBuildWorkItemsRefsFromCommits function -type GetBuildWorkItemsRefsFromCommitsArgs struct { - // (required) A comma-delimited list of commit IDs. - CommitIds *[]string +// Arguments for the SaveTemplate function +type SaveTemplateArgs struct { + // (required) The new version of the template. + Template *BuildDefinitionTemplate + // (required) Project ID or project name + Project *string + // (required) The ID of the template. + TemplateId *string +} + +// Updates a build. +func (client *ClientImpl) UpdateBuild(ctx context.Context, args UpdateBuildArgs) (*Build, error) { + if args.Build == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Build"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + + queryParams := url.Values{} + if args.Retry != nil { + queryParams.Add("retry", strconv.FormatBool(*args.Retry)) + } + body, marshalErr := json.Marshal(*args.Build) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("0cd358e1-9217-4d94-8269-1c1ee6f93dcf") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue Build + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateBuild function +type UpdateBuildArgs struct { + // (required) The build. + Build *Build // (required) Project ID or project name Project *string // (required) The ID of the build. BuildId *int - // (optional) The maximum number of work items to return, or the number of commits to consider if no commit IDs are specified. - Top *int + // (optional) + Retry *bool } -// [Preview API] Gets all the work items between two builds. -func (client *Client) GetWorkItemsBetweenBuilds(ctx context.Context, args GetWorkItemsBetweenBuildsArgs) (*[]webapi.ResourceRef, error) { +// [Preview API] Updates properties for a build. +func (client *ClientImpl) UpdateBuildProperties(ctx context.Context, args UpdateBuildPropertiesArgs) (interface{}, error) { + if args.Document == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Document"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.BuildId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BuildId"} + } + routeValues["buildId"] = strconv.Itoa(*args.BuildId) + + body, marshalErr := json.Marshal(*args.Document) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("0a6312e9-0627-49b7-8083-7d74a64849c9") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json-patch+json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue interface{} + err = client.Client.UnmarshalBody(resp, responseValue) + return responseValue, err +} + +// Arguments for the UpdateBuildProperties function +type UpdateBuildPropertiesArgs struct { + // (required) A json-patch document describing the properties to update. + Document *[]webapi.JsonPatchOperation + // (required) Project ID or project name + Project *string + // (required) The ID of the build. + BuildId *int +} + +// Updates multiple builds. +func (client *ClientImpl) UpdateBuilds(ctx context.Context, args UpdateBuildsArgs) (*[]Build, error) { + if args.Builds == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Builds"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + + body, marshalErr := json.Marshal(*args.Builds) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("0cd358e1-9217-4d94-8269-1c1ee6f93dcf") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []Build + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateBuilds function +type UpdateBuildsArgs struct { + // (required) The builds to update. + Builds *[]Build + // (required) Project ID or project name + Project *string +} + +// Updates the build settings. +func (client *ClientImpl) UpdateBuildSettings(ctx context.Context, args UpdateBuildSettingsArgs) (*BuildSettings, error) { + if args.Settings == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Settings"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + + body, marshalErr := json.Marshal(*args.Settings) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("aa8c1c9c-ef8b-474a-b8c4-785c7b191d0d") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue BuildSettings + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateBuildSettings function +type UpdateBuildSettingsArgs struct { + // (required) The new settings. + Settings *BuildSettings + // (optional) Project ID or project name + Project *string +} + +// Updates an existing definition. +func (client *ClientImpl) UpdateDefinition(ctx context.Context, args UpdateDefinitionArgs) (*BuildDefinition, error) { + if args.Definition == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Definition"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.DefinitionId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} + } + routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) + + queryParams := url.Values{} + if args.SecretsSourceDefinitionId != nil { + queryParams.Add("secretsSourceDefinitionId", strconv.Itoa(*args.SecretsSourceDefinitionId)) + } + if args.SecretsSourceDefinitionRevision != nil { + queryParams.Add("secretsSourceDefinitionRevision", strconv.Itoa(*args.SecretsSourceDefinitionRevision)) + } + body, marshalErr := json.Marshal(*args.Definition) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("dbeaf647-6167-421a-bda9-c9327b25e2e6") + resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue BuildDefinition + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateDefinition function +type UpdateDefinitionArgs struct { + // (required) The new version of the definition. + Definition *BuildDefinition + // (required) Project ID or project name + Project *string + // (required) The ID of the definition. + DefinitionId *int + // (optional) + SecretsSourceDefinitionId *int + // (optional) + SecretsSourceDefinitionRevision *int +} + +// [Preview API] Updates properties for a definition. +func (client *ClientImpl) UpdateDefinitionProperties(ctx context.Context, args UpdateDefinitionPropertiesArgs) (interface{}, error) { + if args.Document == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Document"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.DefinitionId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.DefinitionId"} + } + routeValues["definitionId"] = strconv.Itoa(*args.DefinitionId) + + body, marshalErr := json.Marshal(*args.Document) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("d9826ad7-2a68-46a9-a6e9-677698777895") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json-patch+json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue interface{} + err = client.Client.UnmarshalBody(resp, responseValue) + return responseValue, err +} + +// Arguments for the UpdateDefinitionProperties function +type UpdateDefinitionPropertiesArgs struct { + // (required) A json-patch document describing the properties to update. + Document *[]webapi.JsonPatchOperation + // (required) Project ID or project name + Project *string + // (required) The ID of the definition. + DefinitionId *int +} + +// [Preview API] Updates an existing folder at given existing path +func (client *ClientImpl) UpdateFolder(ctx context.Context, args UpdateFolderArgs) (*Folder, error) { + if args.Folder == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Folder"} + } routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -3199,36 +3363,31 @@ func (client *Client) GetWorkItemsBetweenBuilds(ctx context.Context, args GetWor routeValues["project"] = *args.Project queryParams := url.Values{} - if args.FromBuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "fromBuildId"} + if args.Path == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "path"} } - queryParams.Add("fromBuildId", strconv.Itoa(*args.FromBuildId)) - if args.ToBuildId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "toBuildId"} + queryParams.Add("path", *args.Path) + body, marshalErr := json.Marshal(*args.Folder) + if marshalErr != nil { + return nil, marshalErr } - queryParams.Add("toBuildId", strconv.Itoa(*args.ToBuildId)) - if args.Top != nil { - queryParams.Add("$top", strconv.Itoa(*args.Top)) - } - locationId, _ := uuid.Parse("52ba8915-5518-42e3-a4bb-b0182d159e2d") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.2", routeValues, queryParams, nil, "", "application/json", nil) + locationId, _ := uuid.Parse("a906531b-d2da-4f55-bda7-f3e676cc50d9") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.2", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) if err != nil { return nil, err } - var responseValue []webapi.ResourceRef - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + var responseValue Folder + err = client.Client.UnmarshalBody(resp, &responseValue) return &responseValue, err } -// Arguments for the GetWorkItemsBetweenBuilds function -type GetWorkItemsBetweenBuildsArgs struct { +// Arguments for the UpdateFolder function +type UpdateFolderArgs struct { + // (required) The new version of the folder. + Folder *Folder // (required) Project ID or project name Project *string - // (required) The ID of the first build. - FromBuildId *int - // (required) The ID of the last build. - ToBuildId *int - // (optional) The maximum number of work items to return. - Top *int + // (required) The full path to the folder. + Path *string } diff --git a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/core/client.go b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/core/client.go index 0ac180ca..edddd3a7 100644 --- a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/core/client.go +++ b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/core/client.go @@ -24,77 +24,77 @@ import ( var ResourceAreaId, _ = uuid.Parse("79134c72-4a58-4b42-976c-04e7115f32bf") -type Client struct { +type Client interface { + // [Preview API] + CreateConnectedService(context.Context, CreateConnectedServiceArgs) (*WebApiConnectedService, error) + // [Preview API] + CreateOrUpdateProxy(context.Context, CreateOrUpdateProxyArgs) (*Proxy, error) + // Create a team in a team project. + CreateTeam(context.Context, CreateTeamArgs) (*WebApiTeam, error) + // [Preview API] + DeleteProxy(context.Context, DeleteProxyArgs) error + // Delete a team. + DeleteTeam(context.Context, DeleteTeamArgs) error + // [Preview API] Get a list of all teams. + GetAllTeams(context.Context, GetAllTeamsArgs) (*[]WebApiTeam, error) + // [Preview API] + GetConnectedServiceDetails(context.Context, GetConnectedServiceDetailsArgs) (*WebApiConnectedServiceDetails, error) + // [Preview API] + GetConnectedServices(context.Context, GetConnectedServicesArgs) (*[]WebApiConnectedService, error) + // Get a process by ID. + GetProcessById(context.Context, GetProcessByIdArgs) (*Process, error) + // Get a list of processes. + GetProcesses(context.Context, GetProcessesArgs) (*[]Process, error) + // Get project with the specified id or name, optionally including capabilities. + GetProject(context.Context, GetProjectArgs) (*TeamProject, error) + // Get project collection with the specified id or name. + GetProjectCollection(context.Context, GetProjectCollectionArgs) (*TeamProjectCollection, error) + // Get project collection references for this application. + GetProjectCollections(context.Context, GetProjectCollectionsArgs) (*[]TeamProjectCollectionReference, error) + // [Preview API] Get a collection of team project properties. + GetProjectProperties(context.Context, GetProjectPropertiesArgs) (*[]ProjectProperty, error) + // Get all projects in the organization that the authenticated user has access to. + GetProjects(context.Context, GetProjectsArgs) (*GetProjectsResponseValue, error) + // [Preview API] + GetProxies(context.Context, GetProxiesArgs) (*[]Proxy, error) + // Get a specific team. + GetTeam(context.Context, GetTeamArgs) (*WebApiTeam, error) + // Get a list of members for a specific team. + GetTeamMembersWithExtendedProperties(context.Context, GetTeamMembersWithExtendedPropertiesArgs) (*[]webapi.TeamMember, error) + // Get a list of teams. + GetTeams(context.Context, GetTeamsArgs) (*[]WebApiTeam, error) + // Queues a project to be created. Use the [GetOperation](../../operations/operations/get) to periodically check for create project status. + QueueCreateProject(context.Context, QueueCreateProjectArgs) (*operations.OperationReference, error) + // Queues a project to be deleted. Use the [GetOperation](../../operations/operations/get) to periodically check for delete project status. + QueueDeleteProject(context.Context, QueueDeleteProjectArgs) (*operations.OperationReference, error) + // [Preview API] Removes the avatar for the project. + RemoveProjectAvatar(context.Context, RemoveProjectAvatarArgs) error + // [Preview API] Sets the avatar for the project. + SetProjectAvatar(context.Context, SetProjectAvatarArgs) error + // [Preview API] Create, update, and delete team project properties. + SetProjectProperties(context.Context, SetProjectPropertiesArgs) error + // Update an existing project's name, abbreviation, description, or restore a project. + UpdateProject(context.Context, UpdateProjectArgs) (*operations.OperationReference, error) + // Update a team's name and/or description. + UpdateTeam(context.Context, UpdateTeamArgs) (*WebApiTeam, error) +} + +type ClientImpl struct { Client azuredevops.Client } -func NewClient(ctx context.Context, connection *azuredevops.Connection) (*Client, error) { +func NewClient(ctx context.Context, connection *azuredevops.Connection) (Client, error) { client, err := connection.GetClientByResourceAreaId(ctx, ResourceAreaId) if err != nil { return nil, err } - return &Client{ + return &ClientImpl{ Client: *client, }, nil } -// [Preview API] Removes the avatar for the project. -func (client *Client) RemoveProjectAvatar(ctx context.Context, args RemoveProjectAvatarArgs) error { - routeValues := make(map[string]string) - if args.ProjectId == nil || *args.ProjectId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProjectId"} - } - routeValues["projectId"] = *args.ProjectId - - locationId, _ := uuid.Parse("54b2a2a0-859b-4d05-827c-ec4c862f641a") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the RemoveProjectAvatar function -type RemoveProjectAvatarArgs struct { - // (required) The ID or name of the project. - ProjectId *string -} - -// [Preview API] Sets the avatar for the project. -func (client *Client) SetProjectAvatar(ctx context.Context, args SetProjectAvatarArgs) error { - if args.AvatarBlob == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.AvatarBlob"} - } - routeValues := make(map[string]string) - if args.ProjectId == nil || *args.ProjectId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProjectId"} - } - routeValues["projectId"] = *args.ProjectId - - body, marshalErr := json.Marshal(*args.AvatarBlob) - if marshalErr != nil { - return marshalErr - } - locationId, _ := uuid.Parse("54b2a2a0-859b-4d05-827c-ec4c862f641a") - _, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the SetProjectAvatar function -type SetProjectAvatarArgs struct { - // (required) The avatar blob data object to upload. - AvatarBlob *ProjectAvatar - // (required) The ID or name of the project. - ProjectId *string -} - // [Preview API] -func (client *Client) CreateConnectedService(ctx context.Context, args CreateConnectedServiceArgs) (*WebApiConnectedService, error) { +func (client *ClientImpl) CreateConnectedService(ctx context.Context, args CreateConnectedServiceArgs) (*WebApiConnectedService, error) { if args.ConnectedServiceCreationData == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ConnectedServiceCreationData"} } @@ -128,7 +128,161 @@ type CreateConnectedServiceArgs struct { } // [Preview API] -func (client *Client) GetConnectedServiceDetails(ctx context.Context, args GetConnectedServiceDetailsArgs) (*WebApiConnectedServiceDetails, error) { +func (client *ClientImpl) CreateOrUpdateProxy(ctx context.Context, args CreateOrUpdateProxyArgs) (*Proxy, error) { + if args.Proxy == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Proxy"} + } + body, marshalErr := json.Marshal(*args.Proxy) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("ec1f4311-f2b4-4c15-b2b8-8990b80d2908") + resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1-preview.2", nil, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue Proxy + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateOrUpdateProxy function +type CreateOrUpdateProxyArgs struct { + // (required) + Proxy *Proxy +} + +// Create a team in a team project. +func (client *ClientImpl) CreateTeam(ctx context.Context, args CreateTeamArgs) (*WebApiTeam, error) { + if args.Team == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Team"} + } + routeValues := make(map[string]string) + if args.ProjectId == nil || *args.ProjectId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProjectId"} + } + routeValues["projectId"] = *args.ProjectId + + body, marshalErr := json.Marshal(*args.Team) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("d30a3dd1-f8ba-442a-b86a-bd0c0c383e59") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue WebApiTeam + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateTeam function +type CreateTeamArgs struct { + // (required) The team data used to create the team. + Team *WebApiTeam + // (required) The name or ID (GUID) of the team project in which to create the team. + ProjectId *string +} + +// [Preview API] +func (client *ClientImpl) DeleteProxy(ctx context.Context, args DeleteProxyArgs) error { + queryParams := url.Values{} + if args.ProxyUrl == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "proxyUrl"} + } + queryParams.Add("proxyUrl", *args.ProxyUrl) + if args.Site != nil { + queryParams.Add("site", *args.Site) + } + locationId, _ := uuid.Parse("ec1f4311-f2b4-4c15-b2b8-8990b80d2908") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.2", nil, queryParams, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeleteProxy function +type DeleteProxyArgs struct { + // (required) + ProxyUrl *string + // (optional) + Site *string +} + +// Delete a team. +func (client *ClientImpl) DeleteTeam(ctx context.Context, args DeleteTeamArgs) error { + routeValues := make(map[string]string) + if args.ProjectId == nil || *args.ProjectId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProjectId"} + } + routeValues["projectId"] = *args.ProjectId + if args.TeamId == nil || *args.TeamId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.TeamId"} + } + routeValues["teamId"] = *args.TeamId + + locationId, _ := uuid.Parse("d30a3dd1-f8ba-442a-b86a-bd0c0c383e59") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeleteTeam function +type DeleteTeamArgs struct { + // (required) The name or ID (GUID) of the team project containing the team to delete. + ProjectId *string + // (required) The name or ID of the team to delete. + TeamId *string +} + +// [Preview API] Get a list of all teams. +func (client *ClientImpl) GetAllTeams(ctx context.Context, args GetAllTeamsArgs) (*[]WebApiTeam, error) { + queryParams := url.Values{} + if args.Mine != nil { + queryParams.Add("$mine", strconv.FormatBool(*args.Mine)) + } + if args.Top != nil { + queryParams.Add("$top", strconv.Itoa(*args.Top)) + } + if args.Skip != nil { + queryParams.Add("$skip", strconv.Itoa(*args.Skip)) + } + if args.ExpandIdentity != nil { + queryParams.Add("$expandIdentity", strconv.FormatBool(*args.ExpandIdentity)) + } + locationId, _ := uuid.Parse("7a4d9ee9-3433-4347-b47a-7a80f1cf307e") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.3", nil, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []WebApiTeam + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetAllTeams function +type GetAllTeamsArgs struct { + // (optional) If true, then return all teams requesting user is member. Otherwise return all teams user has read access. + Mine *bool + // (optional) Maximum number of teams to return. + Top *int + // (optional) Number of teams to skip. + Skip *int + // (optional) A value indicating whether or not to expand Identity information in the result WebApiTeam object. + ExpandIdentity *bool +} + +// [Preview API] +func (client *ClientImpl) GetConnectedServiceDetails(ctx context.Context, args GetConnectedServiceDetailsArgs) (*WebApiConnectedServiceDetails, error) { routeValues := make(map[string]string) if args.ProjectId == nil || *args.ProjectId == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProjectId"} @@ -159,7 +313,7 @@ type GetConnectedServiceDetailsArgs struct { } // [Preview API] -func (client *Client) GetConnectedServices(ctx context.Context, args GetConnectedServicesArgs) (*[]WebApiConnectedService, error) { +func (client *ClientImpl) GetConnectedServices(ctx context.Context, args GetConnectedServicesArgs) (*[]WebApiConnectedService, error) { routeValues := make(map[string]string) if args.ProjectId == nil || *args.ProjectId == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProjectId"} @@ -189,50 +343,8 @@ type GetConnectedServicesArgs struct { Kind *ConnectedServiceKind } -// Get a list of members for a specific team. -func (client *Client) GetTeamMembersWithExtendedProperties(ctx context.Context, args GetTeamMembersWithExtendedPropertiesArgs) (*[]webapi.TeamMember, error) { - routeValues := make(map[string]string) - if args.ProjectId == nil || *args.ProjectId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProjectId"} - } - routeValues["projectId"] = *args.ProjectId - if args.TeamId == nil || *args.TeamId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.TeamId"} - } - routeValues["teamId"] = *args.TeamId - - queryParams := url.Values{} - if args.Top != nil { - queryParams.Add("$top", strconv.Itoa(*args.Top)) - } - if args.Skip != nil { - queryParams.Add("$skip", strconv.Itoa(*args.Skip)) - } - locationId, _ := uuid.Parse("294c494c-2600-4d7e-b76c-3dd50c3c95be") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []webapi.TeamMember - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetTeamMembersWithExtendedProperties function -type GetTeamMembersWithExtendedPropertiesArgs struct { - // (required) The name or ID (GUID) of the team project the team belongs to. - ProjectId *string - // (required) The name or ID (GUID) of the team . - TeamId *string - // (optional) - Top *int - // (optional) - Skip *int -} - // Get a process by ID. -func (client *Client) GetProcessById(ctx context.Context, args GetProcessByIdArgs) (*Process, error) { +func (client *ClientImpl) GetProcessById(ctx context.Context, args GetProcessByIdArgs) (*Process, error) { routeValues := make(map[string]string) if args.ProcessId == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ProcessId"} @@ -257,7 +369,7 @@ type GetProcessByIdArgs struct { } // Get a list of processes. -func (client *Client) GetProcesses(ctx context.Context, args GetProcessesArgs) (*[]Process, error) { +func (client *ClientImpl) GetProcesses(ctx context.Context, args GetProcessesArgs) (*[]Process, error) { locationId, _ := uuid.Parse("93878975-88c5-4e6a-8abb-7ddd77a8a7d8") resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", nil, nil, nil, "", "application/json", nil) if err != nil { @@ -273,61 +385,8 @@ func (client *Client) GetProcesses(ctx context.Context, args GetProcessesArgs) ( type GetProcessesArgs struct { } -// Get project collection with the specified id or name. -func (client *Client) GetProjectCollection(ctx context.Context, args GetProjectCollectionArgs) (*TeamProjectCollection, error) { - routeValues := make(map[string]string) - if args.CollectionId == nil || *args.CollectionId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.CollectionId"} - } - routeValues["collectionId"] = *args.CollectionId - - locationId, _ := uuid.Parse("8031090f-ef1d-4af6-85fc-698cd75d42bf") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue TeamProjectCollection - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetProjectCollection function -type GetProjectCollectionArgs struct { - // (required) - CollectionId *string -} - -// Get project collection references for this application. -func (client *Client) GetProjectCollections(ctx context.Context, args GetProjectCollectionsArgs) (*[]TeamProjectCollectionReference, error) { - queryParams := url.Values{} - if args.Top != nil { - queryParams.Add("$top", strconv.Itoa(*args.Top)) - } - if args.Skip != nil { - queryParams.Add("$skip", strconv.Itoa(*args.Skip)) - } - locationId, _ := uuid.Parse("8031090f-ef1d-4af6-85fc-698cd75d42bf") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", nil, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []TeamProjectCollectionReference - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetProjectCollections function -type GetProjectCollectionsArgs struct { - // (optional) - Top *int - // (optional) - Skip *int -} - // Get project with the specified id or name, optionally including capabilities. -func (client *Client) GetProject(ctx context.Context, args GetProjectArgs) (*TeamProject, error) { +func (client *ClientImpl) GetProject(ctx context.Context, args GetProjectArgs) (*TeamProject, error) { routeValues := make(map[string]string) if args.ProjectId == nil || *args.ProjectId == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProjectId"} @@ -362,8 +421,93 @@ type GetProjectArgs struct { IncludeHistory *bool } +// Get project collection with the specified id or name. +func (client *ClientImpl) GetProjectCollection(ctx context.Context, args GetProjectCollectionArgs) (*TeamProjectCollection, error) { + routeValues := make(map[string]string) + if args.CollectionId == nil || *args.CollectionId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.CollectionId"} + } + routeValues["collectionId"] = *args.CollectionId + + locationId, _ := uuid.Parse("8031090f-ef1d-4af6-85fc-698cd75d42bf") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue TeamProjectCollection + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetProjectCollection function +type GetProjectCollectionArgs struct { + // (required) + CollectionId *string +} + +// Get project collection references for this application. +func (client *ClientImpl) GetProjectCollections(ctx context.Context, args GetProjectCollectionsArgs) (*[]TeamProjectCollectionReference, error) { + queryParams := url.Values{} + if args.Top != nil { + queryParams.Add("$top", strconv.Itoa(*args.Top)) + } + if args.Skip != nil { + queryParams.Add("$skip", strconv.Itoa(*args.Skip)) + } + locationId, _ := uuid.Parse("8031090f-ef1d-4af6-85fc-698cd75d42bf") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", nil, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []TeamProjectCollectionReference + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetProjectCollections function +type GetProjectCollectionsArgs struct { + // (optional) + Top *int + // (optional) + Skip *int +} + +// [Preview API] Get a collection of team project properties. +func (client *ClientImpl) GetProjectProperties(ctx context.Context, args GetProjectPropertiesArgs) (*[]ProjectProperty, error) { + routeValues := make(map[string]string) + if args.ProjectId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ProjectId"} + } + routeValues["projectId"] = (*args.ProjectId).String() + + queryParams := url.Values{} + if args.Keys != nil { + listAsString := strings.Join((*args.Keys)[:], ",") + queryParams.Add("keys", listAsString) + } + locationId, _ := uuid.Parse("4976a71a-4487-49aa-8aab-a1eda469037a") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []ProjectProperty + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetProjectProperties function +type GetProjectPropertiesArgs struct { + // (required) The team project ID. + ProjectId *uuid.UUID + // (optional) A comma-delimited string of team project property names. Wildcard characters ("?" and "*") are supported. If no key is specified, all properties will be returned. + Keys *[]string +} + // Get all projects in the organization that the authenticated user has access to. -func (client *Client) GetProjects(ctx context.Context, args GetProjectsArgs) (*GetProjectsResponseValue, error) { +func (client *ClientImpl) GetProjects(ctx context.Context, args GetProjectsArgs) (*GetProjectsResponseValue, error) { queryParams := url.Values{} if args.StateFilter != nil { queryParams.Add("stateFilter", string(*args.StateFilter)) @@ -413,210 +557,8 @@ type GetProjectsResponseValue struct { ContinuationToken string } -// Queues a project to be created. Use the [GetOperation](../../operations/operations/get) to periodically check for create project status. -func (client *Client) QueueCreateProject(ctx context.Context, args QueueCreateProjectArgs) (*operations.OperationReference, error) { - if args.ProjectToCreate == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ProjectToCreate"} - } - body, marshalErr := json.Marshal(*args.ProjectToCreate) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("603fe2ac-9723-48b9-88ad-09305aa6c6e1") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", nil, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue operations.OperationReference - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the QueueCreateProject function -type QueueCreateProjectArgs struct { - // (required) The project to create. - ProjectToCreate *TeamProject -} - -// Queues a project to be deleted. Use the [GetOperation](../../operations/operations/get) to periodically check for delete project status. -func (client *Client) QueueDeleteProject(ctx context.Context, args QueueDeleteProjectArgs) (*operations.OperationReference, error) { - routeValues := make(map[string]string) - if args.ProjectId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ProjectId"} - } - routeValues["projectId"] = (*args.ProjectId).String() - - locationId, _ := uuid.Parse("603fe2ac-9723-48b9-88ad-09305aa6c6e1") - resp, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue operations.OperationReference - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the QueueDeleteProject function -type QueueDeleteProjectArgs struct { - // (required) The project id of the project to delete. - ProjectId *uuid.UUID -} - -// Update an existing project's name, abbreviation, description, or restore a project. -func (client *Client) UpdateProject(ctx context.Context, args UpdateProjectArgs) (*operations.OperationReference, error) { - if args.ProjectUpdate == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ProjectUpdate"} - } - routeValues := make(map[string]string) - if args.ProjectId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ProjectId"} - } - routeValues["projectId"] = (*args.ProjectId).String() - - body, marshalErr := json.Marshal(*args.ProjectUpdate) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("603fe2ac-9723-48b9-88ad-09305aa6c6e1") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue operations.OperationReference - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdateProject function -type UpdateProjectArgs struct { - // (required) The updates for the project. The state must be set to wellFormed to restore the project. - ProjectUpdate *TeamProject - // (required) The project id of the project to update. - ProjectId *uuid.UUID -} - -// [Preview API] Get a collection of team project properties. -func (client *Client) GetProjectProperties(ctx context.Context, args GetProjectPropertiesArgs) (*[]ProjectProperty, error) { - routeValues := make(map[string]string) - if args.ProjectId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ProjectId"} - } - routeValues["projectId"] = (*args.ProjectId).String() - - queryParams := url.Values{} - if args.Keys != nil { - listAsString := strings.Join((*args.Keys)[:], ",") - queryParams.Add("keys", listAsString) - } - locationId, _ := uuid.Parse("4976a71a-4487-49aa-8aab-a1eda469037a") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []ProjectProperty - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetProjectProperties function -type GetProjectPropertiesArgs struct { - // (required) The team project ID. - ProjectId *uuid.UUID - // (optional) A comma-delimited string of team project property names. Wildcard characters ("?" and "*") are supported. If no key is specified, all properties will be returned. - Keys *[]string -} - -// [Preview API] Create, update, and delete team project properties. -func (client *Client) SetProjectProperties(ctx context.Context, args SetProjectPropertiesArgs) error { - if args.PatchDocument == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PatchDocument"} - } - routeValues := make(map[string]string) - if args.ProjectId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.ProjectId"} - } - routeValues["projectId"] = (*args.ProjectId).String() - - body, marshalErr := json.Marshal(*args.PatchDocument) - if marshalErr != nil { - return marshalErr - } - locationId, _ := uuid.Parse("4976a71a-4487-49aa-8aab-a1eda469037a") - _, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json-patch+json", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the SetProjectProperties function -type SetProjectPropertiesArgs struct { - // (required) The team project ID. - ProjectId *uuid.UUID - // (required) A JSON Patch document that represents an array of property operations. See RFC 6902 for more details on JSON Patch. The accepted operation verbs are Add and Remove, where Add is used for both creating and updating properties. The path consists of a forward slash and a property name. - PatchDocument *[]webapi.JsonPatchOperation -} - // [Preview API] -func (client *Client) CreateOrUpdateProxy(ctx context.Context, args CreateOrUpdateProxyArgs) (*Proxy, error) { - if args.Proxy == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Proxy"} - } - body, marshalErr := json.Marshal(*args.Proxy) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("ec1f4311-f2b4-4c15-b2b8-8990b80d2908") - resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1-preview.2", nil, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue Proxy - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateOrUpdateProxy function -type CreateOrUpdateProxyArgs struct { - // (required) - Proxy *Proxy -} - -// [Preview API] -func (client *Client) DeleteProxy(ctx context.Context, args DeleteProxyArgs) error { - queryParams := url.Values{} - if args.ProxyUrl == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "proxyUrl"} - } - queryParams.Add("proxyUrl", *args.ProxyUrl) - if args.Site != nil { - queryParams.Add("site", *args.Site) - } - locationId, _ := uuid.Parse("ec1f4311-f2b4-4c15-b2b8-8990b80d2908") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.2", nil, queryParams, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeleteProxy function -type DeleteProxyArgs struct { - // (required) - ProxyUrl *string - // (optional) - Site *string -} - -// [Preview API] -func (client *Client) GetProxies(ctx context.Context, args GetProxiesArgs) (*[]Proxy, error) { +func (client *ClientImpl) GetProxies(ctx context.Context, args GetProxiesArgs) (*[]Proxy, error) { queryParams := url.Values{} if args.ProxyUrl != nil { queryParams.Add("proxyUrl", *args.ProxyUrl) @@ -638,71 +580,8 @@ type GetProxiesArgs struct { ProxyUrl *string } -// Create a team in a team project. -func (client *Client) CreateTeam(ctx context.Context, args CreateTeamArgs) (*WebApiTeam, error) { - if args.Team == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Team"} - } - routeValues := make(map[string]string) - if args.ProjectId == nil || *args.ProjectId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProjectId"} - } - routeValues["projectId"] = *args.ProjectId - - body, marshalErr := json.Marshal(*args.Team) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("d30a3dd1-f8ba-442a-b86a-bd0c0c383e59") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue WebApiTeam - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateTeam function -type CreateTeamArgs struct { - // (required) The team data used to create the team. - Team *WebApiTeam - // (required) The name or ID (GUID) of the team project in which to create the team. - ProjectId *string -} - -// Delete a team. -func (client *Client) DeleteTeam(ctx context.Context, args DeleteTeamArgs) error { - routeValues := make(map[string]string) - if args.ProjectId == nil || *args.ProjectId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProjectId"} - } - routeValues["projectId"] = *args.ProjectId - if args.TeamId == nil || *args.TeamId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.TeamId"} - } - routeValues["teamId"] = *args.TeamId - - locationId, _ := uuid.Parse("d30a3dd1-f8ba-442a-b86a-bd0c0c383e59") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeleteTeam function -type DeleteTeamArgs struct { - // (required) The name or ID (GUID) of the team project containing the team to delete. - ProjectId *string - // (required) The name or ID of the team to delete. - TeamId *string -} - // Get a specific team. -func (client *Client) GetTeam(ctx context.Context, args GetTeamArgs) (*WebApiTeam, error) { +func (client *ClientImpl) GetTeam(ctx context.Context, args GetTeamArgs) (*WebApiTeam, error) { routeValues := make(map[string]string) if args.ProjectId == nil || *args.ProjectId == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProjectId"} @@ -738,8 +617,50 @@ type GetTeamArgs struct { ExpandIdentity *bool } +// Get a list of members for a specific team. +func (client *ClientImpl) GetTeamMembersWithExtendedProperties(ctx context.Context, args GetTeamMembersWithExtendedPropertiesArgs) (*[]webapi.TeamMember, error) { + routeValues := make(map[string]string) + if args.ProjectId == nil || *args.ProjectId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProjectId"} + } + routeValues["projectId"] = *args.ProjectId + if args.TeamId == nil || *args.TeamId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.TeamId"} + } + routeValues["teamId"] = *args.TeamId + + queryParams := url.Values{} + if args.Top != nil { + queryParams.Add("$top", strconv.Itoa(*args.Top)) + } + if args.Skip != nil { + queryParams.Add("$skip", strconv.Itoa(*args.Skip)) + } + locationId, _ := uuid.Parse("294c494c-2600-4d7e-b76c-3dd50c3c95be") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []webapi.TeamMember + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetTeamMembersWithExtendedProperties function +type GetTeamMembersWithExtendedPropertiesArgs struct { + // (required) The name or ID (GUID) of the team project the team belongs to. + ProjectId *string + // (required) The name or ID (GUID) of the team . + TeamId *string + // (optional) + Top *int + // (optional) + Skip *int +} + // Get a list of teams. -func (client *Client) GetTeams(ctx context.Context, args GetTeamsArgs) (*[]WebApiTeam, error) { +func (client *ClientImpl) GetTeams(ctx context.Context, args GetTeamsArgs) (*[]WebApiTeam, error) { routeValues := make(map[string]string) if args.ProjectId == nil || *args.ProjectId == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProjectId"} @@ -784,8 +705,180 @@ type GetTeamsArgs struct { ExpandIdentity *bool } +// Queues a project to be created. Use the [GetOperation](../../operations/operations/get) to periodically check for create project status. +func (client *ClientImpl) QueueCreateProject(ctx context.Context, args QueueCreateProjectArgs) (*operations.OperationReference, error) { + if args.ProjectToCreate == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ProjectToCreate"} + } + body, marshalErr := json.Marshal(*args.ProjectToCreate) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("603fe2ac-9723-48b9-88ad-09305aa6c6e1") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", nil, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue operations.OperationReference + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the QueueCreateProject function +type QueueCreateProjectArgs struct { + // (required) The project to create. + ProjectToCreate *TeamProject +} + +// Queues a project to be deleted. Use the [GetOperation](../../operations/operations/get) to periodically check for delete project status. +func (client *ClientImpl) QueueDeleteProject(ctx context.Context, args QueueDeleteProjectArgs) (*operations.OperationReference, error) { + routeValues := make(map[string]string) + if args.ProjectId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ProjectId"} + } + routeValues["projectId"] = (*args.ProjectId).String() + + locationId, _ := uuid.Parse("603fe2ac-9723-48b9-88ad-09305aa6c6e1") + resp, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue operations.OperationReference + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the QueueDeleteProject function +type QueueDeleteProjectArgs struct { + // (required) The project id of the project to delete. + ProjectId *uuid.UUID +} + +// [Preview API] Removes the avatar for the project. +func (client *ClientImpl) RemoveProjectAvatar(ctx context.Context, args RemoveProjectAvatarArgs) error { + routeValues := make(map[string]string) + if args.ProjectId == nil || *args.ProjectId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProjectId"} + } + routeValues["projectId"] = *args.ProjectId + + locationId, _ := uuid.Parse("54b2a2a0-859b-4d05-827c-ec4c862f641a") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the RemoveProjectAvatar function +type RemoveProjectAvatarArgs struct { + // (required) The ID or name of the project. + ProjectId *string +} + +// [Preview API] Sets the avatar for the project. +func (client *ClientImpl) SetProjectAvatar(ctx context.Context, args SetProjectAvatarArgs) error { + if args.AvatarBlob == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.AvatarBlob"} + } + routeValues := make(map[string]string) + if args.ProjectId == nil || *args.ProjectId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ProjectId"} + } + routeValues["projectId"] = *args.ProjectId + + body, marshalErr := json.Marshal(*args.AvatarBlob) + if marshalErr != nil { + return marshalErr + } + locationId, _ := uuid.Parse("54b2a2a0-859b-4d05-827c-ec4c862f641a") + _, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the SetProjectAvatar function +type SetProjectAvatarArgs struct { + // (required) The avatar blob data object to upload. + AvatarBlob *ProjectAvatar + // (required) The ID or name of the project. + ProjectId *string +} + +// [Preview API] Create, update, and delete team project properties. +func (client *ClientImpl) SetProjectProperties(ctx context.Context, args SetProjectPropertiesArgs) error { + if args.PatchDocument == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PatchDocument"} + } + routeValues := make(map[string]string) + if args.ProjectId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.ProjectId"} + } + routeValues["projectId"] = (*args.ProjectId).String() + + body, marshalErr := json.Marshal(*args.PatchDocument) + if marshalErr != nil { + return marshalErr + } + locationId, _ := uuid.Parse("4976a71a-4487-49aa-8aab-a1eda469037a") + _, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json-patch+json", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the SetProjectProperties function +type SetProjectPropertiesArgs struct { + // (required) The team project ID. + ProjectId *uuid.UUID + // (required) A JSON Patch document that represents an array of property operations. See RFC 6902 for more details on JSON Patch. The accepted operation verbs are Add and Remove, where Add is used for both creating and updating properties. The path consists of a forward slash and a property name. + PatchDocument *[]webapi.JsonPatchOperation +} + +// Update an existing project's name, abbreviation, description, or restore a project. +func (client *ClientImpl) UpdateProject(ctx context.Context, args UpdateProjectArgs) (*operations.OperationReference, error) { + if args.ProjectUpdate == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ProjectUpdate"} + } + routeValues := make(map[string]string) + if args.ProjectId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ProjectId"} + } + routeValues["projectId"] = (*args.ProjectId).String() + + body, marshalErr := json.Marshal(*args.ProjectUpdate) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("603fe2ac-9723-48b9-88ad-09305aa6c6e1") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue operations.OperationReference + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateProject function +type UpdateProjectArgs struct { + // (required) The updates for the project. The state must be set to wellFormed to restore the project. + ProjectUpdate *TeamProject + // (required) The project id of the project to update. + ProjectId *uuid.UUID +} + // Update a team's name and/or description. -func (client *Client) UpdateTeam(ctx context.Context, args UpdateTeamArgs) (*WebApiTeam, error) { +func (client *ClientImpl) UpdateTeam(ctx context.Context, args UpdateTeamArgs) (*WebApiTeam, error) { if args.TeamData == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TeamData"} } @@ -823,41 +916,3 @@ type UpdateTeamArgs struct { // (required) The name of ID of the team to update. TeamId *string } - -// [Preview API] Get a list of all teams. -func (client *Client) GetAllTeams(ctx context.Context, args GetAllTeamsArgs) (*[]WebApiTeam, error) { - queryParams := url.Values{} - if args.Mine != nil { - queryParams.Add("$mine", strconv.FormatBool(*args.Mine)) - } - if args.Top != nil { - queryParams.Add("$top", strconv.Itoa(*args.Top)) - } - if args.Skip != nil { - queryParams.Add("$skip", strconv.Itoa(*args.Skip)) - } - if args.ExpandIdentity != nil { - queryParams.Add("$expandIdentity", strconv.FormatBool(*args.ExpandIdentity)) - } - locationId, _ := uuid.Parse("7a4d9ee9-3433-4347-b47a-7a80f1cf307e") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.3", nil, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []WebApiTeam - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetAllTeams function -type GetAllTeamsArgs struct { - // (optional) If true, then return all teams requesting user is member. Otherwise return all teams user has read access. - Mine *bool - // (optional) Maximum number of teams to return. - Top *int - // (optional) Number of teams to skip. - Skip *int - // (optional) A value indicating whether or not to expand Identity information in the result WebApiTeam object. - ExpandIdentity *bool -} diff --git a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/git/client.go b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/git/client.go index e81fb401..1465e890 100644 --- a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/git/client.go +++ b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/git/client.go @@ -25,22 +25,257 @@ import ( var ResourceAreaId, _ = uuid.Parse("4e080c62-fa21-4fbc-8fef-2a10a2b38049") -type Client struct { +type Client interface { + // [Preview API] Create an annotated tag. + CreateAnnotatedTag(context.Context, CreateAnnotatedTagArgs) (*GitAnnotatedTag, error) + // [Preview API] Attach a new file to a pull request. + CreateAttachment(context.Context, CreateAttachmentArgs) (*Attachment, error) + // [Preview API] Cherry pick a specific commit or commits that are associated to a pull request into a new branch. + CreateCherryPick(context.Context, CreateCherryPickArgs) (*GitCherryPick, error) + // Create a comment on a specific thread in a pull request (up to 500 comments can be created per thread). + CreateComment(context.Context, CreateCommentArgs) (*Comment, error) + // Create Git commit status. + CreateCommitStatus(context.Context, CreateCommitStatusArgs) (*GitStatus, error) + // [Preview API] Creates a ref favorite + CreateFavorite(context.Context, CreateFavoriteArgs) (*GitRefFavorite, error) + // [Preview API] Request that another repository's refs be fetched into this one. It syncs two existing forks. To create a fork, please see the repositories endpoint + CreateForkSyncRequest(context.Context, CreateForkSyncRequestArgs) (*GitForkSyncRequest, error) + // [Preview API] Create an import request. + CreateImportRequest(context.Context, CreateImportRequestArgs) (*GitImportRequest, error) + // [Preview API] Add a like on a comment. + CreateLike(context.Context, CreateLikeArgs) error + // [Preview API] Request a git merge operation. Currently we support merging only 2 commits. + CreateMergeRequest(context.Context, CreateMergeRequestArgs) (*GitMerge, error) + // Create a pull request. + CreatePullRequest(context.Context, CreatePullRequestArgs) (*GitPullRequest, error) + // [Preview API] Create a pull request status on the iteration. This operation will have the same result as Create status on pull request with specified iteration ID in the request body. + CreatePullRequestIterationStatus(context.Context, CreatePullRequestIterationStatusArgs) (*GitPullRequestStatus, error) + // [Preview API] Create a label for a specified pull request. The only required field is the name of the new label. + CreatePullRequestLabel(context.Context, CreatePullRequestLabelArgs) (*core.WebApiTagDefinition, error) + // Add a reviewer to a pull request or cast a vote. + CreatePullRequestReviewer(context.Context, CreatePullRequestReviewerArgs) (*IdentityRefWithVote, error) + // Add reviewers to a pull request. + CreatePullRequestReviewers(context.Context, CreatePullRequestReviewersArgs) (*[]IdentityRefWithVote, error) + // [Preview API] Create a pull request status. + CreatePullRequestStatus(context.Context, CreatePullRequestStatusArgs) (*GitPullRequestStatus, error) + // Push changes to the repository. + CreatePush(context.Context, CreatePushArgs) (*GitPush, error) + // Create a git repository in a team project. + CreateRepository(context.Context, CreateRepositoryArgs) (*GitRepository, error) + // [Preview API] Starts the operation to create a new branch which reverts changes introduced by either a specific commit or commits that are associated to a pull request. + CreateRevert(context.Context, CreateRevertArgs) (*GitRevert, error) + // Create a thread in a pull request. + CreateThread(context.Context, CreateThreadArgs) (*GitPullRequestCommentThread, error) + // [Preview API] Delete a pull request attachment. + DeleteAttachment(context.Context, DeleteAttachmentArgs) error + // Delete a comment associated with a specific thread in a pull request. + DeleteComment(context.Context, DeleteCommentArgs) error + // [Preview API] Delete a like on a comment. + DeleteLike(context.Context, DeleteLikeArgs) error + // [Preview API] Delete pull request iteration status. + DeletePullRequestIterationStatus(context.Context, DeletePullRequestIterationStatusArgs) error + // [Preview API] Removes a label from the set of those assigned to the pull request. + DeletePullRequestLabels(context.Context, DeletePullRequestLabelsArgs) error + // Remove a reviewer from a pull request. + DeletePullRequestReviewer(context.Context, DeletePullRequestReviewerArgs) error + // [Preview API] Delete pull request status. + DeletePullRequestStatus(context.Context, DeletePullRequestStatusArgs) error + // [Preview API] Deletes the refs favorite specified + DeleteRefFavorite(context.Context, DeleteRefFavoriteArgs) error + // Delete a git repository + DeleteRepository(context.Context, DeleteRepositoryArgs) error + // [Preview API] Destroy (hard delete) a soft-deleted Git repository. + DeleteRepositoryFromRecycleBin(context.Context, DeleteRepositoryFromRecycleBinArgs) error + // [Preview API] Get an annotated tag. + GetAnnotatedTag(context.Context, GetAnnotatedTagArgs) (*GitAnnotatedTag, error) + // [Preview API] Get the file content of a pull request attachment. + GetAttachmentContent(context.Context, GetAttachmentContentArgs) (io.ReadCloser, error) + // [Preview API] Get a list of files attached to a given pull request. + GetAttachments(context.Context, GetAttachmentsArgs) (*[]Attachment, error) + // [Preview API] Get the file content of a pull request attachment. + GetAttachmentZip(context.Context, GetAttachmentZipArgs) (io.ReadCloser, error) + // Get a single blob. + GetBlob(context.Context, GetBlobArgs) (*GitBlobRef, error) + // Get a single blob. + GetBlobContent(context.Context, GetBlobContentArgs) (io.ReadCloser, error) + // Gets one or more blobs in a zip file download. + GetBlobsZip(context.Context, GetBlobsZipArgs) (io.ReadCloser, error) + // Get a single blob. + GetBlobZip(context.Context, GetBlobZipArgs) (io.ReadCloser, error) + // Retrieve statistics about a single branch. + GetBranch(context.Context, GetBranchArgs) (*GitBranchStats, error) + // Retrieve statistics about all branches within a repository. + GetBranches(context.Context, GetBranchesArgs) (*[]GitBranchStats, error) + // Retrieve changes for a particular commit. + GetChanges(context.Context, GetChangesArgs) (*GitCommitChanges, error) + // [Preview API] Retrieve information about a cherry pick by cherry pick Id. + GetCherryPick(context.Context, GetCherryPickArgs) (*GitCherryPick, error) + // [Preview API] Retrieve information about a cherry pick for a specific branch. + GetCherryPickForRefName(context.Context, GetCherryPickForRefNameArgs) (*GitCherryPick, error) + // Retrieve a comment associated with a specific thread in a pull request. + GetComment(context.Context, GetCommentArgs) (*Comment, error) + // Retrieve all comments associated with a specific thread in a pull request. + GetComments(context.Context, GetCommentsArgs) (*[]Comment, error) + // Retrieve a particular commit. + GetCommit(context.Context, GetCommitArgs) (*GitCommit, error) + // Find the closest common commit (the merge base) between base and target commits, and get the diff between either the base and target commits or common and target commits. + GetCommitDiffs(context.Context, GetCommitDiffsArgs) (*GitCommitDiffs, error) + // Retrieve git commits for a project + GetCommits(context.Context, GetCommitsArgs) (*[]GitCommitRef, error) + // Retrieve git commits for a project matching the search criteria + GetCommitsBatch(context.Context, GetCommitsBatchArgs) (*[]GitCommitRef, error) + // [Preview API] Retrieve deleted git repositories. + GetDeletedRepositories(context.Context, GetDeletedRepositoriesArgs) (*[]GitDeletedRepository, error) + // [Preview API] Retrieve all forks of a repository in the collection. + GetForks(context.Context, GetForksArgs) (*[]GitRepositoryRef, error) + // [Preview API] Get a specific fork sync operation's details. + GetForkSyncRequest(context.Context, GetForkSyncRequestArgs) (*GitForkSyncRequest, error) + // [Preview API] Retrieve all requested fork sync operations on this repository. + GetForkSyncRequests(context.Context, GetForkSyncRequestsArgs) (*[]GitForkSyncRequest, error) + // [Preview API] Retrieve a particular import request. + GetImportRequest(context.Context, GetImportRequestArgs) (*GitImportRequest, error) + // Get Item Metadata and/or Content for a single item. The download parameter is to indicate whether the content should be available as a download or just sent as a stream in the response. Doesn't apply to zipped content, which is always returned as a download. + GetItem(context.Context, GetItemArgs) (*GitItem, error) + // Get Item Metadata and/or Content for a single item. The download parameter is to indicate whether the content should be available as a download or just sent as a stream in the response. Doesn't apply to zipped content, which is always returned as a download. + GetItemContent(context.Context, GetItemContentArgs) (io.ReadCloser, error) + // Get Item Metadata and/or Content for a collection of items. The download parameter is to indicate whether the content should be available as a download or just sent as a stream in the response. Doesn't apply to zipped content which is always returned as a download. + GetItems(context.Context, GetItemsArgs) (*[]GitItem, error) + // Post for retrieving a creating a batch out of a set of items in a repo / project given a list of paths or a long path + GetItemsBatch(context.Context, GetItemsBatchArgs) (*[][]GitItem, error) + // Get Item Metadata and/or Content for a single item. The download parameter is to indicate whether the content should be available as a download or just sent as a stream in the response. Doesn't apply to zipped content, which is always returned as a download. + GetItemText(context.Context, GetItemTextArgs) (io.ReadCloser, error) + // Get Item Metadata and/or Content for a single item. The download parameter is to indicate whether the content should be available as a download or just sent as a stream in the response. Doesn't apply to zipped content, which is always returned as a download. + GetItemZip(context.Context, GetItemZipArgs) (io.ReadCloser, error) + // [Preview API] Get likes for a comment. + GetLikes(context.Context, GetLikesArgs) (*[]webapi.IdentityRef, error) + // [Preview API] Find the merge bases of two commits, optionally across forks. If otherRepositoryId is not specified, the merge bases will only be calculated within the context of the local repositoryNameOrId. + GetMergeBases(context.Context, GetMergeBasesArgs) (*[]GitCommitRef, error) + // [Preview API] Get a specific merge operation's details. + GetMergeRequest(context.Context, GetMergeRequestArgs) (*GitMerge, error) + // [Preview API] Retrieve a list of policy configurations by a given set of scope/filtering criteria. + GetPolicyConfigurations(context.Context, GetPolicyConfigurationsArgs) (*GitPolicyConfigurationResponse, error) + // Retrieve a pull request. + GetPullRequest(context.Context, GetPullRequestArgs) (*GitPullRequest, error) + // Retrieve a pull request. + GetPullRequestById(context.Context, GetPullRequestByIdArgs) (*GitPullRequest, error) + // Get the commits for the specified pull request. + GetPullRequestCommits(context.Context, GetPullRequestCommitsArgs) (*GetPullRequestCommitsResponseValue, error) + // Get the specified iteration for a pull request. + GetPullRequestIteration(context.Context, GetPullRequestIterationArgs) (*GitPullRequestIteration, error) + // Retrieve the changes made in a pull request between two iterations. + GetPullRequestIterationChanges(context.Context, GetPullRequestIterationChangesArgs) (*GitPullRequestIterationChanges, error) + // Get the commits for the specified iteration of a pull request. + GetPullRequestIterationCommits(context.Context, GetPullRequestIterationCommitsArgs) (*[]GitCommitRef, error) + // Get the list of iterations for the specified pull request. + GetPullRequestIterations(context.Context, GetPullRequestIterationsArgs) (*[]GitPullRequestIteration, error) + // [Preview API] Get the specific pull request iteration status by ID. The status ID is unique within the pull request across all iterations. + GetPullRequestIterationStatus(context.Context, GetPullRequestIterationStatusArgs) (*GitPullRequestStatus, error) + // [Preview API] Get all the statuses associated with a pull request iteration. + GetPullRequestIterationStatuses(context.Context, GetPullRequestIterationStatusesArgs) (*[]GitPullRequestStatus, error) + // [Preview API] Retrieves a single label that has been assigned to a pull request. + GetPullRequestLabel(context.Context, GetPullRequestLabelArgs) (*core.WebApiTagDefinition, error) + // [Preview API] Get all the labels assigned to a pull request. + GetPullRequestLabels(context.Context, GetPullRequestLabelsArgs) (*[]core.WebApiTagDefinition, error) + // [Preview API] Get external properties of the pull request. + GetPullRequestProperties(context.Context, GetPullRequestPropertiesArgs) (interface{}, error) + // This API is used to find what pull requests are related to a given commit. It can be used to either find the pull request that created a particular merge commit or it can be used to find all pull requests that have ever merged a particular commit. The input is a list of queries which each contain a list of commits. For each commit that you search against, you will get back a dictionary of commit -> pull requests. + GetPullRequestQuery(context.Context, GetPullRequestQueryArgs) (*GitPullRequestQuery, error) + // Retrieve information about a particular reviewer on a pull request + GetPullRequestReviewer(context.Context, GetPullRequestReviewerArgs) (*IdentityRefWithVote, error) + // Retrieve the reviewers for a pull request + GetPullRequestReviewers(context.Context, GetPullRequestReviewersArgs) (*[]IdentityRefWithVote, error) + // Retrieve all pull requests matching a specified criteria. + GetPullRequests(context.Context, GetPullRequestsArgs) (*[]GitPullRequest, error) + // Retrieve all pull requests matching a specified criteria. + GetPullRequestsByProject(context.Context, GetPullRequestsByProjectArgs) (*[]GitPullRequest, error) + // [Preview API] Get the specific pull request status by ID. The status ID is unique within the pull request across all iterations. + GetPullRequestStatus(context.Context, GetPullRequestStatusArgs) (*GitPullRequestStatus, error) + // [Preview API] Get all the statuses associated with a pull request. + GetPullRequestStatuses(context.Context, GetPullRequestStatusesArgs) (*[]GitPullRequestStatus, error) + // Retrieve a thread in a pull request. + GetPullRequestThread(context.Context, GetPullRequestThreadArgs) (*GitPullRequestCommentThread, error) + // Retrieve a list of work items associated with a pull request. + GetPullRequestWorkItemRefs(context.Context, GetPullRequestWorkItemRefsArgs) (*[]webapi.ResourceRef, error) + // Retrieves a particular push. + GetPush(context.Context, GetPushArgs) (*GitPush, error) + // Retrieve a list of commits associated with a particular push. + GetPushCommits(context.Context, GetPushCommitsArgs) (*[]GitCommitRef, error) + // Retrieves pushes associated with the specified repository. + GetPushes(context.Context, GetPushesArgs) (*[]GitPush, error) + // [Preview API] Retrieve soft-deleted git repositories from the recycle bin. + GetRecycleBinRepositories(context.Context, GetRecycleBinRepositoriesArgs) (*[]GitDeletedRepository, error) + // [Preview API] Gets the refs favorite for a favorite Id. + GetRefFavorite(context.Context, GetRefFavoriteArgs) (*GitRefFavorite, error) + // [Preview API] Gets the refs favorites for a repo and an identity. + GetRefFavorites(context.Context, GetRefFavoritesArgs) (*[]GitRefFavorite, error) + // Queries the provided repository for its refs and returns them. + GetRefs(context.Context, GetRefsArgs) (*GetRefsResponseValue, error) + // Retrieve git repositories. + GetRepositories(context.Context, GetRepositoriesArgs) (*[]GitRepository, error) + // Retrieve a git repository. + GetRepository(context.Context, GetRepositoryArgs) (*GitRepository, error) + // Retrieve a git repository. + GetRepositoryWithParent(context.Context, GetRepositoryWithParentArgs) (*GitRepository, error) + // [Preview API] Retrieve information about a revert operation by revert Id. + GetRevert(context.Context, GetRevertArgs) (*GitRevert, error) + // [Preview API] Retrieve information about a revert operation for a specific branch. + GetRevertForRefName(context.Context, GetRevertForRefNameArgs) (*GitRevert, error) + // Get statuses associated with the Git commit. + GetStatuses(context.Context, GetStatusesArgs) (*[]GitStatus, error) + // [Preview API] Retrieve a pull request suggestion for a particular repository or team project. + GetSuggestions(context.Context, GetSuggestionsArgs) (*[]GitSuggestion, error) + // Retrieve all threads in a pull request. + GetThreads(context.Context, GetThreadsArgs) (*[]GitPullRequestCommentThread, error) + // The Tree endpoint returns the collection of objects underneath the specified tree. Trees are folders in a Git repository. + GetTree(context.Context, GetTreeArgs) (*GitTreeRef, error) + // The Tree endpoint returns the collection of objects underneath the specified tree. Trees are folders in a Git repository. + GetTreeZip(context.Context, GetTreeZipArgs) (io.ReadCloser, error) + // [Preview API] Retrieve import requests for a repository. + QueryImportRequests(context.Context, QueryImportRequestsArgs) (*[]GitImportRequest, error) + // [Preview API] Recover a soft-deleted Git repository. Recently deleted repositories go into a soft-delete state for a period of time before they are hard deleted and become unrecoverable. + RestoreRepositoryFromRecycleBin(context.Context, RestoreRepositoryFromRecycleBinArgs) (*GitRepository, error) + // [Preview API] Sends an e-mail notification about a specific pull request to a set of recipients + SharePullRequest(context.Context, SharePullRequestArgs) error + // Update a comment associated with a specific thread in a pull request. + UpdateComment(context.Context, UpdateCommentArgs) (*Comment, error) + // [Preview API] Retry or abandon a failed import request. + UpdateImportRequest(context.Context, UpdateImportRequestArgs) (*GitImportRequest, error) + // Update a pull request + UpdatePullRequest(context.Context, UpdatePullRequestArgs) (*GitPullRequest, error) + // [Preview API] Update pull request iteration statuses collection. The only supported operation type is `remove`. + UpdatePullRequestIterationStatuses(context.Context, UpdatePullRequestIterationStatusesArgs) error + // [Preview API] Create or update pull request external properties. The patch operation can be `add`, `replace` or `remove`. For `add` operation, the path can be empty. If the path is empty, the value must be a list of key value pairs. For `replace` operation, the path cannot be empty. If the path does not exist, the property will be added to the collection. For `remove` operation, the path cannot be empty. If the path does not exist, no action will be performed. + UpdatePullRequestProperties(context.Context, UpdatePullRequestPropertiesArgs) (interface{}, error) + // Reset the votes of multiple reviewers on a pull request. NOTE: This endpoint only supports updating votes, but does not support updating required reviewers (use policy) or display names. + UpdatePullRequestReviewers(context.Context, UpdatePullRequestReviewersArgs) error + // [Preview API] Update pull request statuses collection. The only supported operation type is `remove`. + UpdatePullRequestStatuses(context.Context, UpdatePullRequestStatusesArgs) error + // Lock or Unlock a branch. + UpdateRef(context.Context, UpdateRefArgs) (*GitRef, error) + // Creating, updating, or deleting refs(branches). + UpdateRefs(context.Context, UpdateRefsArgs) (*[]GitRefUpdateResult, error) + // Updates the Git repository with either a new repo name or a new default branch. + UpdateRepository(context.Context, UpdateRepositoryArgs) (*GitRepository, error) + // Update a thread in a pull request. + UpdateThread(context.Context, UpdateThreadArgs) (*GitPullRequestCommentThread, error) +} + +type ClientImpl struct { Client azuredevops.Client } -func NewClient(ctx context.Context, connection *azuredevops.Connection) (*Client, error) { +func NewClient(ctx context.Context, connection *azuredevops.Connection) (Client, error) { client, err := connection.GetClientByResourceAreaId(ctx, ResourceAreaId) if err != nil { return nil, err } - return &Client{ + return &ClientImpl{ Client: *client, }, nil } // [Preview API] Create an annotated tag. -func (client *Client) CreateAnnotatedTag(ctx context.Context, args CreateAnnotatedTagArgs) (*GitAnnotatedTag, error) { +func (client *ClientImpl) CreateAnnotatedTag(ctx context.Context, args CreateAnnotatedTagArgs) (*GitAnnotatedTag, error) { if args.TagObject == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TagObject"} } @@ -79,8 +314,1243 @@ type CreateAnnotatedTagArgs struct { RepositoryId *string } +// [Preview API] Attach a new file to a pull request. +func (client *ClientImpl) CreateAttachment(ctx context.Context, args CreateAttachmentArgs) (*Attachment, error) { + if args.UploadStream == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.UploadStream"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.FileName == nil || *args.FileName == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.FileName"} + } + routeValues["fileName"] = *args.FileName + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + locationId, _ := uuid.Parse("965d9361-878b-413b-a494-45d5b5fd8ab7") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, args.UploadStream, "application/octet-stream", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue Attachment + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateAttachment function +type CreateAttachmentArgs struct { + // (required) Stream to upload + UploadStream io.Reader + // (required) The name of the file. + FileName *string + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Cherry pick a specific commit or commits that are associated to a pull request into a new branch. +func (client *ClientImpl) CreateCherryPick(ctx context.Context, args CreateCherryPickArgs) (*GitCherryPick, error) { + if args.CherryPickToCreate == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.CherryPickToCreate"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + + body, marshalErr := json.Marshal(*args.CherryPickToCreate) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("033bad68-9a14-43d1-90e0-59cb8856fef6") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitCherryPick + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateCherryPick function +type CreateCherryPickArgs struct { + // (required) + CherryPickToCreate *GitAsyncRefOperationParameters + // (required) Project ID or project name + Project *string + // (required) ID of the repository. + RepositoryId *string +} + +// Create a comment on a specific thread in a pull request (up to 500 comments can be created per thread). +func (client *ClientImpl) CreateComment(ctx context.Context, args CreateCommentArgs) (*Comment, error) { + if args.Comment == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Comment"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.ThreadId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} + } + routeValues["threadId"] = strconv.Itoa(*args.ThreadId) + + body, marshalErr := json.Marshal(*args.Comment) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("965a3ec7-5ed8-455a-bdcb-835a5ea7fe7b") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue Comment + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateComment function +type CreateCommentArgs struct { + // (required) The comment to create. Comments can be up to 150,000 characters. + Comment *Comment + // (required) The repository ID of the pull request's target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the thread that the desired comment is in. + ThreadId *int + // (optional) Project ID or project name + Project *string +} + +// Create Git commit status. +func (client *ClientImpl) CreateCommitStatus(ctx context.Context, args CreateCommitStatusArgs) (*GitStatus, error) { + if args.GitCommitStatusToCreate == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.GitCommitStatusToCreate"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.CommitId == nil || *args.CommitId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.CommitId"} + } + routeValues["commitId"] = *args.CommitId + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + + body, marshalErr := json.Marshal(*args.GitCommitStatusToCreate) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("428dd4fb-fda5-4722-af02-9313b80305da") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitStatus + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateCommitStatus function +type CreateCommitStatusArgs struct { + // (required) Git commit status object to create. + GitCommitStatusToCreate *GitStatus + // (required) ID of the Git commit. + CommitId *string + // (required) ID of the repository. + RepositoryId *string + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Creates a ref favorite +func (client *ClientImpl) CreateFavorite(ctx context.Context, args CreateFavoriteArgs) (*GitRefFavorite, error) { + if args.Favorite == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Favorite"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + + body, marshalErr := json.Marshal(*args.Favorite) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("876f70af-5792-485a-a1c7-d0a7b2f42bbb") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitRefFavorite + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateFavorite function +type CreateFavoriteArgs struct { + // (required) The ref favorite to create. + Favorite *GitRefFavorite + // (required) Project ID or project name + Project *string +} + +// [Preview API] Request that another repository's refs be fetched into this one. It syncs two existing forks. To create a fork, please see the repositories endpoint +func (client *ClientImpl) CreateForkSyncRequest(ctx context.Context, args CreateForkSyncRequestArgs) (*GitForkSyncRequest, error) { + if args.SyncParams == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.SyncParams"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryNameOrId == nil || *args.RepositoryNameOrId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryNameOrId"} + } + routeValues["repositoryNameOrId"] = *args.RepositoryNameOrId + + queryParams := url.Values{} + if args.IncludeLinks != nil { + queryParams.Add("includeLinks", strconv.FormatBool(*args.IncludeLinks)) + } + body, marshalErr := json.Marshal(*args.SyncParams) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("1703f858-b9d1-46af-ab62-483e9e1055b5") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitForkSyncRequest + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateForkSyncRequest function +type CreateForkSyncRequestArgs struct { + // (required) Source repository and ref mapping. + SyncParams *GitForkSyncRequestParameters + // (required) The name or ID of the repository. + RepositoryNameOrId *string + // (optional) Project ID or project name + Project *string + // (optional) True to include links + IncludeLinks *bool +} + +// [Preview API] Create an import request. +func (client *ClientImpl) CreateImportRequest(ctx context.Context, args CreateImportRequestArgs) (*GitImportRequest, error) { + if args.ImportRequest == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ImportRequest"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + + body, marshalErr := json.Marshal(*args.ImportRequest) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("01828ddc-3600-4a41-8633-99b3a73a0eb3") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitImportRequest + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateImportRequest function +type CreateImportRequestArgs struct { + // (required) The import request to create. + ImportRequest *GitImportRequest + // (required) Project ID or project name + Project *string + // (required) The name or ID of the repository. + RepositoryId *string +} + +// [Preview API] Add a like on a comment. +func (client *ClientImpl) CreateLike(ctx context.Context, args CreateLikeArgs) error { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.ThreadId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} + } + routeValues["threadId"] = strconv.Itoa(*args.ThreadId) + if args.CommentId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.CommentId"} + } + routeValues["commentId"] = strconv.Itoa(*args.CommentId) + + locationId, _ := uuid.Parse("5f2e2851-1389-425b-a00b-fb2adb3ef31b") + _, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the CreateLike function +type CreateLikeArgs struct { + // (required) The repository ID of the pull request's target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) The ID of the thread that contains the comment. + ThreadId *int + // (required) The ID of the comment. + CommentId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Request a git merge operation. Currently we support merging only 2 commits. +func (client *ClientImpl) CreateMergeRequest(ctx context.Context, args CreateMergeRequestArgs) (*GitMerge, error) { + if args.MergeParameters == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.MergeParameters"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RepositoryNameOrId == nil || *args.RepositoryNameOrId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryNameOrId"} + } + routeValues["repositoryNameOrId"] = *args.RepositoryNameOrId + + queryParams := url.Values{} + if args.IncludeLinks != nil { + queryParams.Add("includeLinks", strconv.FormatBool(*args.IncludeLinks)) + } + body, marshalErr := json.Marshal(*args.MergeParameters) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("985f7ae9-844f-4906-9897-7ef41516c0e2") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitMerge + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateMergeRequest function +type CreateMergeRequestArgs struct { + // (required) Parents commitIds and merge commit messsage. + MergeParameters *GitMergeParameters + // (required) Project ID or project name + Project *string + // (required) The name or ID of the repository. + RepositoryNameOrId *string + // (optional) True to include links + IncludeLinks *bool +} + +// Create a pull request. +func (client *ClientImpl) CreatePullRequest(ctx context.Context, args CreatePullRequestArgs) (*GitPullRequest, error) { + if args.GitPullRequestToCreate == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.GitPullRequestToCreate"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + + queryParams := url.Values{} + if args.SupportsIterations != nil { + queryParams.Add("supportsIterations", strconv.FormatBool(*args.SupportsIterations)) + } + body, marshalErr := json.Marshal(*args.GitPullRequestToCreate) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("9946fd70-0d40-406e-b686-b4744cbbcc37") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitPullRequest + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreatePullRequest function +type CreatePullRequestArgs struct { + // (required) The pull request to create. + GitPullRequestToCreate *GitPullRequest + // (required) The repository ID of the pull request's target branch. + RepositoryId *string + // (optional) Project ID or project name + Project *string + // (optional) If true, subsequent pushes to the pull request will be individually reviewable. Set this to false for large pull requests for performance reasons if this functionality is not needed. + SupportsIterations *bool +} + +// [Preview API] Create a pull request status on the iteration. This operation will have the same result as Create status on pull request with specified iteration ID in the request body. +func (client *ClientImpl) CreatePullRequestIterationStatus(ctx context.Context, args CreatePullRequestIterationStatusArgs) (*GitPullRequestStatus, error) { + if args.Status == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Status"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.IterationId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} + } + routeValues["iterationId"] = strconv.Itoa(*args.IterationId) + + body, marshalErr := json.Marshal(*args.Status) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("75cf11c5-979f-4038-a76e-058a06adf2bf") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitPullRequestStatus + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreatePullRequestIterationStatus function +type CreatePullRequestIterationStatusArgs struct { + // (required) Pull request status to create. + Status *GitPullRequestStatus + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the pull request iteration. + IterationId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Create a label for a specified pull request. The only required field is the name of the new label. +func (client *ClientImpl) CreatePullRequestLabel(ctx context.Context, args CreatePullRequestLabelArgs) (*core.WebApiTagDefinition, error) { + if args.Label == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Label"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + queryParams := url.Values{} + if args.ProjectId != nil { + queryParams.Add("projectId", *args.ProjectId) + } + body, marshalErr := json.Marshal(*args.Label) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("f22387e3-984e-4c52-9c6d-fbb8f14c812d") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue core.WebApiTagDefinition + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreatePullRequestLabel function +type CreatePullRequestLabelArgs struct { + // (required) Label to assign to the pull request. + Label *core.WebApiCreateTagRequestData + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string + // (optional) Project ID or project name. + ProjectId *string +} + +// Add a reviewer to a pull request or cast a vote. +func (client *ClientImpl) CreatePullRequestReviewer(ctx context.Context, args CreatePullRequestReviewerArgs) (*IdentityRefWithVote, error) { + if args.Reviewer == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Reviewer"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.ReviewerId == nil || *args.ReviewerId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ReviewerId"} + } + routeValues["reviewerId"] = *args.ReviewerId + + body, marshalErr := json.Marshal(*args.Reviewer) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("4b6702c7-aa35-4b89-9c96-b9abf6d3e540") + resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue IdentityRefWithVote + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreatePullRequestReviewer function +type CreatePullRequestReviewerArgs struct { + // (required) Reviewer's vote.
If the reviewer's ID is included here, it must match the reviewerID parameter.
Reviewers can set their own vote with this method. When adding other reviewers, vote must be set to zero. + Reviewer *IdentityRefWithVote + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the reviewer. + ReviewerId *string + // (optional) Project ID or project name + Project *string +} + +// Add reviewers to a pull request. +func (client *ClientImpl) CreatePullRequestReviewers(ctx context.Context, args CreatePullRequestReviewersArgs) (*[]IdentityRefWithVote, error) { + if args.Reviewers == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Reviewers"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + body, marshalErr := json.Marshal(*args.Reviewers) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("4b6702c7-aa35-4b89-9c96-b9abf6d3e540") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []IdentityRefWithVote + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreatePullRequestReviewers function +type CreatePullRequestReviewersArgs struct { + // (required) Reviewers to add to the pull request. + Reviewers *[]webapi.IdentityRef + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Create a pull request status. +func (client *ClientImpl) CreatePullRequestStatus(ctx context.Context, args CreatePullRequestStatusArgs) (*GitPullRequestStatus, error) { + if args.Status == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Status"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + body, marshalErr := json.Marshal(*args.Status) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("b5f6bb4f-8d1e-4d79-8d11-4c9172c99c35") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitPullRequestStatus + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreatePullRequestStatus function +type CreatePullRequestStatusArgs struct { + // (required) Pull request status to create. + Status *GitPullRequestStatus + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + +// Push changes to the repository. +func (client *ClientImpl) CreatePush(ctx context.Context, args CreatePushArgs) (*GitPush, error) { + if args.Push == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Push"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + + body, marshalErr := json.Marshal(*args.Push) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("ea98d07b-3c87-4971-8ede-a613694ffb55") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitPush + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreatePush function +type CreatePushArgs struct { + // (required) + Push *GitPush + // (required) The name or ID of the repository. + RepositoryId *string + // (optional) Project ID or project name + Project *string +} + +// Create a git repository in a team project. +func (client *ClientImpl) CreateRepository(ctx context.Context, args CreateRepositoryArgs) (*GitRepository, error) { + if args.GitRepositoryToCreate == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.GitRepositoryToCreate"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + + queryParams := url.Values{} + if args.SourceRef != nil { + queryParams.Add("sourceRef", *args.SourceRef) + } + body, marshalErr := json.Marshal(*args.GitRepositoryToCreate) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("225f7195-f9c7-4d14-ab28-a83f7ff77e1f") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitRepository + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateRepository function +type CreateRepositoryArgs struct { + // (required) Specify the repo name, team project and/or parent repository. Team project information can be omitted from gitRepositoryToCreate if the request is project-scoped (i.e., includes project Id). + GitRepositoryToCreate *GitRepositoryCreateOptions + // (optional) Project ID or project name + Project *string + // (optional) [optional] Specify the source refs to use while creating a fork repo + SourceRef *string +} + +// [Preview API] Starts the operation to create a new branch which reverts changes introduced by either a specific commit or commits that are associated to a pull request. +func (client *ClientImpl) CreateRevert(ctx context.Context, args CreateRevertArgs) (*GitRevert, error) { + if args.RevertToCreate == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RevertToCreate"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + + body, marshalErr := json.Marshal(*args.RevertToCreate) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("bc866058-5449-4715-9cf1-a510b6ff193c") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitRevert + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateRevert function +type CreateRevertArgs struct { + // (required) + RevertToCreate *GitAsyncRefOperationParameters + // (required) Project ID or project name + Project *string + // (required) ID of the repository. + RepositoryId *string +} + +// Create a thread in a pull request. +func (client *ClientImpl) CreateThread(ctx context.Context, args CreateThreadArgs) (*GitPullRequestCommentThread, error) { + if args.CommentThread == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.CommentThread"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + body, marshalErr := json.Marshal(*args.CommentThread) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("ab6e2e5d-a0b7-4153-b64a-a4efe0d49449") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitPullRequestCommentThread + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateThread function +type CreateThreadArgs struct { + // (required) The thread to create. Thread must contain at least one comment. + CommentThread *GitPullRequestCommentThread + // (required) Repository ID of the pull request's target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Delete a pull request attachment. +func (client *ClientImpl) DeleteAttachment(ctx context.Context, args DeleteAttachmentArgs) error { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.FileName == nil || *args.FileName == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.FileName"} + } + routeValues["fileName"] = *args.FileName + if args.RepositoryId == nil || *args.RepositoryId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + locationId, _ := uuid.Parse("965d9361-878b-413b-a494-45d5b5fd8ab7") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeleteAttachment function +type DeleteAttachmentArgs struct { + // (required) The name of the attachment to delete. + FileName *string + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + +// Delete a comment associated with a specific thread in a pull request. +func (client *ClientImpl) DeleteComment(ctx context.Context, args DeleteCommentArgs) error { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.ThreadId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} + } + routeValues["threadId"] = strconv.Itoa(*args.ThreadId) + if args.CommentId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.CommentId"} + } + routeValues["commentId"] = strconv.Itoa(*args.CommentId) + + locationId, _ := uuid.Parse("965a3ec7-5ed8-455a-bdcb-835a5ea7fe7b") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeleteComment function +type DeleteCommentArgs struct { + // (required) The repository ID of the pull request's target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the thread that the desired comment is in. + ThreadId *int + // (required) ID of the comment. + CommentId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Delete a like on a comment. +func (client *ClientImpl) DeleteLike(ctx context.Context, args DeleteLikeArgs) error { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.ThreadId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} + } + routeValues["threadId"] = strconv.Itoa(*args.ThreadId) + if args.CommentId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.CommentId"} + } + routeValues["commentId"] = strconv.Itoa(*args.CommentId) + + locationId, _ := uuid.Parse("5f2e2851-1389-425b-a00b-fb2adb3ef31b") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeleteLike function +type DeleteLikeArgs struct { + // (required) The repository ID of the pull request's target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) The ID of the thread that contains the comment. + ThreadId *int + // (required) The ID of the comment. + CommentId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Delete pull request iteration status. +func (client *ClientImpl) DeletePullRequestIterationStatus(ctx context.Context, args DeletePullRequestIterationStatusArgs) error { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.IterationId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} + } + routeValues["iterationId"] = strconv.Itoa(*args.IterationId) + if args.StatusId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.StatusId"} + } + routeValues["statusId"] = strconv.Itoa(*args.StatusId) + + locationId, _ := uuid.Parse("75cf11c5-979f-4038-a76e-058a06adf2bf") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeletePullRequestIterationStatus function +type DeletePullRequestIterationStatusArgs struct { + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the pull request iteration. + IterationId *int + // (required) ID of the pull request status. + StatusId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Removes a label from the set of those assigned to the pull request. +func (client *ClientImpl) DeletePullRequestLabels(ctx context.Context, args DeletePullRequestLabelsArgs) error { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.LabelIdOrName == nil || *args.LabelIdOrName == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.LabelIdOrName"} + } + routeValues["labelIdOrName"] = *args.LabelIdOrName + + queryParams := url.Values{} + if args.ProjectId != nil { + queryParams.Add("projectId", *args.ProjectId) + } + locationId, _ := uuid.Parse("f22387e3-984e-4c52-9c6d-fbb8f14c812d") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeletePullRequestLabels function +type DeletePullRequestLabelsArgs struct { + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) The name or ID of the label requested. + LabelIdOrName *string + // (optional) Project ID or project name + Project *string + // (optional) Project ID or project name. + ProjectId *string +} + +// Remove a reviewer from a pull request. +func (client *ClientImpl) DeletePullRequestReviewer(ctx context.Context, args DeletePullRequestReviewerArgs) error { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.ReviewerId == nil || *args.ReviewerId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ReviewerId"} + } + routeValues["reviewerId"] = *args.ReviewerId + + locationId, _ := uuid.Parse("4b6702c7-aa35-4b89-9c96-b9abf6d3e540") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeletePullRequestReviewer function +type DeletePullRequestReviewerArgs struct { + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the reviewer to remove. + ReviewerId *string + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Delete pull request status. +func (client *ClientImpl) DeletePullRequestStatus(ctx context.Context, args DeletePullRequestStatusArgs) error { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.StatusId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.StatusId"} + } + routeValues["statusId"] = strconv.Itoa(*args.StatusId) + + locationId, _ := uuid.Parse("b5f6bb4f-8d1e-4d79-8d11-4c9172c99c35") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeletePullRequestStatus function +type DeletePullRequestStatusArgs struct { + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the pull request status. + StatusId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Deletes the refs favorite specified +func (client *ClientImpl) DeleteRefFavorite(ctx context.Context, args DeleteRefFavoriteArgs) error { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.FavoriteId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.FavoriteId"} + } + routeValues["favoriteId"] = strconv.Itoa(*args.FavoriteId) + + locationId, _ := uuid.Parse("876f70af-5792-485a-a1c7-d0a7b2f42bbb") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeleteRefFavorite function +type DeleteRefFavoriteArgs struct { + // (required) Project ID or project name + Project *string + // (required) The Id of the ref favorite to delete. + FavoriteId *int +} + +// Delete a git repository +func (client *ClientImpl) DeleteRepository(ctx context.Context, args DeleteRepositoryArgs) error { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = (*args.RepositoryId).String() + + locationId, _ := uuid.Parse("225f7195-f9c7-4d14-ab28-a83f7ff77e1f") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeleteRepository function +type DeleteRepositoryArgs struct { + // (required) The name or ID of the repository. + RepositoryId *uuid.UUID + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Destroy (hard delete) a soft-deleted Git repository. +func (client *ClientImpl) DeleteRepositoryFromRecycleBin(ctx context.Context, args DeleteRepositoryFromRecycleBinArgs) error { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RepositoryId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = (*args.RepositoryId).String() + + locationId, _ := uuid.Parse("a663da97-81db-4eb3-8b83-287670f63073") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeleteRepositoryFromRecycleBin function +type DeleteRepositoryFromRecycleBinArgs struct { + // (required) Project ID or project name + Project *string + // (required) The ID of the repository. + RepositoryId *uuid.UUID +} + // [Preview API] Get an annotated tag. -func (client *Client) GetAnnotatedTag(ctx context.Context, args GetAnnotatedTagArgs) (*GitAnnotatedTag, error) { +func (client *ClientImpl) GetAnnotatedTag(ctx context.Context, args GetAnnotatedTagArgs) (*GitAnnotatedTag, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -116,8 +1586,124 @@ type GetAnnotatedTagArgs struct { ObjectId *string } +// [Preview API] Get the file content of a pull request attachment. +func (client *ClientImpl) GetAttachmentContent(ctx context.Context, args GetAttachmentContentArgs) (io.ReadCloser, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.FileName == nil || *args.FileName == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.FileName"} + } + routeValues["fileName"] = *args.FileName + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + locationId, _ := uuid.Parse("965d9361-878b-413b-a494-45d5b5fd8ab7") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/octet-stream", nil) + if err != nil { + return nil, err + } + + return resp.Body, err +} + +// Arguments for the GetAttachmentContent function +type GetAttachmentContentArgs struct { + // (required) The name of the attachment. + FileName *string + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Get a list of files attached to a given pull request. +func (client *ClientImpl) GetAttachments(ctx context.Context, args GetAttachmentsArgs) (*[]Attachment, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + locationId, _ := uuid.Parse("965d9361-878b-413b-a494-45d5b5fd8ab7") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []Attachment + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetAttachments function +type GetAttachmentsArgs struct { + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Get the file content of a pull request attachment. +func (client *ClientImpl) GetAttachmentZip(ctx context.Context, args GetAttachmentZipArgs) (io.ReadCloser, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.FileName == nil || *args.FileName == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.FileName"} + } + routeValues["fileName"] = *args.FileName + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + locationId, _ := uuid.Parse("965d9361-878b-413b-a494-45d5b5fd8ab7") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/zip", nil) + if err != nil { + return nil, err + } + + return resp.Body, err +} + +// Arguments for the GetAttachmentZip function +type GetAttachmentZipArgs struct { + // (required) The name of the attachment. + FileName *string + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + // Get a single blob. -func (client *Client) GetBlob(ctx context.Context, args GetBlobArgs) (*GitBlobRef, error) { +func (client *ClientImpl) GetBlob(ctx context.Context, args GetBlobArgs) (*GitBlobRef, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -169,7 +1755,7 @@ type GetBlobArgs struct { } // Get a single blob. -func (client *Client) GetBlobContent(ctx context.Context, args GetBlobContentArgs) (io.ReadCloser, error) { +func (client *ClientImpl) GetBlobContent(ctx context.Context, args GetBlobContentArgs) (io.ReadCloser, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -219,7 +1805,7 @@ type GetBlobContentArgs struct { } // Gets one or more blobs in a zip file download. -func (client *Client) GetBlobsZip(ctx context.Context, args GetBlobsZipArgs) (io.ReadCloser, error) { +func (client *ClientImpl) GetBlobsZip(ctx context.Context, args GetBlobsZipArgs) (io.ReadCloser, error) { if args.BlobIds == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BlobIds"} } @@ -262,7 +1848,7 @@ type GetBlobsZipArgs struct { } // Get a single blob. -func (client *Client) GetBlobZip(ctx context.Context, args GetBlobZipArgs) (io.ReadCloser, error) { +func (client *ClientImpl) GetBlobZip(ctx context.Context, args GetBlobZipArgs) (io.ReadCloser, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -312,7 +1898,7 @@ type GetBlobZipArgs struct { } // Retrieve statistics about a single branch. -func (client *Client) GetBranch(ctx context.Context, args GetBranchArgs) (*GitBranchStats, error) { +func (client *ClientImpl) GetBranch(ctx context.Context, args GetBranchArgs) (*GitBranchStats, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -362,7 +1948,7 @@ type GetBranchArgs struct { } // Retrieve statistics about all branches within a repository. -func (client *Client) GetBranches(ctx context.Context, args GetBranchesArgs) (*[]GitBranchStats, error) { +func (client *ClientImpl) GetBranches(ctx context.Context, args GetBranchesArgs) (*[]GitBranchStats, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -406,7 +1992,7 @@ type GetBranchesArgs struct { } // Retrieve changes for a particular commit. -func (client *Client) GetChanges(ctx context.Context, args GetChangesArgs) (*GitCommitChanges, error) { +func (client *ClientImpl) GetChanges(ctx context.Context, args GetChangesArgs) (*GitCommitChanges, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -452,48 +2038,8 @@ type GetChangesArgs struct { Skip *int } -// [Preview API] Cherry pick a specific commit or commits that are associated to a pull request into a new branch. -func (client *Client) CreateCherryPick(ctx context.Context, args CreateCherryPickArgs) (*GitCherryPick, error) { - if args.CherryPickToCreate == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.CherryPickToCreate"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - - body, marshalErr := json.Marshal(*args.CherryPickToCreate) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("033bad68-9a14-43d1-90e0-59cb8856fef6") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitCherryPick - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateCherryPick function -type CreateCherryPickArgs struct { - // (required) - CherryPickToCreate *GitAsyncRefOperationParameters - // (required) Project ID or project name - Project *string - // (required) ID of the repository. - RepositoryId *string -} - // [Preview API] Retrieve information about a cherry pick by cherry pick Id. -func (client *Client) GetCherryPick(ctx context.Context, args GetCherryPickArgs) (*GitCherryPick, error) { +func (client *ClientImpl) GetCherryPick(ctx context.Context, args GetCherryPickArgs) (*GitCherryPick, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -530,7 +2076,7 @@ type GetCherryPickArgs struct { } // [Preview API] Retrieve information about a cherry pick for a specific branch. -func (client *Client) GetCherryPickForRefName(ctx context.Context, args GetCherryPickForRefNameArgs) (*GitCherryPick, error) { +func (client *ClientImpl) GetCherryPickForRefName(ctx context.Context, args GetCherryPickForRefNameArgs) (*GitCherryPick, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -567,8 +2113,140 @@ type GetCherryPickForRefNameArgs struct { RefName *string } +// Retrieve a comment associated with a specific thread in a pull request. +func (client *ClientImpl) GetComment(ctx context.Context, args GetCommentArgs) (*Comment, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.ThreadId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} + } + routeValues["threadId"] = strconv.Itoa(*args.ThreadId) + if args.CommentId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.CommentId"} + } + routeValues["commentId"] = strconv.Itoa(*args.CommentId) + + locationId, _ := uuid.Parse("965a3ec7-5ed8-455a-bdcb-835a5ea7fe7b") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue Comment + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetComment function +type GetCommentArgs struct { + // (required) The repository ID of the pull request's target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the thread that the desired comment is in. + ThreadId *int + // (required) ID of the comment. + CommentId *int + // (optional) Project ID or project name + Project *string +} + +// Retrieve all comments associated with a specific thread in a pull request. +func (client *ClientImpl) GetComments(ctx context.Context, args GetCommentsArgs) (*[]Comment, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.ThreadId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} + } + routeValues["threadId"] = strconv.Itoa(*args.ThreadId) + + locationId, _ := uuid.Parse("965a3ec7-5ed8-455a-bdcb-835a5ea7fe7b") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []Comment + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetComments function +type GetCommentsArgs struct { + // (required) The repository ID of the pull request's target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the thread. + ThreadId *int + // (optional) Project ID or project name + Project *string +} + +// Retrieve a particular commit. +func (client *ClientImpl) GetCommit(ctx context.Context, args GetCommitArgs) (*GitCommit, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.CommitId == nil || *args.CommitId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.CommitId"} + } + routeValues["commitId"] = *args.CommitId + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + + queryParams := url.Values{} + if args.ChangeCount != nil { + queryParams.Add("changeCount", strconv.Itoa(*args.ChangeCount)) + } + locationId, _ := uuid.Parse("c2570c3b-5b3f-41b8-98bf-5407bfde8d58") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitCommit + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetCommit function +type GetCommitArgs struct { + // (required) The id of the commit. + CommitId *string + // (required) The id or friendly name of the repository. To use the friendly name, projectId must also be specified. + RepositoryId *string + // (optional) Project ID or project name + Project *string + // (optional) The number of changes to include in the result. + ChangeCount *int +} + // Find the closest common commit (the merge base) between base and target commits, and get the diff between either the base and target commits or common and target commits. -func (client *Client) GetCommitDiffs(ctx context.Context, args GetCommitDiffsArgs) (*GitCommitDiffs, error) { +func (client *ClientImpl) GetCommitDiffs(ctx context.Context, args GetCommitDiffsArgs) (*GitCommitDiffs, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -639,50 +2317,8 @@ type GetCommitDiffsArgs struct { TargetVersionDescriptor *GitTargetVersionDescriptor } -// Retrieve a particular commit. -func (client *Client) GetCommit(ctx context.Context, args GetCommitArgs) (*GitCommit, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.CommitId == nil || *args.CommitId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.CommitId"} - } - routeValues["commitId"] = *args.CommitId - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - - queryParams := url.Values{} - if args.ChangeCount != nil { - queryParams.Add("changeCount", strconv.Itoa(*args.ChangeCount)) - } - locationId, _ := uuid.Parse("c2570c3b-5b3f-41b8-98bf-5407bfde8d58") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitCommit - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetCommit function -type GetCommitArgs struct { - // (required) The id of the commit. - CommitId *string - // (required) The id or friendly name of the repository. To use the friendly name, projectId must also be specified. - RepositoryId *string - // (optional) Project ID or project name - Project *string - // (optional) The number of changes to include in the result. - ChangeCount *int -} - // Retrieve git commits for a project -func (client *Client) GetCommits(ctx context.Context, args GetCommitsArgs) (*[]GitCommitRef, error) { +func (client *ClientImpl) GetCommits(ctx context.Context, args GetCommitsArgs) (*[]GitCommitRef, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -799,60 +2435,8 @@ type GetCommitsArgs struct { Top *int } -// Retrieve a list of commits associated with a particular push. -func (client *Client) GetPushCommits(ctx context.Context, args GetPushCommitsArgs) (*[]GitCommitRef, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - - queryParams := url.Values{} - if args.PushId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "pushId"} - } - queryParams.Add("pushId", strconv.Itoa(*args.PushId)) - if args.Top != nil { - queryParams.Add("top", strconv.Itoa(*args.Top)) - } - if args.Skip != nil { - queryParams.Add("skip", strconv.Itoa(*args.Skip)) - } - if args.IncludeLinks != nil { - queryParams.Add("includeLinks", strconv.FormatBool(*args.IncludeLinks)) - } - locationId, _ := uuid.Parse("c2570c3b-5b3f-41b8-98bf-5407bfde8d58") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []GitCommitRef - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPushCommits function -type GetPushCommitsArgs struct { - // (required) The id or friendly name of the repository. To use the friendly name, projectId must also be specified. - RepositoryId *string - // (required) The id of the push. - PushId *int - // (optional) Project ID or project name - Project *string - // (optional) The maximum number of commits to return ("get the top x commits"). - Top *int - // (optional) The number of commits to skip. - Skip *int - // (optional) Set to false to avoid including REST Url links for resources. Defaults to true. - IncludeLinks *bool -} - // Retrieve git commits for a project matching the search criteria -func (client *Client) GetCommitsBatch(ctx context.Context, args GetCommitsBatchArgs) (*[]GitCommitRef, error) { +func (client *ClientImpl) GetCommitsBatch(ctx context.Context, args GetCommitsBatchArgs) (*[]GitCommitRef, error) { if args.SearchCriteria == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.SearchCriteria"} } @@ -907,7 +2491,7 @@ type GetCommitsBatchArgs struct { } // [Preview API] Retrieve deleted git repositories. -func (client *Client) GetDeletedRepositories(ctx context.Context, args GetDeletedRepositoriesArgs) (*[]GitDeletedRepository, error) { +func (client *ClientImpl) GetDeletedRepositories(ctx context.Context, args GetDeletedRepositoriesArgs) (*[]GitDeletedRepository, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -932,7 +2516,7 @@ type GetDeletedRepositoriesArgs struct { } // [Preview API] Retrieve all forks of a repository in the collection. -func (client *Client) GetForks(ctx context.Context, args GetForksArgs) (*[]GitRepositoryRef, error) { +func (client *ClientImpl) GetForks(ctx context.Context, args GetForksArgs) (*[]GitRepositoryRef, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -973,53 +2557,8 @@ type GetForksArgs struct { IncludeLinks *bool } -// [Preview API] Request that another repository's refs be fetched into this one. It syncs two existing forks. To create a fork, please see the repositories endpoint -func (client *Client) CreateForkSyncRequest(ctx context.Context, args CreateForkSyncRequestArgs) (*GitForkSyncRequest, error) { - if args.SyncParams == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.SyncParams"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryNameOrId == nil || *args.RepositoryNameOrId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryNameOrId"} - } - routeValues["repositoryNameOrId"] = *args.RepositoryNameOrId - - queryParams := url.Values{} - if args.IncludeLinks != nil { - queryParams.Add("includeLinks", strconv.FormatBool(*args.IncludeLinks)) - } - body, marshalErr := json.Marshal(*args.SyncParams) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("1703f858-b9d1-46af-ab62-483e9e1055b5") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitForkSyncRequest - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateForkSyncRequest function -type CreateForkSyncRequestArgs struct { - // (required) Source repository and ref mapping. - SyncParams *GitForkSyncRequestParameters - // (required) The name or ID of the repository. - RepositoryNameOrId *string - // (optional) Project ID or project name - Project *string - // (optional) True to include links - IncludeLinks *bool -} - // [Preview API] Get a specific fork sync operation's details. -func (client *Client) GetForkSyncRequest(ctx context.Context, args GetForkSyncRequestArgs) (*GitForkSyncRequest, error) { +func (client *ClientImpl) GetForkSyncRequest(ctx context.Context, args GetForkSyncRequestArgs) (*GitForkSyncRequest, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -1061,7 +2600,7 @@ type GetForkSyncRequestArgs struct { } // [Preview API] Retrieve all requested fork sync operations on this repository. -func (client *Client) GetForkSyncRequests(ctx context.Context, args GetForkSyncRequestsArgs) (*[]GitForkSyncRequest, error) { +func (client *ClientImpl) GetForkSyncRequests(ctx context.Context, args GetForkSyncRequestsArgs) (*[]GitForkSyncRequest, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -1101,48 +2640,8 @@ type GetForkSyncRequestsArgs struct { IncludeLinks *bool } -// [Preview API] Create an import request. -func (client *Client) CreateImportRequest(ctx context.Context, args CreateImportRequestArgs) (*GitImportRequest, error) { - if args.ImportRequest == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ImportRequest"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - - body, marshalErr := json.Marshal(*args.ImportRequest) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("01828ddc-3600-4a41-8633-99b3a73a0eb3") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitImportRequest - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateImportRequest function -type CreateImportRequestArgs struct { - // (required) The import request to create. - ImportRequest *GitImportRequest - // (required) Project ID or project name - Project *string - // (required) The name or ID of the repository. - RepositoryId *string -} - // [Preview API] Retrieve a particular import request. -func (client *Client) GetImportRequest(ctx context.Context, args GetImportRequestArgs) (*GitImportRequest, error) { +func (client *ClientImpl) GetImportRequest(ctx context.Context, args GetImportRequestArgs) (*GitImportRequest, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1178,91 +2677,8 @@ type GetImportRequestArgs struct { ImportRequestId *int } -// [Preview API] Retrieve import requests for a repository. -func (client *Client) QueryImportRequests(ctx context.Context, args QueryImportRequestsArgs) (*[]GitImportRequest, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - - queryParams := url.Values{} - if args.IncludeAbandoned != nil { - queryParams.Add("includeAbandoned", strconv.FormatBool(*args.IncludeAbandoned)) - } - locationId, _ := uuid.Parse("01828ddc-3600-4a41-8633-99b3a73a0eb3") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []GitImportRequest - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the QueryImportRequests function -type QueryImportRequestsArgs struct { - // (required) Project ID or project name - Project *string - // (required) The name or ID of the repository. - RepositoryId *string - // (optional) True to include abandoned import requests in the results. - IncludeAbandoned *bool -} - -// [Preview API] Retry or abandon a failed import request. -func (client *Client) UpdateImportRequest(ctx context.Context, args UpdateImportRequestArgs) (*GitImportRequest, error) { - if args.ImportRequestToUpdate == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ImportRequestToUpdate"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.ImportRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ImportRequestId"} - } - routeValues["importRequestId"] = strconv.Itoa(*args.ImportRequestId) - - body, marshalErr := json.Marshal(*args.ImportRequestToUpdate) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("01828ddc-3600-4a41-8633-99b3a73a0eb3") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitImportRequest - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdateImportRequest function -type UpdateImportRequestArgs struct { - // (required) The updated version of the import request. Currently, the only change allowed is setting the Status to Queued or Abandoned. - ImportRequestToUpdate *GitImportRequest - // (required) Project ID or project name - Project *string - // (required) The name or ID of the repository. - RepositoryId *string - // (required) The unique identifier for the import request to update. - ImportRequestId *int -} - // Get Item Metadata and/or Content for a single item. The download parameter is to indicate whether the content should be available as a download or just sent as a stream in the response. Doesn't apply to zipped content, which is always returned as a download. -func (client *Client) GetItem(ctx context.Context, args GetItemArgs) (*GitItem, error) { +func (client *ClientImpl) GetItem(ctx context.Context, args GetItemArgs) (*GitItem, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -1347,7 +2763,7 @@ type GetItemArgs struct { } // Get Item Metadata and/or Content for a single item. The download parameter is to indicate whether the content should be available as a download or just sent as a stream in the response. Doesn't apply to zipped content, which is always returned as a download. -func (client *Client) GetItemContent(ctx context.Context, args GetItemContentArgs) (io.ReadCloser, error) { +func (client *ClientImpl) GetItemContent(ctx context.Context, args GetItemContentArgs) (io.ReadCloser, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -1430,7 +2846,7 @@ type GetItemContentArgs struct { } // Get Item Metadata and/or Content for a collection of items. The download parameter is to indicate whether the content should be available as a download or just sent as a stream in the response. Doesn't apply to zipped content which is always returned as a download. -func (client *Client) GetItems(ctx context.Context, args GetItemsArgs) (*[]GitItem, error) { +func (client *ClientImpl) GetItems(ctx context.Context, args GetItemsArgs) (*[]GitItem, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -1503,8 +2919,47 @@ type GetItemsArgs struct { VersionDescriptor *GitVersionDescriptor } +// Post for retrieving a creating a batch out of a set of items in a repo / project given a list of paths or a long path +func (client *ClientImpl) GetItemsBatch(ctx context.Context, args GetItemsBatchArgs) (*[][]GitItem, error) { + if args.RequestData == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RequestData"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + + body, marshalErr := json.Marshal(*args.RequestData) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("630fd2e4-fb88-4f85-ad21-13f3fd1fbca9") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue [][]GitItem + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetItemsBatch function +type GetItemsBatchArgs struct { + // (required) Request data attributes: ItemDescriptors, IncludeContentMetadata, LatestProcessedChange, IncludeLinks. ItemDescriptors: Collection of items to fetch, including path, version, and recursion level. IncludeContentMetadata: Whether to include metadata for all items LatestProcessedChange: Whether to include shallow ref to commit that last changed each item. IncludeLinks: Whether to include the _links field on the shallow references. + RequestData *GitItemRequestData + // (required) The name or ID of the repository + RepositoryId *string + // (optional) Project ID or project name + Project *string +} + // Get Item Metadata and/or Content for a single item. The download parameter is to indicate whether the content should be available as a download or just sent as a stream in the response. Doesn't apply to zipped content, which is always returned as a download. -func (client *Client) GetItemText(ctx context.Context, args GetItemTextArgs) (io.ReadCloser, error) { +func (client *ClientImpl) GetItemText(ctx context.Context, args GetItemTextArgs) (io.ReadCloser, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -1587,7 +3042,7 @@ type GetItemTextArgs struct { } // Get Item Metadata and/or Content for a single item. The download parameter is to indicate whether the content should be available as a download or just sent as a stream in the response. Doesn't apply to zipped content, which is always returned as a download. -func (client *Client) GetItemZip(ctx context.Context, args GetItemZipArgs) (io.ReadCloser, error) { +func (client *ClientImpl) GetItemZip(ctx context.Context, args GetItemZipArgs) (io.ReadCloser, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -1669,11 +3124,8 @@ type GetItemZipArgs struct { ResolveLfs *bool } -// Post for retrieving a creating a batch out of a set of items in a repo / project given a list of paths or a long path -func (client *Client) GetItemsBatch(ctx context.Context, args GetItemsBatchArgs) (*[][]GitItem, error) { - if args.RequestData == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RequestData"} - } +// [Preview API] Get likes for a comment. +func (client *ClientImpl) GetLikes(ctx context.Context, args GetLikesArgs) (*[]webapi.IdentityRef, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -1682,34 +3134,46 @@ func (client *Client) GetItemsBatch(ctx context.Context, args GetItemsBatchArgs) return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} } routeValues["repositoryId"] = *args.RepositoryId - - body, marshalErr := json.Marshal(*args.RequestData) - if marshalErr != nil { - return nil, marshalErr + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} } - locationId, _ := uuid.Parse("630fd2e4-fb88-4f85-ad21-13f3fd1fbca9") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.ThreadId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} + } + routeValues["threadId"] = strconv.Itoa(*args.ThreadId) + if args.CommentId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.CommentId"} + } + routeValues["commentId"] = strconv.Itoa(*args.CommentId) + + locationId, _ := uuid.Parse("5f2e2851-1389-425b-a00b-fb2adb3ef31b") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue [][]GitItem + var responseValue []webapi.IdentityRef err = client.Client.UnmarshalCollectionBody(resp, &responseValue) return &responseValue, err } -// Arguments for the GetItemsBatch function -type GetItemsBatchArgs struct { - // (required) Request data attributes: ItemDescriptors, IncludeContentMetadata, LatestProcessedChange, IncludeLinks. ItemDescriptors: Collection of items to fetch, including path, version, and recursion level. IncludeContentMetadata: Whether to include metadata for all items LatestProcessedChange: Whether to include shallow ref to commit that last changed each item. IncludeLinks: Whether to include the _links field on the shallow references. - RequestData *GitItemRequestData - // (required) The name or ID of the repository +// Arguments for the GetLikes function +type GetLikesArgs struct { + // (required) The repository ID of the pull request's target branch. RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) The ID of the thread that contains the comment. + ThreadId *int + // (required) The ID of the comment. + CommentId *int // (optional) Project ID or project name Project *string } // [Preview API] Find the merge bases of two commits, optionally across forks. If otherRepositoryId is not specified, the merge bases will only be calculated within the context of the local repositoryNameOrId. -func (client *Client) GetMergeBases(ctx context.Context, args GetMergeBasesArgs) (*[]GitCommitRef, error) { +func (client *ClientImpl) GetMergeBases(ctx context.Context, args GetMergeBasesArgs) (*[]GitCommitRef, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -1761,54 +3225,8 @@ type GetMergeBasesArgs struct { OtherRepositoryId *uuid.UUID } -// [Preview API] Request a git merge operation. Currently we support merging only 2 commits. -func (client *Client) CreateMergeRequest(ctx context.Context, args CreateMergeRequestArgs) (*GitMerge, error) { - if args.MergeParameters == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.MergeParameters"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RepositoryNameOrId == nil || *args.RepositoryNameOrId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryNameOrId"} - } - routeValues["repositoryNameOrId"] = *args.RepositoryNameOrId - - queryParams := url.Values{} - if args.IncludeLinks != nil { - queryParams.Add("includeLinks", strconv.FormatBool(*args.IncludeLinks)) - } - body, marshalErr := json.Marshal(*args.MergeParameters) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("985f7ae9-844f-4906-9897-7ef41516c0e2") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitMerge - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateMergeRequest function -type CreateMergeRequestArgs struct { - // (required) Parents commitIds and merge commit messsage. - MergeParameters *GitMergeParameters - // (required) Project ID or project name - Project *string - // (required) The name or ID of the repository. - RepositoryNameOrId *string - // (optional) True to include links - IncludeLinks *bool -} - // [Preview API] Get a specific merge operation's details. -func (client *Client) GetMergeRequest(ctx context.Context, args GetMergeRequestArgs) (*GitMerge, error) { +func (client *ClientImpl) GetMergeRequest(ctx context.Context, args GetMergeRequestArgs) (*GitMerge, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1851,7 +3269,7 @@ type GetMergeRequestArgs struct { } // [Preview API] Retrieve a list of policy configurations by a given set of scope/filtering criteria. -func (client *Client) GetPolicyConfigurations(ctx context.Context, args GetPolicyConfigurationsArgs) (*GitPolicyConfigurationResponse, error) { +func (client *ClientImpl) GetPolicyConfigurations(ctx context.Context, args GetPolicyConfigurationsArgs) (*GitPolicyConfigurationResponse, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1911,1535 +3329,8 @@ type GetPolicyConfigurationsArgs struct { ContinuationToken *string } -// [Preview API] Attach a new file to a pull request. -func (client *Client) CreateAttachment(ctx context.Context, args CreateAttachmentArgs) (*Attachment, error) { - if args.UploadStream == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.UploadStream"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.FileName == nil || *args.FileName == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.FileName"} - } - routeValues["fileName"] = *args.FileName - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - locationId, _ := uuid.Parse("965d9361-878b-413b-a494-45d5b5fd8ab7") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, args.UploadStream, "application/octet-stream", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue Attachment - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateAttachment function -type CreateAttachmentArgs struct { - // (required) Stream to upload - UploadStream io.Reader - // (required) The name of the file. - FileName *string - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Delete a pull request attachment. -func (client *Client) DeleteAttachment(ctx context.Context, args DeleteAttachmentArgs) error { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.FileName == nil || *args.FileName == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.FileName"} - } - routeValues["fileName"] = *args.FileName - if args.RepositoryId == nil || *args.RepositoryId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - locationId, _ := uuid.Parse("965d9361-878b-413b-a494-45d5b5fd8ab7") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeleteAttachment function -type DeleteAttachmentArgs struct { - // (required) The name of the attachment to delete. - FileName *string - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Get the file content of a pull request attachment. -func (client *Client) GetAttachmentContent(ctx context.Context, args GetAttachmentContentArgs) (io.ReadCloser, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.FileName == nil || *args.FileName == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.FileName"} - } - routeValues["fileName"] = *args.FileName - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - locationId, _ := uuid.Parse("965d9361-878b-413b-a494-45d5b5fd8ab7") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/octet-stream", nil) - if err != nil { - return nil, err - } - - return resp.Body, err -} - -// Arguments for the GetAttachmentContent function -type GetAttachmentContentArgs struct { - // (required) The name of the attachment. - FileName *string - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Get a list of files attached to a given pull request. -func (client *Client) GetAttachments(ctx context.Context, args GetAttachmentsArgs) (*[]Attachment, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - locationId, _ := uuid.Parse("965d9361-878b-413b-a494-45d5b5fd8ab7") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []Attachment - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetAttachments function -type GetAttachmentsArgs struct { - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Get the file content of a pull request attachment. -func (client *Client) GetAttachmentZip(ctx context.Context, args GetAttachmentZipArgs) (io.ReadCloser, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.FileName == nil || *args.FileName == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.FileName"} - } - routeValues["fileName"] = *args.FileName - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - locationId, _ := uuid.Parse("965d9361-878b-413b-a494-45d5b5fd8ab7") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/zip", nil) - if err != nil { - return nil, err - } - - return resp.Body, err -} - -// Arguments for the GetAttachmentZip function -type GetAttachmentZipArgs struct { - // (required) The name of the attachment. - FileName *string - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Add a like on a comment. -func (client *Client) CreateLike(ctx context.Context, args CreateLikeArgs) error { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.ThreadId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} - } - routeValues["threadId"] = strconv.Itoa(*args.ThreadId) - if args.CommentId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.CommentId"} - } - routeValues["commentId"] = strconv.Itoa(*args.CommentId) - - locationId, _ := uuid.Parse("5f2e2851-1389-425b-a00b-fb2adb3ef31b") - _, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the CreateLike function -type CreateLikeArgs struct { - // (required) The repository ID of the pull request's target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) The ID of the thread that contains the comment. - ThreadId *int - // (required) The ID of the comment. - CommentId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Delete a like on a comment. -func (client *Client) DeleteLike(ctx context.Context, args DeleteLikeArgs) error { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.ThreadId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} - } - routeValues["threadId"] = strconv.Itoa(*args.ThreadId) - if args.CommentId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.CommentId"} - } - routeValues["commentId"] = strconv.Itoa(*args.CommentId) - - locationId, _ := uuid.Parse("5f2e2851-1389-425b-a00b-fb2adb3ef31b") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeleteLike function -type DeleteLikeArgs struct { - // (required) The repository ID of the pull request's target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) The ID of the thread that contains the comment. - ThreadId *int - // (required) The ID of the comment. - CommentId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Get likes for a comment. -func (client *Client) GetLikes(ctx context.Context, args GetLikesArgs) (*[]webapi.IdentityRef, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.ThreadId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} - } - routeValues["threadId"] = strconv.Itoa(*args.ThreadId) - if args.CommentId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.CommentId"} - } - routeValues["commentId"] = strconv.Itoa(*args.CommentId) - - locationId, _ := uuid.Parse("5f2e2851-1389-425b-a00b-fb2adb3ef31b") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []webapi.IdentityRef - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetLikes function -type GetLikesArgs struct { - // (required) The repository ID of the pull request's target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) The ID of the thread that contains the comment. - ThreadId *int - // (required) The ID of the comment. - CommentId *int - // (optional) Project ID or project name - Project *string -} - -// Get the commits for the specified iteration of a pull request. -func (client *Client) GetPullRequestIterationCommits(ctx context.Context, args GetPullRequestIterationCommitsArgs) (*[]GitCommitRef, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.IterationId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} - } - routeValues["iterationId"] = strconv.Itoa(*args.IterationId) - - queryParams := url.Values{} - if args.Top != nil { - queryParams.Add("top", strconv.Itoa(*args.Top)) - } - if args.Skip != nil { - queryParams.Add("skip", strconv.Itoa(*args.Skip)) - } - locationId, _ := uuid.Parse("e7ea0883-095f-4926-b5fb-f24691c26fb9") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []GitCommitRef - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPullRequestIterationCommits function -type GetPullRequestIterationCommitsArgs struct { - // (required) ID or name of the repository. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the iteration from which to get the commits. - IterationId *int - // (optional) Project ID or project name - Project *string - // (optional) Maximum number of commits to return. The maximum number of commits that can be returned per batch is 500. - Top *int - // (optional) Number of commits to skip. - Skip *int -} - -// Get the commits for the specified pull request. -func (client *Client) GetPullRequestCommits(ctx context.Context, args GetPullRequestCommitsArgs) (*GetPullRequestCommitsResponseValue, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - locationId, _ := uuid.Parse("52823034-34a8-4576-922c-8d8b77e9e4c4") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GetPullRequestCommitsResponseValue - responseValue.ContinuationToken = resp.Header.Get(azuredevops.HeaderKeyContinuationToken) - err = client.Client.UnmarshalCollectionBody(resp, &responseValue.Value) - return &responseValue, err -} - -// Arguments for the GetPullRequestCommits function -type GetPullRequestCommitsArgs struct { - // (required) ID or name of the repository. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - -// Return type for the GetPullRequestCommits function -type GetPullRequestCommitsResponseValue struct { - Value []GitCommitRef - // The continuation token to be used to get the next page of results. - ContinuationToken string -} - -// Retrieve the changes made in a pull request between two iterations. -func (client *Client) GetPullRequestIterationChanges(ctx context.Context, args GetPullRequestIterationChangesArgs) (*GitPullRequestIterationChanges, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.IterationId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} - } - routeValues["iterationId"] = strconv.Itoa(*args.IterationId) - - queryParams := url.Values{} - if args.Top != nil { - queryParams.Add("$top", strconv.Itoa(*args.Top)) - } - if args.Skip != nil { - queryParams.Add("$skip", strconv.Itoa(*args.Skip)) - } - if args.CompareTo != nil { - queryParams.Add("$compareTo", strconv.Itoa(*args.CompareTo)) - } - locationId, _ := uuid.Parse("4216bdcf-b6b1-4d59-8b82-c34cc183fc8b") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitPullRequestIterationChanges - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPullRequestIterationChanges function -type GetPullRequestIterationChangesArgs struct { - // (required) The repository ID of the pull request's target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the pull request iteration.
Iteration IDs are zero-based with zero indicating the common commit between the source and target branches. Iteration one is the head of the source branch at the time the pull request is created and subsequent iterations are created when there are pushes to the source branch. - IterationId *int - // (optional) Project ID or project name - Project *string - // (optional) Optional. The number of changes to retrieve. The default value is 100 and the maximum value is 2000. - Top *int - // (optional) Optional. The number of changes to ignore. For example, to retrieve changes 101-150, set top 50 and skip to 100. - Skip *int - // (optional) ID of the pull request iteration to compare against. The default value is zero which indicates the comparison is made against the common commit between the source and target branches - CompareTo *int -} - -// Get the specified iteration for a pull request. -func (client *Client) GetPullRequestIteration(ctx context.Context, args GetPullRequestIterationArgs) (*GitPullRequestIteration, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.IterationId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} - } - routeValues["iterationId"] = strconv.Itoa(*args.IterationId) - - locationId, _ := uuid.Parse("d43911ee-6958-46b0-a42b-8445b8a0d004") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitPullRequestIteration - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPullRequestIteration function -type GetPullRequestIterationArgs struct { - // (required) ID or name of the repository. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the pull request iteration to return. - IterationId *int - // (optional) Project ID or project name - Project *string -} - -// Get the list of iterations for the specified pull request. -func (client *Client) GetPullRequestIterations(ctx context.Context, args GetPullRequestIterationsArgs) (*[]GitPullRequestIteration, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - queryParams := url.Values{} - if args.IncludeCommits != nil { - queryParams.Add("includeCommits", strconv.FormatBool(*args.IncludeCommits)) - } - locationId, _ := uuid.Parse("d43911ee-6958-46b0-a42b-8445b8a0d004") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []GitPullRequestIteration - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPullRequestIterations function -type GetPullRequestIterationsArgs struct { - // (required) ID or name of the repository. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string - // (optional) If true, include the commits associated with each iteration in the response. - IncludeCommits *bool -} - -// [Preview API] Create a pull request status on the iteration. This operation will have the same result as Create status on pull request with specified iteration ID in the request body. -func (client *Client) CreatePullRequestIterationStatus(ctx context.Context, args CreatePullRequestIterationStatusArgs) (*GitPullRequestStatus, error) { - if args.Status == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Status"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.IterationId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} - } - routeValues["iterationId"] = strconv.Itoa(*args.IterationId) - - body, marshalErr := json.Marshal(*args.Status) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("75cf11c5-979f-4038-a76e-058a06adf2bf") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitPullRequestStatus - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreatePullRequestIterationStatus function -type CreatePullRequestIterationStatusArgs struct { - // (required) Pull request status to create. - Status *GitPullRequestStatus - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the pull request iteration. - IterationId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Delete pull request iteration status. -func (client *Client) DeletePullRequestIterationStatus(ctx context.Context, args DeletePullRequestIterationStatusArgs) error { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.IterationId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} - } - routeValues["iterationId"] = strconv.Itoa(*args.IterationId) - if args.StatusId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.StatusId"} - } - routeValues["statusId"] = strconv.Itoa(*args.StatusId) - - locationId, _ := uuid.Parse("75cf11c5-979f-4038-a76e-058a06adf2bf") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeletePullRequestIterationStatus function -type DeletePullRequestIterationStatusArgs struct { - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the pull request iteration. - IterationId *int - // (required) ID of the pull request status. - StatusId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Get the specific pull request iteration status by ID. The status ID is unique within the pull request across all iterations. -func (client *Client) GetPullRequestIterationStatus(ctx context.Context, args GetPullRequestIterationStatusArgs) (*GitPullRequestStatus, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.IterationId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} - } - routeValues["iterationId"] = strconv.Itoa(*args.IterationId) - if args.StatusId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.StatusId"} - } - routeValues["statusId"] = strconv.Itoa(*args.StatusId) - - locationId, _ := uuid.Parse("75cf11c5-979f-4038-a76e-058a06adf2bf") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitPullRequestStatus - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPullRequestIterationStatus function -type GetPullRequestIterationStatusArgs struct { - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the pull request iteration. - IterationId *int - // (required) ID of the pull request status. - StatusId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Get all the statuses associated with a pull request iteration. -func (client *Client) GetPullRequestIterationStatuses(ctx context.Context, args GetPullRequestIterationStatusesArgs) (*[]GitPullRequestStatus, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.IterationId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} - } - routeValues["iterationId"] = strconv.Itoa(*args.IterationId) - - locationId, _ := uuid.Parse("75cf11c5-979f-4038-a76e-058a06adf2bf") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []GitPullRequestStatus - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPullRequestIterationStatuses function -type GetPullRequestIterationStatusesArgs struct { - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the pull request iteration. - IterationId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Update pull request iteration statuses collection. The only supported operation type is `remove`. -func (client *Client) UpdatePullRequestIterationStatuses(ctx context.Context, args UpdatePullRequestIterationStatusesArgs) error { - if args.PatchDocument == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PatchDocument"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.IterationId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} - } - routeValues["iterationId"] = strconv.Itoa(*args.IterationId) - - body, marshalErr := json.Marshal(*args.PatchDocument) - if marshalErr != nil { - return marshalErr - } - locationId, _ := uuid.Parse("75cf11c5-979f-4038-a76e-058a06adf2bf") - _, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json-patch+json", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the UpdatePullRequestIterationStatuses function -type UpdatePullRequestIterationStatusesArgs struct { - // (required) Operations to apply to the pull request statuses in JSON Patch format. - PatchDocument *[]webapi.JsonPatchOperation - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the pull request iteration. - IterationId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Create a label for a specified pull request. The only required field is the name of the new label. -func (client *Client) CreatePullRequestLabel(ctx context.Context, args CreatePullRequestLabelArgs) (*core.WebApiTagDefinition, error) { - if args.Label == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Label"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - queryParams := url.Values{} - if args.ProjectId != nil { - queryParams.Add("projectId", *args.ProjectId) - } - body, marshalErr := json.Marshal(*args.Label) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("f22387e3-984e-4c52-9c6d-fbb8f14c812d") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue core.WebApiTagDefinition - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreatePullRequestLabel function -type CreatePullRequestLabelArgs struct { - // (required) Label to assign to the pull request. - Label *core.WebApiCreateTagRequestData - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string - // (optional) Project ID or project name. - ProjectId *string -} - -// [Preview API] Removes a label from the set of those assigned to the pull request. -func (client *Client) DeletePullRequestLabels(ctx context.Context, args DeletePullRequestLabelsArgs) error { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.LabelIdOrName == nil || *args.LabelIdOrName == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.LabelIdOrName"} - } - routeValues["labelIdOrName"] = *args.LabelIdOrName - - queryParams := url.Values{} - if args.ProjectId != nil { - queryParams.Add("projectId", *args.ProjectId) - } - locationId, _ := uuid.Parse("f22387e3-984e-4c52-9c6d-fbb8f14c812d") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeletePullRequestLabels function -type DeletePullRequestLabelsArgs struct { - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) The name or ID of the label requested. - LabelIdOrName *string - // (optional) Project ID or project name - Project *string - // (optional) Project ID or project name. - ProjectId *string -} - -// [Preview API] Retrieves a single label that has been assigned to a pull request. -func (client *Client) GetPullRequestLabel(ctx context.Context, args GetPullRequestLabelArgs) (*core.WebApiTagDefinition, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.LabelIdOrName == nil || *args.LabelIdOrName == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.LabelIdOrName"} - } - routeValues["labelIdOrName"] = *args.LabelIdOrName - - queryParams := url.Values{} - if args.ProjectId != nil { - queryParams.Add("projectId", *args.ProjectId) - } - locationId, _ := uuid.Parse("f22387e3-984e-4c52-9c6d-fbb8f14c812d") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue core.WebApiTagDefinition - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPullRequestLabel function -type GetPullRequestLabelArgs struct { - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) The name or ID of the label requested. - LabelIdOrName *string - // (optional) Project ID or project name - Project *string - // (optional) Project ID or project name. - ProjectId *string -} - -// [Preview API] Get all the labels assigned to a pull request. -func (client *Client) GetPullRequestLabels(ctx context.Context, args GetPullRequestLabelsArgs) (*[]core.WebApiTagDefinition, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - queryParams := url.Values{} - if args.ProjectId != nil { - queryParams.Add("projectId", *args.ProjectId) - } - locationId, _ := uuid.Parse("f22387e3-984e-4c52-9c6d-fbb8f14c812d") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []core.WebApiTagDefinition - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPullRequestLabels function -type GetPullRequestLabelsArgs struct { - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string - // (optional) Project ID or project name. - ProjectId *string -} - -// [Preview API] Get external properties of the pull request. -func (client *Client) GetPullRequestProperties(ctx context.Context, args GetPullRequestPropertiesArgs) (interface{}, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - locationId, _ := uuid.Parse("48a52185-5b9e-4736-9dc1-bb1e2feac80b") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue interface{} - err = client.Client.UnmarshalBody(resp, responseValue) - return responseValue, err -} - -// Arguments for the GetPullRequestProperties function -type GetPullRequestPropertiesArgs struct { - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Create or update pull request external properties. The patch operation can be `add`, `replace` or `remove`. For `add` operation, the path can be empty. If the path is empty, the value must be a list of key value pairs. For `replace` operation, the path cannot be empty. If the path does not exist, the property will be added to the collection. For `remove` operation, the path cannot be empty. If the path does not exist, no action will be performed. -func (client *Client) UpdatePullRequestProperties(ctx context.Context, args UpdatePullRequestPropertiesArgs) (interface{}, error) { - if args.PatchDocument == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PatchDocument"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - body, marshalErr := json.Marshal(*args.PatchDocument) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("48a52185-5b9e-4736-9dc1-bb1e2feac80b") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json-patch+json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue interface{} - err = client.Client.UnmarshalBody(resp, responseValue) - return responseValue, err -} - -// Arguments for the UpdatePullRequestProperties function -type UpdatePullRequestPropertiesArgs struct { - // (required) Properties to add, replace or remove in JSON Patch format. - PatchDocument *[]webapi.JsonPatchOperation - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - -// This API is used to find what pull requests are related to a given commit. It can be used to either find the pull request that created a particular merge commit or it can be used to find all pull requests that have ever merged a particular commit. The input is a list of queries which each contain a list of commits. For each commit that you search against, you will get back a dictionary of commit -> pull requests. -func (client *Client) GetPullRequestQuery(ctx context.Context, args GetPullRequestQueryArgs) (*GitPullRequestQuery, error) { - if args.Queries == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Queries"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - - body, marshalErr := json.Marshal(*args.Queries) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("b3a6eebe-9cf0-49ea-b6cb-1a4c5f5007b0") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitPullRequestQuery - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPullRequestQuery function -type GetPullRequestQueryArgs struct { - // (required) The list of queries to perform. - Queries *GitPullRequestQuery - // (required) ID of the repository. - RepositoryId *string - // (optional) Project ID or project name - Project *string -} - -// Add a reviewer to a pull request or cast a vote. -func (client *Client) CreatePullRequestReviewer(ctx context.Context, args CreatePullRequestReviewerArgs) (*IdentityRefWithVote, error) { - if args.Reviewer == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Reviewer"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.ReviewerId == nil || *args.ReviewerId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ReviewerId"} - } - routeValues["reviewerId"] = *args.ReviewerId - - body, marshalErr := json.Marshal(*args.Reviewer) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("4b6702c7-aa35-4b89-9c96-b9abf6d3e540") - resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue IdentityRefWithVote - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreatePullRequestReviewer function -type CreatePullRequestReviewerArgs struct { - // (required) Reviewer's vote.
If the reviewer's ID is included here, it must match the reviewerID parameter.
Reviewers can set their own vote with this method. When adding other reviewers, vote must be set to zero. - Reviewer *IdentityRefWithVote - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the reviewer. - ReviewerId *string - // (optional) Project ID or project name - Project *string -} - -// Add reviewers to a pull request. -func (client *Client) CreatePullRequestReviewers(ctx context.Context, args CreatePullRequestReviewersArgs) (*[]IdentityRefWithVote, error) { - if args.Reviewers == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Reviewers"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - body, marshalErr := json.Marshal(*args.Reviewers) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("4b6702c7-aa35-4b89-9c96-b9abf6d3e540") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []IdentityRefWithVote - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreatePullRequestReviewers function -type CreatePullRequestReviewersArgs struct { - // (required) Reviewers to add to the pull request. - Reviewers *[]webapi.IdentityRef - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - -// Remove a reviewer from a pull request. -func (client *Client) DeletePullRequestReviewer(ctx context.Context, args DeletePullRequestReviewerArgs) error { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.ReviewerId == nil || *args.ReviewerId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ReviewerId"} - } - routeValues["reviewerId"] = *args.ReviewerId - - locationId, _ := uuid.Parse("4b6702c7-aa35-4b89-9c96-b9abf6d3e540") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeletePullRequestReviewer function -type DeletePullRequestReviewerArgs struct { - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the reviewer to remove. - ReviewerId *string - // (optional) Project ID or project name - Project *string -} - -// Retrieve information about a particular reviewer on a pull request -func (client *Client) GetPullRequestReviewer(ctx context.Context, args GetPullRequestReviewerArgs) (*IdentityRefWithVote, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.ReviewerId == nil || *args.ReviewerId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ReviewerId"} - } - routeValues["reviewerId"] = *args.ReviewerId - - locationId, _ := uuid.Parse("4b6702c7-aa35-4b89-9c96-b9abf6d3e540") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue IdentityRefWithVote - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPullRequestReviewer function -type GetPullRequestReviewerArgs struct { - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the reviewer. - ReviewerId *string - // (optional) Project ID or project name - Project *string -} - -// Retrieve the reviewers for a pull request -func (client *Client) GetPullRequestReviewers(ctx context.Context, args GetPullRequestReviewersArgs) (*[]IdentityRefWithVote, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - locationId, _ := uuid.Parse("4b6702c7-aa35-4b89-9c96-b9abf6d3e540") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []IdentityRefWithVote - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPullRequestReviewers function -type GetPullRequestReviewersArgs struct { - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - -// Reset the votes of multiple reviewers on a pull request. NOTE: This endpoint only supports updating votes, but does not support updating required reviewers (use policy) or display names. -func (client *Client) UpdatePullRequestReviewers(ctx context.Context, args UpdatePullRequestReviewersArgs) error { - if args.PatchVotes == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PatchVotes"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - body, marshalErr := json.Marshal(*args.PatchVotes) - if marshalErr != nil { - return marshalErr - } - locationId, _ := uuid.Parse("4b6702c7-aa35-4b89-9c96-b9abf6d3e540") - _, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the UpdatePullRequestReviewers function -type UpdatePullRequestReviewersArgs struct { - // (required) IDs of the reviewers whose votes will be reset to zero - PatchVotes *[]IdentityRefWithVote - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - // Retrieve a pull request. -func (client *Client) GetPullRequestById(ctx context.Context, args GetPullRequestByIdArgs) (*GitPullRequest, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - locationId, _ := uuid.Parse("01a46dea-7d46-4d40-bc84-319e7c260d99") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitPullRequest - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPullRequestById function -type GetPullRequestByIdArgs struct { - // (required) The ID of the pull request to retrieve. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - -// Retrieve all pull requests matching a specified criteria. -func (client *Client) GetPullRequestsByProject(ctx context.Context, args GetPullRequestsByProjectArgs) (*[]GitPullRequest, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - - queryParams := url.Values{} - if args.SearchCriteria == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "searchCriteria"} - } - if args.SearchCriteria.RepositoryId != nil { - queryParams.Add("searchCriteria.repositoryId", (*args.SearchCriteria.RepositoryId).String()) - } - if args.SearchCriteria.CreatorId != nil { - queryParams.Add("searchCriteria.creatorId", (*args.SearchCriteria.CreatorId).String()) - } - if args.SearchCriteria.ReviewerId != nil { - queryParams.Add("searchCriteria.reviewerId", (*args.SearchCriteria.ReviewerId).String()) - } - if args.SearchCriteria.Status != nil { - queryParams.Add("searchCriteria.status", string(*args.SearchCriteria.Status)) - } - if args.SearchCriteria.TargetRefName != nil { - queryParams.Add("searchCriteria.targetRefName", *args.SearchCriteria.TargetRefName) - } - if args.SearchCriteria.SourceRepositoryId != nil { - queryParams.Add("searchCriteria.sourceRepositoryId", (*args.SearchCriteria.SourceRepositoryId).String()) - } - if args.SearchCriteria.SourceRefName != nil { - queryParams.Add("searchCriteria.sourceRefName", *args.SearchCriteria.SourceRefName) - } - if args.SearchCriteria.IncludeLinks != nil { - queryParams.Add("searchCriteria.includeLinks", strconv.FormatBool(*args.SearchCriteria.IncludeLinks)) - } - if args.MaxCommentLength != nil { - queryParams.Add("maxCommentLength", strconv.Itoa(*args.MaxCommentLength)) - } - if args.Skip != nil { - queryParams.Add("$skip", strconv.Itoa(*args.Skip)) - } - if args.Top != nil { - queryParams.Add("$top", strconv.Itoa(*args.Top)) - } - locationId, _ := uuid.Parse("a5d28130-9cd2-40fa-9f08-902e7daa9efb") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []GitPullRequest - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPullRequestsByProject function -type GetPullRequestsByProjectArgs struct { - // (required) Project ID or project name - Project *string - // (required) Pull requests will be returned that match this search criteria. - SearchCriteria *GitPullRequestSearchCriteria - // (optional) Not used. - MaxCommentLength *int - // (optional) The number of pull requests to ignore. For example, to retrieve results 101-150, set top to 50 and skip to 100. - Skip *int - // (optional) The number of pull requests to retrieve. - Top *int -} - -// Create a pull request. -func (client *Client) CreatePullRequest(ctx context.Context, args CreatePullRequestArgs) (*GitPullRequest, error) { - if args.GitPullRequestToCreate == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.GitPullRequestToCreate"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - - queryParams := url.Values{} - if args.SupportsIterations != nil { - queryParams.Add("supportsIterations", strconv.FormatBool(*args.SupportsIterations)) - } - body, marshalErr := json.Marshal(*args.GitPullRequestToCreate) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("9946fd70-0d40-406e-b686-b4744cbbcc37") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitPullRequest - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreatePullRequest function -type CreatePullRequestArgs struct { - // (required) The pull request to create. - GitPullRequestToCreate *GitPullRequest - // (required) The repository ID of the pull request's target branch. - RepositoryId *string - // (optional) Project ID or project name - Project *string - // (optional) If true, subsequent pushes to the pull request will be individually reviewable. Set this to false for large pull requests for performance reasons if this functionality is not needed. - SupportsIterations *bool -} - -// Retrieve a pull request. -func (client *Client) GetPullRequest(ctx context.Context, args GetPullRequestArgs) (*GitPullRequest, error) { +func (client *ClientImpl) GetPullRequest(ctx context.Context, args GetPullRequestArgs) (*GitPullRequest, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -3500,8 +3391,621 @@ type GetPullRequestArgs struct { IncludeWorkItemRefs *bool } +// Retrieve a pull request. +func (client *ClientImpl) GetPullRequestById(ctx context.Context, args GetPullRequestByIdArgs) (*GitPullRequest, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + locationId, _ := uuid.Parse("01a46dea-7d46-4d40-bc84-319e7c260d99") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitPullRequest + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetPullRequestById function +type GetPullRequestByIdArgs struct { + // (required) The ID of the pull request to retrieve. + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + +// Get the commits for the specified pull request. +func (client *ClientImpl) GetPullRequestCommits(ctx context.Context, args GetPullRequestCommitsArgs) (*GetPullRequestCommitsResponseValue, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + queryParams := url.Values{} + if args.Top != nil { + queryParams.Add("$top", strconv.Itoa(*args.Top)) + } + if args.ContinuationToken != nil { + queryParams.Add("continuationToken", *args.ContinuationToken) + } + locationId, _ := uuid.Parse("52823034-34a8-4576-922c-8d8b77e9e4c4") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GetPullRequestCommitsResponseValue + responseValue.ContinuationToken = resp.Header.Get(azuredevops.HeaderKeyContinuationToken) + err = client.Client.UnmarshalCollectionBody(resp, &responseValue.Value) + return &responseValue, err +} + +// Arguments for the GetPullRequestCommits function +type GetPullRequestCommitsArgs struct { + // (required) ID or name of the repository. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string + // (optional) Maximum number of commits to return. + Top *int + // (optional) The continuation token used for pagination. + ContinuationToken *string +} + +// Return type for the GetPullRequestCommits function +type GetPullRequestCommitsResponseValue struct { + Value []GitCommitRef + // The continuation token to be used to get the next page of results. + ContinuationToken string +} + +// Get the specified iteration for a pull request. +func (client *ClientImpl) GetPullRequestIteration(ctx context.Context, args GetPullRequestIterationArgs) (*GitPullRequestIteration, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.IterationId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} + } + routeValues["iterationId"] = strconv.Itoa(*args.IterationId) + + locationId, _ := uuid.Parse("d43911ee-6958-46b0-a42b-8445b8a0d004") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitPullRequestIteration + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetPullRequestIteration function +type GetPullRequestIterationArgs struct { + // (required) ID or name of the repository. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the pull request iteration to return. + IterationId *int + // (optional) Project ID or project name + Project *string +} + +// Retrieve the changes made in a pull request between two iterations. +func (client *ClientImpl) GetPullRequestIterationChanges(ctx context.Context, args GetPullRequestIterationChangesArgs) (*GitPullRequestIterationChanges, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.IterationId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} + } + routeValues["iterationId"] = strconv.Itoa(*args.IterationId) + + queryParams := url.Values{} + if args.Top != nil { + queryParams.Add("$top", strconv.Itoa(*args.Top)) + } + if args.Skip != nil { + queryParams.Add("$skip", strconv.Itoa(*args.Skip)) + } + if args.CompareTo != nil { + queryParams.Add("$compareTo", strconv.Itoa(*args.CompareTo)) + } + locationId, _ := uuid.Parse("4216bdcf-b6b1-4d59-8b82-c34cc183fc8b") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitPullRequestIterationChanges + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetPullRequestIterationChanges function +type GetPullRequestIterationChangesArgs struct { + // (required) The repository ID of the pull request's target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the pull request iteration.
Iteration IDs are zero-based with zero indicating the common commit between the source and target branches. Iteration one is the head of the source branch at the time the pull request is created and subsequent iterations are created when there are pushes to the source branch. + IterationId *int + // (optional) Project ID or project name + Project *string + // (optional) Optional. The number of changes to retrieve. The default value is 100 and the maximum value is 2000. + Top *int + // (optional) Optional. The number of changes to ignore. For example, to retrieve changes 101-150, set top 50 and skip to 100. + Skip *int + // (optional) ID of the pull request iteration to compare against. The default value is zero which indicates the comparison is made against the common commit between the source and target branches + CompareTo *int +} + +// Get the commits for the specified iteration of a pull request. +func (client *ClientImpl) GetPullRequestIterationCommits(ctx context.Context, args GetPullRequestIterationCommitsArgs) (*[]GitCommitRef, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.IterationId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} + } + routeValues["iterationId"] = strconv.Itoa(*args.IterationId) + + queryParams := url.Values{} + if args.Top != nil { + queryParams.Add("top", strconv.Itoa(*args.Top)) + } + if args.Skip != nil { + queryParams.Add("skip", strconv.Itoa(*args.Skip)) + } + locationId, _ := uuid.Parse("e7ea0883-095f-4926-b5fb-f24691c26fb9") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []GitCommitRef + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetPullRequestIterationCommits function +type GetPullRequestIterationCommitsArgs struct { + // (required) ID or name of the repository. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the iteration from which to get the commits. + IterationId *int + // (optional) Project ID or project name + Project *string + // (optional) Maximum number of commits to return. The maximum number of commits that can be returned per batch is 500. + Top *int + // (optional) Number of commits to skip. + Skip *int +} + +// Get the list of iterations for the specified pull request. +func (client *ClientImpl) GetPullRequestIterations(ctx context.Context, args GetPullRequestIterationsArgs) (*[]GitPullRequestIteration, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + queryParams := url.Values{} + if args.IncludeCommits != nil { + queryParams.Add("includeCommits", strconv.FormatBool(*args.IncludeCommits)) + } + locationId, _ := uuid.Parse("d43911ee-6958-46b0-a42b-8445b8a0d004") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []GitPullRequestIteration + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetPullRequestIterations function +type GetPullRequestIterationsArgs struct { + // (required) ID or name of the repository. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string + // (optional) If true, include the commits associated with each iteration in the response. + IncludeCommits *bool +} + +// [Preview API] Get the specific pull request iteration status by ID. The status ID is unique within the pull request across all iterations. +func (client *ClientImpl) GetPullRequestIterationStatus(ctx context.Context, args GetPullRequestIterationStatusArgs) (*GitPullRequestStatus, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.IterationId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} + } + routeValues["iterationId"] = strconv.Itoa(*args.IterationId) + if args.StatusId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.StatusId"} + } + routeValues["statusId"] = strconv.Itoa(*args.StatusId) + + locationId, _ := uuid.Parse("75cf11c5-979f-4038-a76e-058a06adf2bf") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitPullRequestStatus + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetPullRequestIterationStatus function +type GetPullRequestIterationStatusArgs struct { + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the pull request iteration. + IterationId *int + // (required) ID of the pull request status. + StatusId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Get all the statuses associated with a pull request iteration. +func (client *ClientImpl) GetPullRequestIterationStatuses(ctx context.Context, args GetPullRequestIterationStatusesArgs) (*[]GitPullRequestStatus, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.IterationId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} + } + routeValues["iterationId"] = strconv.Itoa(*args.IterationId) + + locationId, _ := uuid.Parse("75cf11c5-979f-4038-a76e-058a06adf2bf") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []GitPullRequestStatus + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetPullRequestIterationStatuses function +type GetPullRequestIterationStatusesArgs struct { + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the pull request iteration. + IterationId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Retrieves a single label that has been assigned to a pull request. +func (client *ClientImpl) GetPullRequestLabel(ctx context.Context, args GetPullRequestLabelArgs) (*core.WebApiTagDefinition, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.LabelIdOrName == nil || *args.LabelIdOrName == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.LabelIdOrName"} + } + routeValues["labelIdOrName"] = *args.LabelIdOrName + + queryParams := url.Values{} + if args.ProjectId != nil { + queryParams.Add("projectId", *args.ProjectId) + } + locationId, _ := uuid.Parse("f22387e3-984e-4c52-9c6d-fbb8f14c812d") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue core.WebApiTagDefinition + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetPullRequestLabel function +type GetPullRequestLabelArgs struct { + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) The name or ID of the label requested. + LabelIdOrName *string + // (optional) Project ID or project name + Project *string + // (optional) Project ID or project name. + ProjectId *string +} + +// [Preview API] Get all the labels assigned to a pull request. +func (client *ClientImpl) GetPullRequestLabels(ctx context.Context, args GetPullRequestLabelsArgs) (*[]core.WebApiTagDefinition, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + queryParams := url.Values{} + if args.ProjectId != nil { + queryParams.Add("projectId", *args.ProjectId) + } + locationId, _ := uuid.Parse("f22387e3-984e-4c52-9c6d-fbb8f14c812d") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []core.WebApiTagDefinition + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetPullRequestLabels function +type GetPullRequestLabelsArgs struct { + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string + // (optional) Project ID or project name. + ProjectId *string +} + +// [Preview API] Get external properties of the pull request. +func (client *ClientImpl) GetPullRequestProperties(ctx context.Context, args GetPullRequestPropertiesArgs) (interface{}, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + locationId, _ := uuid.Parse("48a52185-5b9e-4736-9dc1-bb1e2feac80b") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue interface{} + err = client.Client.UnmarshalBody(resp, responseValue) + return responseValue, err +} + +// Arguments for the GetPullRequestProperties function +type GetPullRequestPropertiesArgs struct { + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + +// This API is used to find what pull requests are related to a given commit. It can be used to either find the pull request that created a particular merge commit or it can be used to find all pull requests that have ever merged a particular commit. The input is a list of queries which each contain a list of commits. For each commit that you search against, you will get back a dictionary of commit -> pull requests. +func (client *ClientImpl) GetPullRequestQuery(ctx context.Context, args GetPullRequestQueryArgs) (*GitPullRequestQuery, error) { + if args.Queries == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Queries"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + + body, marshalErr := json.Marshal(*args.Queries) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("b3a6eebe-9cf0-49ea-b6cb-1a4c5f5007b0") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitPullRequestQuery + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetPullRequestQuery function +type GetPullRequestQueryArgs struct { + // (required) The list of queries to perform. + Queries *GitPullRequestQuery + // (required) ID of the repository. + RepositoryId *string + // (optional) Project ID or project name + Project *string +} + +// Retrieve information about a particular reviewer on a pull request +func (client *ClientImpl) GetPullRequestReviewer(ctx context.Context, args GetPullRequestReviewerArgs) (*IdentityRefWithVote, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.ReviewerId == nil || *args.ReviewerId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ReviewerId"} + } + routeValues["reviewerId"] = *args.ReviewerId + + locationId, _ := uuid.Parse("4b6702c7-aa35-4b89-9c96-b9abf6d3e540") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue IdentityRefWithVote + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetPullRequestReviewer function +type GetPullRequestReviewerArgs struct { + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the reviewer. + ReviewerId *string + // (optional) Project ID or project name + Project *string +} + +// Retrieve the reviewers for a pull request +func (client *ClientImpl) GetPullRequestReviewers(ctx context.Context, args GetPullRequestReviewersArgs) (*[]IdentityRefWithVote, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + locationId, _ := uuid.Parse("4b6702c7-aa35-4b89-9c96-b9abf6d3e540") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []IdentityRefWithVote + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetPullRequestReviewers function +type GetPullRequestReviewersArgs struct { + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + // Retrieve all pull requests matching a specified criteria. -func (client *Client) GetPullRequests(ctx context.Context, args GetPullRequestsArgs) (*[]GitPullRequest, error) { +func (client *ClientImpl) GetPullRequests(ctx context.Context, args GetPullRequestsArgs) (*[]GitPullRequest, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -3575,181 +4079,78 @@ type GetPullRequestsArgs struct { Top *int } -// Update a pull request -func (client *Client) UpdatePullRequest(ctx context.Context, args UpdatePullRequestArgs) (*GitPullRequest, error) { - if args.GitPullRequestToUpdate == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.GitPullRequestToUpdate"} - } +// Retrieve all pull requests matching a specified criteria. +func (client *ClientImpl) GetPullRequestsByProject(ctx context.Context, args GetPullRequestsByProjectArgs) (*[]GitPullRequest, error) { routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + routeValues["project"] = *args.Project - body, marshalErr := json.Marshal(*args.GitPullRequestToUpdate) - if marshalErr != nil { - return nil, marshalErr + queryParams := url.Values{} + if args.SearchCriteria == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "searchCriteria"} } - locationId, _ := uuid.Parse("9946fd70-0d40-406e-b686-b4744cbbcc37") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if args.SearchCriteria.RepositoryId != nil { + queryParams.Add("searchCriteria.repositoryId", (*args.SearchCriteria.RepositoryId).String()) + } + if args.SearchCriteria.CreatorId != nil { + queryParams.Add("searchCriteria.creatorId", (*args.SearchCriteria.CreatorId).String()) + } + if args.SearchCriteria.ReviewerId != nil { + queryParams.Add("searchCriteria.reviewerId", (*args.SearchCriteria.ReviewerId).String()) + } + if args.SearchCriteria.Status != nil { + queryParams.Add("searchCriteria.status", string(*args.SearchCriteria.Status)) + } + if args.SearchCriteria.TargetRefName != nil { + queryParams.Add("searchCriteria.targetRefName", *args.SearchCriteria.TargetRefName) + } + if args.SearchCriteria.SourceRepositoryId != nil { + queryParams.Add("searchCriteria.sourceRepositoryId", (*args.SearchCriteria.SourceRepositoryId).String()) + } + if args.SearchCriteria.SourceRefName != nil { + queryParams.Add("searchCriteria.sourceRefName", *args.SearchCriteria.SourceRefName) + } + if args.SearchCriteria.IncludeLinks != nil { + queryParams.Add("searchCriteria.includeLinks", strconv.FormatBool(*args.SearchCriteria.IncludeLinks)) + } + if args.MaxCommentLength != nil { + queryParams.Add("maxCommentLength", strconv.Itoa(*args.MaxCommentLength)) + } + if args.Skip != nil { + queryParams.Add("$skip", strconv.Itoa(*args.Skip)) + } + if args.Top != nil { + queryParams.Add("$top", strconv.Itoa(*args.Top)) + } + locationId, _ := uuid.Parse("a5d28130-9cd2-40fa-9f08-902e7daa9efb") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue GitPullRequest - err = client.Client.UnmarshalBody(resp, &responseValue) + var responseValue []GitPullRequest + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) return &responseValue, err } -// Arguments for the UpdatePullRequest function -type UpdatePullRequestArgs struct { - // (required) The pull request content that should be updated. - GitPullRequestToUpdate *GitPullRequest - // (required) The repository ID of the pull request's target branch. - RepositoryId *string - // (required) ID of the pull request to update. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Sends an e-mail notification about a specific pull request to a set of recipients -func (client *Client) SharePullRequest(ctx context.Context, args SharePullRequestArgs) error { - if args.UserMessage == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.UserMessage"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - body, marshalErr := json.Marshal(*args.UserMessage) - if marshalErr != nil { - return marshalErr - } - locationId, _ := uuid.Parse("696f3a82-47c9-487f-9117-b9d00972ca84") - _, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the SharePullRequest function -type SharePullRequestArgs struct { - // (required) - UserMessage *ShareNotificationContext - // (required) ID of the git repository. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Create a pull request status. -func (client *Client) CreatePullRequestStatus(ctx context.Context, args CreatePullRequestStatusArgs) (*GitPullRequestStatus, error) { - if args.Status == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Status"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - body, marshalErr := json.Marshal(*args.Status) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("b5f6bb4f-8d1e-4d79-8d11-4c9172c99c35") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitPullRequestStatus - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreatePullRequestStatus function -type CreatePullRequestStatusArgs struct { - // (required) Pull request status to create. - Status *GitPullRequestStatus - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Delete pull request status. -func (client *Client) DeletePullRequestStatus(ctx context.Context, args DeletePullRequestStatusArgs) error { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.StatusId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.StatusId"} - } - routeValues["statusId"] = strconv.Itoa(*args.StatusId) - - locationId, _ := uuid.Parse("b5f6bb4f-8d1e-4d79-8d11-4c9172c99c35") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeletePullRequestStatus function -type DeletePullRequestStatusArgs struct { - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the pull request status. - StatusId *int - // (optional) Project ID or project name +// Arguments for the GetPullRequestsByProject function +type GetPullRequestsByProjectArgs struct { + // (required) Project ID or project name Project *string + // (required) Pull requests will be returned that match this search criteria. + SearchCriteria *GitPullRequestSearchCriteria + // (optional) Not used. + MaxCommentLength *int + // (optional) The number of pull requests to ignore. For example, to retrieve results 101-150, set top to 50 and skip to 100. + Skip *int + // (optional) The number of pull requests to retrieve. + Top *int } // [Preview API] Get the specific pull request status by ID. The status ID is unique within the pull request across all iterations. -func (client *Client) GetPullRequestStatus(ctx context.Context, args GetPullRequestStatusArgs) (*GitPullRequestStatus, error) { +func (client *ClientImpl) GetPullRequestStatus(ctx context.Context, args GetPullRequestStatusArgs) (*GitPullRequestStatus, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -3791,7 +4192,7 @@ type GetPullRequestStatusArgs struct { } // [Preview API] Get all the statuses associated with a pull request. -func (client *Client) GetPullRequestStatuses(ctx context.Context, args GetPullRequestStatusesArgs) (*[]GitPullRequestStatus, error) { +func (client *ClientImpl) GetPullRequestStatuses(ctx context.Context, args GetPullRequestStatusesArgs) (*[]GitPullRequestStatus, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -3826,340 +4227,8 @@ type GetPullRequestStatusesArgs struct { Project *string } -// [Preview API] Update pull request statuses collection. The only supported operation type is `remove`. -func (client *Client) UpdatePullRequestStatuses(ctx context.Context, args UpdatePullRequestStatusesArgs) error { - if args.PatchDocument == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PatchDocument"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - body, marshalErr := json.Marshal(*args.PatchDocument) - if marshalErr != nil { - return marshalErr - } - locationId, _ := uuid.Parse("b5f6bb4f-8d1e-4d79-8d11-4c9172c99c35") - _, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json-patch+json", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the UpdatePullRequestStatuses function -type UpdatePullRequestStatusesArgs struct { - // (required) Operations to apply to the pull request statuses in JSON Patch format. - PatchDocument *[]webapi.JsonPatchOperation - // (required) The repository ID of the pull request’s target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - -// Create a comment on a specific thread in a pull request (up to 500 comments can be created per thread). -func (client *Client) CreateComment(ctx context.Context, args CreateCommentArgs) (*Comment, error) { - if args.Comment == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Comment"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.ThreadId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} - } - routeValues["threadId"] = strconv.Itoa(*args.ThreadId) - - body, marshalErr := json.Marshal(*args.Comment) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("965a3ec7-5ed8-455a-bdcb-835a5ea7fe7b") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue Comment - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateComment function -type CreateCommentArgs struct { - // (required) The comment to create. Comments can be up to 150,000 characters. - Comment *Comment - // (required) The repository ID of the pull request's target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the thread that the desired comment is in. - ThreadId *int - // (optional) Project ID or project name - Project *string -} - -// Delete a comment associated with a specific thread in a pull request. -func (client *Client) DeleteComment(ctx context.Context, args DeleteCommentArgs) error { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.ThreadId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} - } - routeValues["threadId"] = strconv.Itoa(*args.ThreadId) - if args.CommentId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.CommentId"} - } - routeValues["commentId"] = strconv.Itoa(*args.CommentId) - - locationId, _ := uuid.Parse("965a3ec7-5ed8-455a-bdcb-835a5ea7fe7b") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeleteComment function -type DeleteCommentArgs struct { - // (required) The repository ID of the pull request's target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the thread that the desired comment is in. - ThreadId *int - // (required) ID of the comment. - CommentId *int - // (optional) Project ID or project name - Project *string -} - -// Retrieve a comment associated with a specific thread in a pull request. -func (client *Client) GetComment(ctx context.Context, args GetCommentArgs) (*Comment, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.ThreadId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} - } - routeValues["threadId"] = strconv.Itoa(*args.ThreadId) - if args.CommentId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.CommentId"} - } - routeValues["commentId"] = strconv.Itoa(*args.CommentId) - - locationId, _ := uuid.Parse("965a3ec7-5ed8-455a-bdcb-835a5ea7fe7b") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue Comment - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetComment function -type GetCommentArgs struct { - // (required) The repository ID of the pull request's target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the thread that the desired comment is in. - ThreadId *int - // (required) ID of the comment. - CommentId *int - // (optional) Project ID or project name - Project *string -} - -// Retrieve all comments associated with a specific thread in a pull request. -func (client *Client) GetComments(ctx context.Context, args GetCommentsArgs) (*[]Comment, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.ThreadId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} - } - routeValues["threadId"] = strconv.Itoa(*args.ThreadId) - - locationId, _ := uuid.Parse("965a3ec7-5ed8-455a-bdcb-835a5ea7fe7b") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []Comment - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetComments function -type GetCommentsArgs struct { - // (required) The repository ID of the pull request's target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the thread. - ThreadId *int - // (optional) Project ID or project name - Project *string -} - -// Update a comment associated with a specific thread in a pull request. -func (client *Client) UpdateComment(ctx context.Context, args UpdateCommentArgs) (*Comment, error) { - if args.Comment == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Comment"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.ThreadId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} - } - routeValues["threadId"] = strconv.Itoa(*args.ThreadId) - if args.CommentId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.CommentId"} - } - routeValues["commentId"] = strconv.Itoa(*args.CommentId) - - body, marshalErr := json.Marshal(*args.Comment) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("965a3ec7-5ed8-455a-bdcb-835a5ea7fe7b") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue Comment - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdateComment function -type UpdateCommentArgs struct { - // (required) The comment content that should be updated. Comments can be up to 150,000 characters. - Comment *Comment - // (required) The repository ID of the pull request's target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the thread that the desired comment is in. - ThreadId *int - // (required) ID of the comment to update. - CommentId *int - // (optional) Project ID or project name - Project *string -} - -// Create a thread in a pull request. -func (client *Client) CreateThread(ctx context.Context, args CreateThreadArgs) (*GitPullRequestCommentThread, error) { - if args.CommentThread == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.CommentThread"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - body, marshalErr := json.Marshal(*args.CommentThread) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("ab6e2e5d-a0b7-4153-b64a-a4efe0d49449") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitPullRequestCommentThread - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateThread function -type CreateThreadArgs struct { - // (required) The thread to create. Thread must contain at least one comment. - CommentThread *GitPullRequestCommentThread - // (required) Repository ID of the pull request's target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string -} - // Retrieve a thread in a pull request. -func (client *Client) GetPullRequestThread(ctx context.Context, args GetPullRequestThreadArgs) (*GitPullRequestCommentThread, error) { +func (client *ClientImpl) GetPullRequestThread(ctx context.Context, args GetPullRequestThreadArgs) (*GitPullRequestCommentThread, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -4211,106 +4280,8 @@ type GetPullRequestThreadArgs struct { BaseIteration *int } -// Retrieve all threads in a pull request. -func (client *Client) GetThreads(ctx context.Context, args GetThreadsArgs) (*[]GitPullRequestCommentThread, error) { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - - queryParams := url.Values{} - if args.Iteration != nil { - queryParams.Add("$iteration", strconv.Itoa(*args.Iteration)) - } - if args.BaseIteration != nil { - queryParams.Add("$baseIteration", strconv.Itoa(*args.BaseIteration)) - } - locationId, _ := uuid.Parse("ab6e2e5d-a0b7-4153-b64a-a4efe0d49449") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []GitPullRequestCommentThread - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetThreads function -type GetThreadsArgs struct { - // (required) The repository ID of the pull request's target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (optional) Project ID or project name - Project *string - // (optional) If specified, thread positions will be tracked using this iteration as the right side of the diff. - Iteration *int - // (optional) If specified, thread positions will be tracked using this iteration as the left side of the diff. - BaseIteration *int -} - -// Update a thread in a pull request. -func (client *Client) UpdateThread(ctx context.Context, args UpdateThreadArgs) (*GitPullRequestCommentThread, error) { - if args.CommentThread == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.CommentThread"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - if args.PullRequestId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} - } - routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) - if args.ThreadId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} - } - routeValues["threadId"] = strconv.Itoa(*args.ThreadId) - - body, marshalErr := json.Marshal(*args.CommentThread) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("ab6e2e5d-a0b7-4153-b64a-a4efe0d49449") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitPullRequestCommentThread - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdateThread function -type UpdateThreadArgs struct { - // (required) The thread content that should be updated. - CommentThread *GitPullRequestCommentThread - // (required) The repository ID of the pull request's target branch. - RepositoryId *string - // (required) ID of the pull request. - PullRequestId *int - // (required) ID of the thread to update. - ThreadId *int - // (optional) Project ID or project name - Project *string -} - // Retrieve a list of work items associated with a pull request. -func (client *Client) GetPullRequestWorkItemRefs(ctx context.Context, args GetPullRequestWorkItemRefsArgs) (*[]webapi.ResourceRef, error) { +func (client *ClientImpl) GetPullRequestWorkItemRefs(ctx context.Context, args GetPullRequestWorkItemRefsArgs) (*[]webapi.ResourceRef, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -4345,47 +4316,8 @@ type GetPullRequestWorkItemRefsArgs struct { Project *string } -// Push changes to the repository. -func (client *Client) CreatePush(ctx context.Context, args CreatePushArgs) (*GitPush, error) { - if args.Push == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Push"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - - body, marshalErr := json.Marshal(*args.Push) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("ea98d07b-3c87-4971-8ede-a613694ffb55") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitPush - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreatePush function -type CreatePushArgs struct { - // (required) - Push *GitPush - // (required) The name or ID of the repository. - RepositoryId *string - // (optional) Project ID or project name - Project *string -} - // Retrieves a particular push. -func (client *Client) GetPush(ctx context.Context, args GetPushArgs) (*GitPush, error) { +func (client *ClientImpl) GetPush(ctx context.Context, args GetPushArgs) (*GitPush, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -4431,8 +4363,60 @@ type GetPushArgs struct { IncludeRefUpdates *bool } +// Retrieve a list of commits associated with a particular push. +func (client *ClientImpl) GetPushCommits(ctx context.Context, args GetPushCommitsArgs) (*[]GitCommitRef, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + + queryParams := url.Values{} + if args.PushId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "pushId"} + } + queryParams.Add("pushId", strconv.Itoa(*args.PushId)) + if args.Top != nil { + queryParams.Add("top", strconv.Itoa(*args.Top)) + } + if args.Skip != nil { + queryParams.Add("skip", strconv.Itoa(*args.Skip)) + } + if args.IncludeLinks != nil { + queryParams.Add("includeLinks", strconv.FormatBool(*args.IncludeLinks)) + } + locationId, _ := uuid.Parse("c2570c3b-5b3f-41b8-98bf-5407bfde8d58") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []GitCommitRef + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetPushCommits function +type GetPushCommitsArgs struct { + // (required) The id or friendly name of the repository. To use the friendly name, projectId must also be specified. + RepositoryId *string + // (required) The id of the push. + PushId *int + // (optional) Project ID or project name + Project *string + // (optional) The maximum number of commits to return ("get the top x commits"). + Top *int + // (optional) The number of commits to skip. + Skip *int + // (optional) Set to false to avoid including REST Url links for resources. Defaults to true. + IncludeLinks *bool +} + // Retrieves pushes associated with the specified repository. -func (client *Client) GetPushes(ctx context.Context, args GetPushesArgs) (*[]GitPush, error) { +func (client *ClientImpl) GetPushes(ctx context.Context, args GetPushesArgs) (*[]GitPush, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -4494,37 +4478,8 @@ type GetPushesArgs struct { SearchCriteria *GitPushSearchCriteria } -// [Preview API] Destroy (hard delete) a soft-deleted Git repository. -func (client *Client) DeleteRepositoryFromRecycleBin(ctx context.Context, args DeleteRepositoryFromRecycleBinArgs) error { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RepositoryId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = (*args.RepositoryId).String() - - locationId, _ := uuid.Parse("a663da97-81db-4eb3-8b83-287670f63073") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeleteRepositoryFromRecycleBin function -type DeleteRepositoryFromRecycleBinArgs struct { - // (required) Project ID or project name - Project *string - // (required) The ID of the repository. - RepositoryId *uuid.UUID -} - // [Preview API] Retrieve soft-deleted git repositories from the recycle bin. -func (client *Client) GetRecycleBinRepositories(ctx context.Context, args GetRecycleBinRepositoriesArgs) (*[]GitDeletedRepository, error) { +func (client *ClientImpl) GetRecycleBinRepositories(ctx context.Context, args GetRecycleBinRepositoriesArgs) (*[]GitDeletedRepository, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -4548,48 +4503,75 @@ type GetRecycleBinRepositoriesArgs struct { Project *string } -// [Preview API] Recover a soft-deleted Git repository. Recently deleted repositories go into a soft-delete state for a period of time before they are hard deleted and become unrecoverable. -func (client *Client) RestoreRepositoryFromRecycleBin(ctx context.Context, args RestoreRepositoryFromRecycleBinArgs) (*GitRepository, error) { - if args.RepositoryDetails == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RepositoryDetails"} - } +// [Preview API] Gets the refs favorite for a favorite Id. +func (client *ClientImpl) GetRefFavorite(ctx context.Context, args GetRefFavoriteArgs) (*GitRefFavorite, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} } routeValues["project"] = *args.Project - if args.RepositoryId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RepositoryId"} + if args.FavoriteId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.FavoriteId"} } - routeValues["repositoryId"] = (*args.RepositoryId).String() + routeValues["favoriteId"] = strconv.Itoa(*args.FavoriteId) - body, marshalErr := json.Marshal(*args.RepositoryDetails) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("a663da97-81db-4eb3-8b83-287670f63073") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + locationId, _ := uuid.Parse("876f70af-5792-485a-a1c7-d0a7b2f42bbb") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue GitRepository + var responseValue GitRefFavorite err = client.Client.UnmarshalBody(resp, &responseValue) return &responseValue, err } -// Arguments for the RestoreRepositoryFromRecycleBin function -type RestoreRepositoryFromRecycleBinArgs struct { - // (required) - RepositoryDetails *GitRecycleBinRepositoryDetails +// Arguments for the GetRefFavorite function +type GetRefFavoriteArgs struct { // (required) Project ID or project name Project *string - // (required) The ID of the repository. - RepositoryId *uuid.UUID + // (required) The Id of the requested ref favorite. + FavoriteId *int +} + +// [Preview API] Gets the refs favorites for a repo and an identity. +func (client *ClientImpl) GetRefFavorites(ctx context.Context, args GetRefFavoritesArgs) (*[]GitRefFavorite, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + + queryParams := url.Values{} + if args.RepositoryId != nil { + queryParams.Add("repositoryId", *args.RepositoryId) + } + if args.IdentityId != nil { + queryParams.Add("identityId", *args.IdentityId) + } + locationId, _ := uuid.Parse("876f70af-5792-485a-a1c7-d0a7b2f42bbb") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []GitRefFavorite + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetRefFavorites function +type GetRefFavoritesArgs struct { + // (required) Project ID or project name + Project *string + // (optional) The id of the repository. + RepositoryId *string + // (optional) The id of the identity whose favorites are to be retrieved. If null, the requesting identity is used. + IdentityId *string } // Queries the provided repository for its refs and returns them. -func (client *Client) GetRefs(ctx context.Context, args GetRefsArgs) (*GetRefsResponseValue, error) { +func (client *ClientImpl) GetRefs(ctx context.Context, args GetRefsArgs) (*GetRefsResponseValue, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -4672,301 +4654,8 @@ type GetRefsResponseValue struct { ContinuationToken string } -// Lock or Unlock a branch. -func (client *Client) UpdateRef(ctx context.Context, args UpdateRefArgs) (*GitRef, error) { - if args.NewRefInfo == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.NewRefInfo"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - - queryParams := url.Values{} - if args.Filter == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "filter"} - } - queryParams.Add("filter", *args.Filter) - if args.ProjectId != nil { - queryParams.Add("projectId", *args.ProjectId) - } - body, marshalErr := json.Marshal(*args.NewRefInfo) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("2d874a60-a811-4f62-9c9f-963a6ea0a55b") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitRef - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdateRef function -type UpdateRefArgs struct { - // (required) The ref update action (lock/unlock) to perform - NewRefInfo *GitRefUpdate - // (required) The name or ID of the repository. - RepositoryId *string - // (required) The name of the branch to lock/unlock - Filter *string - // (optional) Project ID or project name - Project *string - // (optional) ID or name of the team project. Optional if specifying an ID for repository. - ProjectId *string -} - -// Creating, updating, or deleting refs(branches). -func (client *Client) UpdateRefs(ctx context.Context, args UpdateRefsArgs) (*[]GitRefUpdateResult, error) { - if args.RefUpdates == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RefUpdates"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - - queryParams := url.Values{} - if args.ProjectId != nil { - queryParams.Add("projectId", *args.ProjectId) - } - body, marshalErr := json.Marshal(*args.RefUpdates) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("2d874a60-a811-4f62-9c9f-963a6ea0a55b") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []GitRefUpdateResult - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdateRefs function -type UpdateRefsArgs struct { - // (required) List of ref updates to attempt to perform - RefUpdates *[]GitRefUpdate - // (required) The name or ID of the repository. - RepositoryId *string - // (optional) Project ID or project name - Project *string - // (optional) ID or name of the team project. Optional if specifying an ID for repository. - ProjectId *string -} - -// [Preview API] Creates a ref favorite -func (client *Client) CreateFavorite(ctx context.Context, args CreateFavoriteArgs) (*GitRefFavorite, error) { - if args.Favorite == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Favorite"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - - body, marshalErr := json.Marshal(*args.Favorite) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("876f70af-5792-485a-a1c7-d0a7b2f42bbb") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitRefFavorite - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateFavorite function -type CreateFavoriteArgs struct { - // (required) The ref favorite to create. - Favorite *GitRefFavorite - // (required) Project ID or project name - Project *string -} - -// [Preview API] Deletes the refs favorite specified -func (client *Client) DeleteRefFavorite(ctx context.Context, args DeleteRefFavoriteArgs) error { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.FavoriteId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.FavoriteId"} - } - routeValues["favoriteId"] = strconv.Itoa(*args.FavoriteId) - - locationId, _ := uuid.Parse("876f70af-5792-485a-a1c7-d0a7b2f42bbb") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeleteRefFavorite function -type DeleteRefFavoriteArgs struct { - // (required) Project ID or project name - Project *string - // (required) The Id of the ref favorite to delete. - FavoriteId *int -} - -// [Preview API] Gets the refs favorite for a favorite Id. -func (client *Client) GetRefFavorite(ctx context.Context, args GetRefFavoriteArgs) (*GitRefFavorite, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.FavoriteId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.FavoriteId"} - } - routeValues["favoriteId"] = strconv.Itoa(*args.FavoriteId) - - locationId, _ := uuid.Parse("876f70af-5792-485a-a1c7-d0a7b2f42bbb") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitRefFavorite - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetRefFavorite function -type GetRefFavoriteArgs struct { - // (required) Project ID or project name - Project *string - // (required) The Id of the requested ref favorite. - FavoriteId *int -} - -// [Preview API] Gets the refs favorites for a repo and an identity. -func (client *Client) GetRefFavorites(ctx context.Context, args GetRefFavoritesArgs) (*[]GitRefFavorite, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - - queryParams := url.Values{} - if args.RepositoryId != nil { - queryParams.Add("repositoryId", *args.RepositoryId) - } - if args.IdentityId != nil { - queryParams.Add("identityId", *args.IdentityId) - } - locationId, _ := uuid.Parse("876f70af-5792-485a-a1c7-d0a7b2f42bbb") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []GitRefFavorite - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetRefFavorites function -type GetRefFavoritesArgs struct { - // (required) Project ID or project name - Project *string - // (optional) The id of the repository. - RepositoryId *string - // (optional) The id of the identity whose favorites are to be retrieved. If null, the requesting identity is used. - IdentityId *string -} - -// Create a git repository in a team project. -func (client *Client) CreateRepository(ctx context.Context, args CreateRepositoryArgs) (*GitRepository, error) { - if args.GitRepositoryToCreate == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.GitRepositoryToCreate"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - - queryParams := url.Values{} - if args.SourceRef != nil { - queryParams.Add("sourceRef", *args.SourceRef) - } - body, marshalErr := json.Marshal(*args.GitRepositoryToCreate) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("225f7195-f9c7-4d14-ab28-a83f7ff77e1f") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitRepository - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateRepository function -type CreateRepositoryArgs struct { - // (required) Specify the repo name, team project and/or parent repository. Team project information can be ommitted from gitRepositoryToCreate if the request is project-scoped (i.e., includes project Id). - GitRepositoryToCreate *GitRepositoryCreateOptions - // (optional) Project ID or project name - Project *string - // (optional) [optional] Specify the source refs to use while creating a fork repo - SourceRef *string -} - -// Delete a git repository -func (client *Client) DeleteRepository(ctx context.Context, args DeleteRepositoryArgs) error { - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = (*args.RepositoryId).String() - - locationId, _ := uuid.Parse("225f7195-f9c7-4d14-ab28-a83f7ff77e1f") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeleteRepository function -type DeleteRepositoryArgs struct { - // (required) The name or ID of the repository. - RepositoryId *uuid.UUID - // (optional) Project ID or project name - Project *string -} - // Retrieve git repositories. -func (client *Client) GetRepositories(ctx context.Context, args GetRepositoriesArgs) (*[]GitRepository, error) { +func (client *ClientImpl) GetRepositories(ctx context.Context, args GetRepositoriesArgs) (*[]GitRepository, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -5006,7 +4695,7 @@ type GetRepositoriesArgs struct { } // Retrieve a git repository. -func (client *Client) GetRepository(ctx context.Context, args GetRepositoryArgs) (*GitRepository, error) { +func (client *ClientImpl) GetRepository(ctx context.Context, args GetRepositoryArgs) (*GitRepository, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -5036,7 +4725,7 @@ type GetRepositoryArgs struct { } // Retrieve a git repository. -func (client *Client) GetRepositoryWithParent(ctx context.Context, args GetRepositoryWithParentArgs) (*GitRepository, error) { +func (client *ClientImpl) GetRepositoryWithParent(ctx context.Context, args GetRepositoryWithParentArgs) (*GitRepository, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -5072,87 +4761,8 @@ type GetRepositoryWithParentArgs struct { Project *string } -// Updates the Git repository with either a new repo name or a new default branch. -func (client *Client) UpdateRepository(ctx context.Context, args UpdateRepositoryArgs) (*GitRepository, error) { - if args.NewRepositoryInfo == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.NewRepositoryInfo"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.RepositoryId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = (*args.RepositoryId).String() - - body, marshalErr := json.Marshal(*args.NewRepositoryInfo) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("225f7195-f9c7-4d14-ab28-a83f7ff77e1f") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitRepository - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdateRepository function -type UpdateRepositoryArgs struct { - // (required) Specify a new repo name or a new default branch of the repository - NewRepositoryInfo *GitRepository - // (required) The name or ID of the repository. - RepositoryId *uuid.UUID - // (optional) Project ID or project name - Project *string -} - -// [Preview API] Starts the operation to create a new branch which reverts changes introduced by either a specific commit or commits that are associated to a pull request. -func (client *Client) CreateRevert(ctx context.Context, args CreateRevertArgs) (*GitRevert, error) { - if args.RevertToCreate == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RevertToCreate"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - - body, marshalErr := json.Marshal(*args.RevertToCreate) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("bc866058-5449-4715-9cf1-a510b6ff193c") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitRevert - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateRevert function -type CreateRevertArgs struct { - // (required) - RevertToCreate *GitAsyncRefOperationParameters - // (required) Project ID or project name - Project *string - // (required) ID of the repository. - RepositoryId *string -} - // [Preview API] Retrieve information about a revert operation by revert Id. -func (client *Client) GetRevert(ctx context.Context, args GetRevertArgs) (*GitRevert, error) { +func (client *ClientImpl) GetRevert(ctx context.Context, args GetRevertArgs) (*GitRevert, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -5189,7 +4799,7 @@ type GetRevertArgs struct { } // [Preview API] Retrieve information about a revert operation for a specific branch. -func (client *Client) GetRevertForRefName(ctx context.Context, args GetRevertForRefNameArgs) (*GitRevert, error) { +func (client *ClientImpl) GetRevertForRefName(ctx context.Context, args GetRevertForRefNameArgs) (*GitRevert, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -5226,53 +4836,8 @@ type GetRevertForRefNameArgs struct { RefName *string } -// Create Git commit status. -func (client *Client) CreateCommitStatus(ctx context.Context, args CreateCommitStatusArgs) (*GitStatus, error) { - if args.GitCommitStatusToCreate == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.GitCommitStatusToCreate"} - } - routeValues := make(map[string]string) - if args.Project != nil && *args.Project != "" { - routeValues["project"] = *args.Project - } - if args.CommitId == nil || *args.CommitId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.CommitId"} - } - routeValues["commitId"] = *args.CommitId - if args.RepositoryId == nil || *args.RepositoryId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} - } - routeValues["repositoryId"] = *args.RepositoryId - - body, marshalErr := json.Marshal(*args.GitCommitStatusToCreate) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("428dd4fb-fda5-4722-af02-9313b80305da") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue GitStatus - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateCommitStatus function -type CreateCommitStatusArgs struct { - // (required) Git commit status object to create. - GitCommitStatusToCreate *GitStatus - // (required) ID of the Git commit. - CommitId *string - // (required) ID of the repository. - RepositoryId *string - // (optional) Project ID or project name - Project *string -} - // Get statuses associated with the Git commit. -func (client *Client) GetStatuses(ctx context.Context, args GetStatusesArgs) (*[]GitStatus, error) { +func (client *ClientImpl) GetStatuses(ctx context.Context, args GetStatusesArgs) (*[]GitStatus, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -5324,7 +4889,7 @@ type GetStatusesArgs struct { } // [Preview API] Retrieve a pull request suggestion for a particular repository or team project. -func (client *Client) GetSuggestions(ctx context.Context, args GetSuggestionsArgs) (*[]GitSuggestion, error) { +func (client *ClientImpl) GetSuggestions(ctx context.Context, args GetSuggestionsArgs) (*[]GitSuggestion, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -5353,8 +4918,55 @@ type GetSuggestionsArgs struct { Project *string } +// Retrieve all threads in a pull request. +func (client *ClientImpl) GetThreads(ctx context.Context, args GetThreadsArgs) (*[]GitPullRequestCommentThread, error) { + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + queryParams := url.Values{} + if args.Iteration != nil { + queryParams.Add("$iteration", strconv.Itoa(*args.Iteration)) + } + if args.BaseIteration != nil { + queryParams.Add("$baseIteration", strconv.Itoa(*args.BaseIteration)) + } + locationId, _ := uuid.Parse("ab6e2e5d-a0b7-4153-b64a-a4efe0d49449") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []GitPullRequestCommentThread + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetThreads function +type GetThreadsArgs struct { + // (required) The repository ID of the pull request's target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string + // (optional) If specified, thread positions will be tracked using this iteration as the right side of the diff. + Iteration *int + // (optional) If specified, thread positions will be tracked using this iteration as the left side of the diff. + BaseIteration *int +} + // The Tree endpoint returns the collection of objects underneath the specified tree. Trees are folders in a Git repository. -func (client *Client) GetTree(ctx context.Context, args GetTreeArgs) (*GitTreeRef, error) { +func (client *ClientImpl) GetTree(ctx context.Context, args GetTreeArgs) (*GitTreeRef, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -5406,7 +5018,7 @@ type GetTreeArgs struct { } // The Tree endpoint returns the collection of objects underneath the specified tree. Trees are folders in a Git repository. -func (client *Client) GetTreeZip(ctx context.Context, args GetTreeZipArgs) (io.ReadCloser, error) { +func (client *ClientImpl) GetTreeZip(ctx context.Context, args GetTreeZipArgs) (io.ReadCloser, error) { routeValues := make(map[string]string) if args.Project != nil && *args.Project != "" { routeValues["project"] = *args.Project @@ -5454,3 +5066,637 @@ type GetTreeZipArgs struct { // (optional) Name to use if a .zip file is returned. Default is the object ID. FileName *string } + +// [Preview API] Retrieve import requests for a repository. +func (client *ClientImpl) QueryImportRequests(ctx context.Context, args QueryImportRequestsArgs) (*[]GitImportRequest, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + + queryParams := url.Values{} + if args.IncludeAbandoned != nil { + queryParams.Add("includeAbandoned", strconv.FormatBool(*args.IncludeAbandoned)) + } + locationId, _ := uuid.Parse("01828ddc-3600-4a41-8633-99b3a73a0eb3") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []GitImportRequest + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the QueryImportRequests function +type QueryImportRequestsArgs struct { + // (required) Project ID or project name + Project *string + // (required) The name or ID of the repository. + RepositoryId *string + // (optional) True to include abandoned import requests in the results. + IncludeAbandoned *bool +} + +// [Preview API] Recover a soft-deleted Git repository. Recently deleted repositories go into a soft-delete state for a period of time before they are hard deleted and become unrecoverable. +func (client *ClientImpl) RestoreRepositoryFromRecycleBin(ctx context.Context, args RestoreRepositoryFromRecycleBinArgs) (*GitRepository, error) { + if args.RepositoryDetails == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RepositoryDetails"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RepositoryId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = (*args.RepositoryId).String() + + body, marshalErr := json.Marshal(*args.RepositoryDetails) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("a663da97-81db-4eb3-8b83-287670f63073") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitRepository + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the RestoreRepositoryFromRecycleBin function +type RestoreRepositoryFromRecycleBinArgs struct { + // (required) + RepositoryDetails *GitRecycleBinRepositoryDetails + // (required) Project ID or project name + Project *string + // (required) The ID of the repository. + RepositoryId *uuid.UUID +} + +// [Preview API] Sends an e-mail notification about a specific pull request to a set of recipients +func (client *ClientImpl) SharePullRequest(ctx context.Context, args SharePullRequestArgs) error { + if args.UserMessage == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.UserMessage"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + body, marshalErr := json.Marshal(*args.UserMessage) + if marshalErr != nil { + return marshalErr + } + locationId, _ := uuid.Parse("696f3a82-47c9-487f-9117-b9d00972ca84") + _, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the SharePullRequest function +type SharePullRequestArgs struct { + // (required) + UserMessage *ShareNotificationContext + // (required) ID of the git repository. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + +// Update a comment associated with a specific thread in a pull request. +func (client *ClientImpl) UpdateComment(ctx context.Context, args UpdateCommentArgs) (*Comment, error) { + if args.Comment == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Comment"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.ThreadId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} + } + routeValues["threadId"] = strconv.Itoa(*args.ThreadId) + if args.CommentId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.CommentId"} + } + routeValues["commentId"] = strconv.Itoa(*args.CommentId) + + body, marshalErr := json.Marshal(*args.Comment) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("965a3ec7-5ed8-455a-bdcb-835a5ea7fe7b") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue Comment + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateComment function +type UpdateCommentArgs struct { + // (required) The comment content that should be updated. Comments can be up to 150,000 characters. + Comment *Comment + // (required) The repository ID of the pull request's target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the thread that the desired comment is in. + ThreadId *int + // (required) ID of the comment to update. + CommentId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Retry or abandon a failed import request. +func (client *ClientImpl) UpdateImportRequest(ctx context.Context, args UpdateImportRequestArgs) (*GitImportRequest, error) { + if args.ImportRequestToUpdate == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ImportRequestToUpdate"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.ImportRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ImportRequestId"} + } + routeValues["importRequestId"] = strconv.Itoa(*args.ImportRequestId) + + body, marshalErr := json.Marshal(*args.ImportRequestToUpdate) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("01828ddc-3600-4a41-8633-99b3a73a0eb3") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitImportRequest + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateImportRequest function +type UpdateImportRequestArgs struct { + // (required) The updated version of the import request. Currently, the only change allowed is setting the Status to Queued or Abandoned. + ImportRequestToUpdate *GitImportRequest + // (required) Project ID or project name + Project *string + // (required) The name or ID of the repository. + RepositoryId *string + // (required) The unique identifier for the import request to update. + ImportRequestId *int +} + +// Update a pull request +func (client *ClientImpl) UpdatePullRequest(ctx context.Context, args UpdatePullRequestArgs) (*GitPullRequest, error) { + if args.GitPullRequestToUpdate == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.GitPullRequestToUpdate"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + body, marshalErr := json.Marshal(*args.GitPullRequestToUpdate) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("9946fd70-0d40-406e-b686-b4744cbbcc37") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitPullRequest + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdatePullRequest function +type UpdatePullRequestArgs struct { + // (required) The pull request content that should be updated. + GitPullRequestToUpdate *GitPullRequest + // (required) The repository ID of the pull request's target branch. + RepositoryId *string + // (required) ID of the pull request to update. + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Update pull request iteration statuses collection. The only supported operation type is `remove`. +func (client *ClientImpl) UpdatePullRequestIterationStatuses(ctx context.Context, args UpdatePullRequestIterationStatusesArgs) error { + if args.PatchDocument == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PatchDocument"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.IterationId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} + } + routeValues["iterationId"] = strconv.Itoa(*args.IterationId) + + body, marshalErr := json.Marshal(*args.PatchDocument) + if marshalErr != nil { + return marshalErr + } + locationId, _ := uuid.Parse("75cf11c5-979f-4038-a76e-058a06adf2bf") + _, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json-patch+json", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the UpdatePullRequestIterationStatuses function +type UpdatePullRequestIterationStatusesArgs struct { + // (required) Operations to apply to the pull request statuses in JSON Patch format. + PatchDocument *[]webapi.JsonPatchOperation + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the pull request iteration. + IterationId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Create or update pull request external properties. The patch operation can be `add`, `replace` or `remove`. For `add` operation, the path can be empty. If the path is empty, the value must be a list of key value pairs. For `replace` operation, the path cannot be empty. If the path does not exist, the property will be added to the collection. For `remove` operation, the path cannot be empty. If the path does not exist, no action will be performed. +func (client *ClientImpl) UpdatePullRequestProperties(ctx context.Context, args UpdatePullRequestPropertiesArgs) (interface{}, error) { + if args.PatchDocument == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PatchDocument"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + body, marshalErr := json.Marshal(*args.PatchDocument) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("48a52185-5b9e-4736-9dc1-bb1e2feac80b") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json-patch+json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue interface{} + err = client.Client.UnmarshalBody(resp, responseValue) + return responseValue, err +} + +// Arguments for the UpdatePullRequestProperties function +type UpdatePullRequestPropertiesArgs struct { + // (required) Properties to add, replace or remove in JSON Patch format. + PatchDocument *[]webapi.JsonPatchOperation + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + +// Reset the votes of multiple reviewers on a pull request. NOTE: This endpoint only supports updating votes, but does not support updating required reviewers (use policy) or display names. +func (client *ClientImpl) UpdatePullRequestReviewers(ctx context.Context, args UpdatePullRequestReviewersArgs) error { + if args.PatchVotes == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PatchVotes"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + body, marshalErr := json.Marshal(*args.PatchVotes) + if marshalErr != nil { + return marshalErr + } + locationId, _ := uuid.Parse("4b6702c7-aa35-4b89-9c96-b9abf6d3e540") + _, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the UpdatePullRequestReviewers function +type UpdatePullRequestReviewersArgs struct { + // (required) IDs of the reviewers whose votes will be reset to zero + PatchVotes *[]IdentityRefWithVote + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + +// [Preview API] Update pull request statuses collection. The only supported operation type is `remove`. +func (client *ClientImpl) UpdatePullRequestStatuses(ctx context.Context, args UpdatePullRequestStatusesArgs) error { + if args.PatchDocument == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PatchDocument"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + + body, marshalErr := json.Marshal(*args.PatchDocument) + if marshalErr != nil { + return marshalErr + } + locationId, _ := uuid.Parse("b5f6bb4f-8d1e-4d79-8d11-4c9172c99c35") + _, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json-patch+json", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the UpdatePullRequestStatuses function +type UpdatePullRequestStatusesArgs struct { + // (required) Operations to apply to the pull request statuses in JSON Patch format. + PatchDocument *[]webapi.JsonPatchOperation + // (required) The repository ID of the pull request’s target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (optional) Project ID or project name + Project *string +} + +// Lock or Unlock a branch. +func (client *ClientImpl) UpdateRef(ctx context.Context, args UpdateRefArgs) (*GitRef, error) { + if args.NewRefInfo == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.NewRefInfo"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + + queryParams := url.Values{} + if args.Filter == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "filter"} + } + queryParams.Add("filter", *args.Filter) + if args.ProjectId != nil { + queryParams.Add("projectId", *args.ProjectId) + } + body, marshalErr := json.Marshal(*args.NewRefInfo) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("2d874a60-a811-4f62-9c9f-963a6ea0a55b") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitRef + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateRef function +type UpdateRefArgs struct { + // (required) The ref update action (lock/unlock) to perform + NewRefInfo *GitRefUpdate + // (required) The name or ID of the repository. + RepositoryId *string + // (required) The name of the branch to lock/unlock + Filter *string + // (optional) Project ID or project name + Project *string + // (optional) ID or name of the team project. Optional if specifying an ID for repository. + ProjectId *string +} + +// Creating, updating, or deleting refs(branches). +func (client *ClientImpl) UpdateRefs(ctx context.Context, args UpdateRefsArgs) (*[]GitRefUpdateResult, error) { + if args.RefUpdates == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RefUpdates"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + + queryParams := url.Values{} + if args.ProjectId != nil { + queryParams.Add("projectId", *args.ProjectId) + } + body, marshalErr := json.Marshal(*args.RefUpdates) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("2d874a60-a811-4f62-9c9f-963a6ea0a55b") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, queryParams, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []GitRefUpdateResult + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateRefs function +type UpdateRefsArgs struct { + // (required) List of ref updates to attempt to perform + RefUpdates *[]GitRefUpdate + // (required) The name or ID of the repository. + RepositoryId *string + // (optional) Project ID or project name + Project *string + // (optional) ID or name of the team project. Optional if specifying an ID for repository. + ProjectId *string +} + +// Updates the Git repository with either a new repo name or a new default branch. +func (client *ClientImpl) UpdateRepository(ctx context.Context, args UpdateRepositoryArgs) (*GitRepository, error) { + if args.NewRepositoryInfo == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.NewRepositoryInfo"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = (*args.RepositoryId).String() + + body, marshalErr := json.Marshal(*args.NewRepositoryInfo) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("225f7195-f9c7-4d14-ab28-a83f7ff77e1f") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitRepository + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateRepository function +type UpdateRepositoryArgs struct { + // (required) Specify a new repo name or a new default branch of the repository + NewRepositoryInfo *GitRepository + // (required) The name or ID of the repository. + RepositoryId *uuid.UUID + // (optional) Project ID or project name + Project *string +} + +// Update a thread in a pull request. +func (client *ClientImpl) UpdateThread(ctx context.Context, args UpdateThreadArgs) (*GitPullRequestCommentThread, error) { + if args.CommentThread == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.CommentThread"} + } + routeValues := make(map[string]string) + if args.Project != nil && *args.Project != "" { + routeValues["project"] = *args.Project + } + if args.RepositoryId == nil || *args.RepositoryId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.RepositoryId"} + } + routeValues["repositoryId"] = *args.RepositoryId + if args.PullRequestId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PullRequestId"} + } + routeValues["pullRequestId"] = strconv.Itoa(*args.PullRequestId) + if args.ThreadId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ThreadId"} + } + routeValues["threadId"] = strconv.Itoa(*args.ThreadId) + + body, marshalErr := json.Marshal(*args.CommentThread) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("ab6e2e5d-a0b7-4153-b64a-a4efe0d49449") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue GitPullRequestCommentThread + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateThread function +type UpdateThreadArgs struct { + // (required) The thread content that should be updated. + CommentThread *GitPullRequestCommentThread + // (required) The repository ID of the pull request's target branch. + RepositoryId *string + // (required) ID of the pull request. + PullRequestId *int + // (required) ID of the thread to update. + ThreadId *int + // (optional) Project ID or project name + Project *string +} diff --git a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/git/models.go b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/git/models.go index 44ad22e1..03c59814 100644 --- a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/git/models.go +++ b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/git/models.go @@ -1454,7 +1454,7 @@ type GitPullRequestCompletionOptions struct { MergeCommitMessage *string `json:"mergeCommitMessage,omitempty"` // Specify the strategy used to merge the pull request during completion. If MergeStrategy is not set to any value, a no-FF merge will be created if SquashMerge == false. If MergeStrategy is not set to any value, the pull request commits will be squash if SquashMerge == true. The SquashMerge member is deprecated. It is recommended that you explicitly set MergeStrategy in all cases. If an explicit value is provided for MergeStrategy, the SquashMerge member will be ignored. MergeStrategy *GitPullRequestMergeStrategy `json:"mergeStrategy,omitempty"` - // SquashMerge is deprecated. You should explicity set the value of MergeStrategy. If MergeStrategy is set to any value, the SquashMerge value will be ignored. If MergeStrategy is not set, the merge strategy will be no-fast-forward if this flag is false, or squash if true. + // SquashMerge is deprecated. You should explicitly set the value of MergeStrategy. If MergeStrategy is set to any value, the SquashMerge value will be ignored. If MergeStrategy is not set, the merge strategy will be no-fast-forward if this flag is false, or squash if true. SquashMerge *bool `json:"squashMerge,omitempty"` // If true, we will attempt to transition any work items linked to the pull request into the next logical state (i.e. Active -> Resolved) TransitionWorkItems *bool `json:"transitionWorkItems,omitempty"` @@ -2162,7 +2162,7 @@ type GitTemplate struct { type GitTreeDiff struct { // ObjectId of the base tree of this diff. BaseTreeId *string `json:"baseTreeId,omitempty"` - // List of tree entries that differ between the base and target tree. Renames and object type changes are returned as a delete for the old object and add for the new object. If a continuation token is returned in the response header, some tree entries are yet to be processed and may yeild more diff entries. If the continuation token is not returned all the diff entries have been included in this response. + // List of tree entries that differ between the base and target tree. Renames and object type changes are returned as a delete for the old object and add for the new object. If a continuation token is returned in the response header, some tree entries are yet to be processed and may yield more diff entries. If the continuation token is not returned all the diff entries have been included in this response. DiffEntries *[]GitTreeDiffEntry `json:"diffEntries,omitempty"` // ObjectId of the target tree of this diff. TargetTreeId *string `json:"targetTreeId,omitempty"` @@ -2518,7 +2518,7 @@ var PullRequestStatusValues = pullRequestStatusValuesType{ Abandoned: "abandoned", // Pull request is completed. Completed: "completed", - // Used in pull request search criterias to include all statuses. + // Used in pull request search criteria to include all statuses. All: "all", } diff --git a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/identity/client.go b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/identity/client.go index e3778f47..226eab91 100644 --- a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/identity/client.go +++ b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/identity/client.go @@ -23,22 +23,157 @@ import ( var ResourceAreaId, _ = uuid.Parse("8a3d49b8-91f0-46ef-b33d-dda338c25db3") -type Client struct { +type Client interface { + // [Preview API] + AddMember(context.Context, AddMemberArgs) (*bool, error) + CreateGroups(context.Context, CreateGroupsArgs) (*[]Identity, error) + CreateIdentity(context.Context, CreateIdentityArgs) (*Identity, error) + // [Preview API] + CreateOrBindWithClaims(context.Context, CreateOrBindWithClaimsArgs) (*Identity, error) + // [Preview API] + CreateScope(context.Context, CreateScopeArgs) (*IdentityScope, error) + DeleteGroup(context.Context, DeleteGroupArgs) error + // [Preview API] + DeleteScope(context.Context, DeleteScopeArgs) error + // [Preview API] + GetDescriptorById(context.Context, GetDescriptorByIdArgs) (*string, error) + GetIdentityChanges(context.Context, GetIdentityChangesArgs) (*ChangedIdentities, error) + // [Preview API] + GetIdentitySnapshot(context.Context, GetIdentitySnapshotArgs) (*IdentitySnapshot, error) + // Read the max sequence id of all the identities. + GetMaxSequenceId(context.Context, GetMaxSequenceIdArgs) (*uint64, error) + // [Preview API] + GetScopeById(context.Context, GetScopeByIdArgs) (*IdentityScope, error) + // [Preview API] + GetScopeByName(context.Context, GetScopeByNameArgs) (*IdentityScope, error) + // Read identity of the home tenant request user. + GetSelf(context.Context, GetSelfArgs) (*IdentitySelf, error) + // [Preview API] + GetSignedInToken(context.Context, GetSignedInTokenArgs) (*delegatedauthorization.AccessTokenResult, error) + // [Preview API] + GetSignoutToken(context.Context, GetSignoutTokenArgs) (*delegatedauthorization.AccessTokenResult, error) + // [Preview API] + GetTenant(context.Context, GetTenantArgs) (*TenantInfo, error) + GetUserIdentityIdsByDomainId(context.Context, GetUserIdentityIdsByDomainIdArgs) (*[]uuid.UUID, error) + ListGroups(context.Context, ListGroupsArgs) (*[]Identity, error) + ReadIdentities(context.Context, ReadIdentitiesArgs) (*[]Identity, error) + ReadIdentitiesByScope(context.Context, ReadIdentitiesByScopeArgs) (*[]Identity, error) + ReadIdentity(context.Context, ReadIdentityArgs) (*Identity, error) + // [Preview API] + ReadIdentityBatch(context.Context, ReadIdentityBatchArgs) (*[]Identity, error) + // [Preview API] + ReadMember(context.Context, ReadMemberArgs) (*string, error) + // [Preview API] + ReadMemberOf(context.Context, ReadMemberOfArgs) (*string, error) + // [Preview API] + ReadMembers(context.Context, ReadMembersArgs) (*[]string, error) + // [Preview API] + ReadMembersOf(context.Context, ReadMembersOfArgs) (*[]string, error) + // [Preview API] + RemoveMember(context.Context, RemoveMemberArgs) (*bool, error) + UpdateIdentities(context.Context, UpdateIdentitiesArgs) (*[]IdentityUpdateData, error) + UpdateIdentity(context.Context, UpdateIdentityArgs) error + // [Preview API] + UpdateScope(context.Context, UpdateScopeArgs) error +} + +type ClientImpl struct { Client azuredevops.Client } -func NewClient(ctx context.Context, connection *azuredevops.Connection) (*Client, error) { +func NewClient(ctx context.Context, connection *azuredevops.Connection) (Client, error) { client, err := connection.GetClientByResourceAreaId(ctx, ResourceAreaId) if err != nil { return nil, err } - return &Client{ + return &ClientImpl{ Client: *client, }, nil } // [Preview API] -func (client *Client) CreateOrBindWithClaims(ctx context.Context, args CreateOrBindWithClaimsArgs) (*Identity, error) { +func (client *ClientImpl) AddMember(ctx context.Context, args AddMemberArgs) (*bool, error) { + routeValues := make(map[string]string) + if args.ContainerId == nil || *args.ContainerId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ContainerId"} + } + routeValues["containerId"] = *args.ContainerId + if args.MemberId == nil || *args.MemberId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.MemberId"} + } + routeValues["memberId"] = *args.MemberId + + locationId, _ := uuid.Parse("8ba35978-138e-41f8-8963-7b1ea2c5f775") + resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue bool + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the AddMember function +type AddMemberArgs struct { + // (required) + ContainerId *string + // (required) + MemberId *string +} + +func (client *ClientImpl) CreateGroups(ctx context.Context, args CreateGroupsArgs) (*[]Identity, error) { + if args.Container == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Container"} + } + body, marshalErr := json.Marshal(args.Container) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("5966283b-4196-4d57-9211-1b68f41ec1c2") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", nil, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []Identity + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateGroups function +type CreateGroupsArgs struct { + // (required) + Container interface{} +} + +func (client *ClientImpl) CreateIdentity(ctx context.Context, args CreateIdentityArgs) (*Identity, error) { + if args.FrameworkIdentityInfo == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.FrameworkIdentityInfo"} + } + body, marshalErr := json.Marshal(*args.FrameworkIdentityInfo) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("dd55f0eb-6ea2-4fe4-9ebe-919e7dd1dfb4") + resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", nil, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue Identity + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateIdentity function +type CreateIdentityArgs struct { + // (required) + FrameworkIdentityInfo *FrameworkIdentityInfo +} + +// [Preview API] +func (client *ClientImpl) CreateOrBindWithClaims(ctx context.Context, args CreateOrBindWithClaimsArgs) (*Identity, error) { if args.SourceIdentity == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.SourceIdentity"} } @@ -64,7 +199,86 @@ type CreateOrBindWithClaimsArgs struct { } // [Preview API] -func (client *Client) GetDescriptorById(ctx context.Context, args GetDescriptorByIdArgs) (*string, error) { +func (client *ClientImpl) CreateScope(ctx context.Context, args CreateScopeArgs) (*IdentityScope, error) { + if args.Info == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Info"} + } + routeValues := make(map[string]string) + if args.ScopeId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ScopeId"} + } + routeValues["scopeId"] = (*args.ScopeId).String() + + body, marshalErr := json.Marshal(*args.Info) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("4e11e2bf-1e79-4eb5-8f34-a6337bd0de38") + resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1-preview.2", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue IdentityScope + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateScope function +type CreateScopeArgs struct { + // (required) + Info *CreateScopeInfo + // (required) + ScopeId *uuid.UUID +} + +func (client *ClientImpl) DeleteGroup(ctx context.Context, args DeleteGroupArgs) error { + routeValues := make(map[string]string) + if args.GroupId == nil || *args.GroupId == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.GroupId"} + } + routeValues["groupId"] = *args.GroupId + + locationId, _ := uuid.Parse("5966283b-4196-4d57-9211-1b68f41ec1c2") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeleteGroup function +type DeleteGroupArgs struct { + // (required) + GroupId *string +} + +// [Preview API] +func (client *ClientImpl) DeleteScope(ctx context.Context, args DeleteScopeArgs) error { + routeValues := make(map[string]string) + if args.ScopeId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.ScopeId"} + } + routeValues["scopeId"] = (*args.ScopeId).String() + + locationId, _ := uuid.Parse("4e11e2bf-1e79-4eb5-8f34-a6337bd0de38") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.2", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeleteScope function +type DeleteScopeArgs struct { + // (required) + ScopeId *uuid.UUID +} + +// [Preview API] +func (client *ClientImpl) GetDescriptorById(ctx context.Context, args GetDescriptorByIdArgs) (*string, error) { routeValues := make(map[string]string) if args.Id == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Id"} @@ -94,91 +308,7 @@ type GetDescriptorByIdArgs struct { IsMasterId *bool } -func (client *Client) CreateGroups(ctx context.Context, args CreateGroupsArgs) (*[]Identity, error) { - if args.Container == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Container"} - } - body, marshalErr := json.Marshal(args.Container) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("5966283b-4196-4d57-9211-1b68f41ec1c2") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", nil, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []Identity - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateGroups function -type CreateGroupsArgs struct { - // (required) - Container interface{} -} - -func (client *Client) DeleteGroup(ctx context.Context, args DeleteGroupArgs) error { - routeValues := make(map[string]string) - if args.GroupId == nil || *args.GroupId == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.GroupId"} - } - routeValues["groupId"] = *args.GroupId - - locationId, _ := uuid.Parse("5966283b-4196-4d57-9211-1b68f41ec1c2") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeleteGroup function -type DeleteGroupArgs struct { - // (required) - GroupId *string -} - -func (client *Client) ListGroups(ctx context.Context, args ListGroupsArgs) (*[]Identity, error) { - queryParams := url.Values{} - if args.ScopeIds != nil { - queryParams.Add("scopeIds", *args.ScopeIds) - } - if args.Recurse != nil { - queryParams.Add("recurse", strconv.FormatBool(*args.Recurse)) - } - if args.Deleted != nil { - queryParams.Add("deleted", strconv.FormatBool(*args.Deleted)) - } - if args.Properties != nil { - queryParams.Add("properties", *args.Properties) - } - locationId, _ := uuid.Parse("5966283b-4196-4d57-9211-1b68f41ec1c2") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", nil, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []Identity - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the ListGroups function -type ListGroupsArgs struct { - // (optional) - ScopeIds *string - // (optional) - Recurse *bool - // (optional) - Deleted *bool - // (optional) - Properties *string -} - -func (client *Client) GetIdentityChanges(ctx context.Context, args GetIdentityChangesArgs) (*ChangedIdentities, error) { +func (client *ClientImpl) GetIdentityChanges(ctx context.Context, args GetIdentityChangesArgs) (*ChangedIdentities, error) { queryParams := url.Values{} if args.IdentitySequenceId == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "identitySequenceId"} @@ -222,7 +352,174 @@ type GetIdentityChangesArgs struct { ScopeId *uuid.UUID } -func (client *Client) GetUserIdentityIdsByDomainId(ctx context.Context, args GetUserIdentityIdsByDomainIdArgs) (*[]uuid.UUID, error) { +// [Preview API] +func (client *ClientImpl) GetIdentitySnapshot(ctx context.Context, args GetIdentitySnapshotArgs) (*IdentitySnapshot, error) { + routeValues := make(map[string]string) + if args.ScopeId == nil || *args.ScopeId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ScopeId"} + } + routeValues["scopeId"] = *args.ScopeId + + locationId, _ := uuid.Parse("d56223df-8ccd-45c9-89b4-eddf692400d7") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue IdentitySnapshot + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetIdentitySnapshot function +type GetIdentitySnapshotArgs struct { + // (required) + ScopeId *string +} + +// Read the max sequence id of all the identities. +func (client *ClientImpl) GetMaxSequenceId(ctx context.Context, args GetMaxSequenceIdArgs) (*uint64, error) { + locationId, _ := uuid.Parse("e4a70778-cb2c-4e85-b7cc-3f3c7ae2d408") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", nil, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue uint64 + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetMaxSequenceId function +type GetMaxSequenceIdArgs struct { +} + +// [Preview API] +func (client *ClientImpl) GetScopeById(ctx context.Context, args GetScopeByIdArgs) (*IdentityScope, error) { + routeValues := make(map[string]string) + if args.ScopeId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ScopeId"} + } + routeValues["scopeId"] = (*args.ScopeId).String() + + locationId, _ := uuid.Parse("4e11e2bf-1e79-4eb5-8f34-a6337bd0de38") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.2", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue IdentityScope + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetScopeById function +type GetScopeByIdArgs struct { + // (required) + ScopeId *uuid.UUID +} + +// [Preview API] +func (client *ClientImpl) GetScopeByName(ctx context.Context, args GetScopeByNameArgs) (*IdentityScope, error) { + queryParams := url.Values{} + if args.ScopeName == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "scopeName"} + } + queryParams.Add("scopeName", *args.ScopeName) + locationId, _ := uuid.Parse("4e11e2bf-1e79-4eb5-8f34-a6337bd0de38") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.2", nil, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue IdentityScope + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetScopeByName function +type GetScopeByNameArgs struct { + // (required) + ScopeName *string +} + +// Read identity of the home tenant request user. +func (client *ClientImpl) GetSelf(ctx context.Context, args GetSelfArgs) (*IdentitySelf, error) { + locationId, _ := uuid.Parse("4bb02b5b-c120-4be2-b68e-21f7c50a4b82") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", nil, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue IdentitySelf + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetSelf function +type GetSelfArgs struct { +} + +// [Preview API] +func (client *ClientImpl) GetSignedInToken(ctx context.Context, args GetSignedInTokenArgs) (*delegatedauthorization.AccessTokenResult, error) { + locationId, _ := uuid.Parse("6074ff18-aaad-4abb-a41e-5c75f6178057") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", nil, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue delegatedauthorization.AccessTokenResult + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetSignedInToken function +type GetSignedInTokenArgs struct { +} + +// [Preview API] +func (client *ClientImpl) GetSignoutToken(ctx context.Context, args GetSignoutTokenArgs) (*delegatedauthorization.AccessTokenResult, error) { + locationId, _ := uuid.Parse("be39e83c-7529-45e9-9c67-0410885880da") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", nil, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue delegatedauthorization.AccessTokenResult + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetSignoutToken function +type GetSignoutTokenArgs struct { +} + +// [Preview API] +func (client *ClientImpl) GetTenant(ctx context.Context, args GetTenantArgs) (*TenantInfo, error) { + routeValues := make(map[string]string) + if args.TenantId == nil || *args.TenantId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.TenantId"} + } + routeValues["tenantId"] = *args.TenantId + + locationId, _ := uuid.Parse("5f0a1723-2e2c-4c31-8cae-002d01bdd592") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue TenantInfo + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetTenant function +type GetTenantArgs struct { + // (required) + TenantId *string +} + +func (client *ClientImpl) GetUserIdentityIdsByDomainId(ctx context.Context, args GetUserIdentityIdsByDomainIdArgs) (*[]uuid.UUID, error) { queryParams := url.Values{} if args.DomainId == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "domainId"} @@ -245,7 +542,44 @@ type GetUserIdentityIdsByDomainIdArgs struct { DomainId *uuid.UUID } -func (client *Client) ReadIdentities(ctx context.Context, args ReadIdentitiesArgs) (*[]Identity, error) { +func (client *ClientImpl) ListGroups(ctx context.Context, args ListGroupsArgs) (*[]Identity, error) { + queryParams := url.Values{} + if args.ScopeIds != nil { + queryParams.Add("scopeIds", *args.ScopeIds) + } + if args.Recurse != nil { + queryParams.Add("recurse", strconv.FormatBool(*args.Recurse)) + } + if args.Deleted != nil { + queryParams.Add("deleted", strconv.FormatBool(*args.Deleted)) + } + if args.Properties != nil { + queryParams.Add("properties", *args.Properties) + } + locationId, _ := uuid.Parse("5966283b-4196-4d57-9211-1b68f41ec1c2") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", nil, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []Identity + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the ListGroups function +type ListGroupsArgs struct { + // (optional) + ScopeIds *string + // (optional) + Recurse *bool + // (optional) + Deleted *bool + // (optional) + Properties *string +} + +func (client *ClientImpl) ReadIdentities(ctx context.Context, args ReadIdentitiesArgs) (*[]Identity, error) { queryParams := url.Values{} if args.Descriptors != nil { queryParams.Add("descriptors", *args.Descriptors) @@ -312,7 +646,7 @@ type ReadIdentitiesArgs struct { Options *ReadIdentitiesOptions } -func (client *Client) ReadIdentitiesByScope(ctx context.Context, args ReadIdentitiesByScopeArgs) (*[]Identity, error) { +func (client *ClientImpl) ReadIdentitiesByScope(ctx context.Context, args ReadIdentitiesByScopeArgs) (*[]Identity, error) { queryParams := url.Values{} if args.ScopeId == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "scopeId"} @@ -345,7 +679,7 @@ type ReadIdentitiesByScopeArgs struct { Properties *string } -func (client *Client) ReadIdentity(ctx context.Context, args ReadIdentityArgs) (*Identity, error) { +func (client *ClientImpl) ReadIdentity(ctx context.Context, args ReadIdentityArgs) (*Identity, error) { routeValues := make(map[string]string) if args.IdentityId == nil || *args.IdentityId == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.IdentityId"} @@ -380,89 +714,8 @@ type ReadIdentityArgs struct { Properties *string } -func (client *Client) UpdateIdentities(ctx context.Context, args UpdateIdentitiesArgs) (*[]IdentityUpdateData, error) { - if args.Identities == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Identities"} - } - body, marshalErr := json.Marshal(*args.Identities) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("28010c54-d0c0-4c89-a5b0-1c9e188b9fb7") - resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", nil, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []IdentityUpdateData - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdateIdentities function -type UpdateIdentitiesArgs struct { - // (required) - Identities *azuredevops.VssJsonCollectionWrapper -} - -func (client *Client) UpdateIdentity(ctx context.Context, args UpdateIdentityArgs) error { - if args.Identity == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.Identity"} - } - routeValues := make(map[string]string) - if args.IdentityId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.IdentityId"} - } - routeValues["identityId"] = (*args.IdentityId).String() - - body, marshalErr := json.Marshal(*args.Identity) - if marshalErr != nil { - return marshalErr - } - locationId, _ := uuid.Parse("28010c54-d0c0-4c89-a5b0-1c9e188b9fb7") - _, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the UpdateIdentity function -type UpdateIdentityArgs struct { - // (required) - Identity *Identity - // (required) - IdentityId *uuid.UUID -} - -func (client *Client) CreateIdentity(ctx context.Context, args CreateIdentityArgs) (*Identity, error) { - if args.FrameworkIdentityInfo == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.FrameworkIdentityInfo"} - } - body, marshalErr := json.Marshal(*args.FrameworkIdentityInfo) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("dd55f0eb-6ea2-4fe4-9ebe-919e7dd1dfb4") - resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", nil, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue Identity - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateIdentity function -type CreateIdentityArgs struct { - // (required) - FrameworkIdentityInfo *FrameworkIdentityInfo -} - // [Preview API] -func (client *Client) ReadIdentityBatch(ctx context.Context, args ReadIdentityBatchArgs) (*[]Identity, error) { +func (client *ClientImpl) ReadIdentityBatch(ctx context.Context, args ReadIdentityBatchArgs) (*[]Identity, error) { if args.BatchInfo == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.BatchInfo"} } @@ -488,97 +741,7 @@ type ReadIdentityBatchArgs struct { } // [Preview API] -func (client *Client) GetIdentitySnapshot(ctx context.Context, args GetIdentitySnapshotArgs) (*IdentitySnapshot, error) { - routeValues := make(map[string]string) - if args.ScopeId == nil || *args.ScopeId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ScopeId"} - } - routeValues["scopeId"] = *args.ScopeId - - locationId, _ := uuid.Parse("d56223df-8ccd-45c9-89b4-eddf692400d7") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue IdentitySnapshot - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetIdentitySnapshot function -type GetIdentitySnapshotArgs struct { - // (required) - ScopeId *string -} - -// Read the max sequence id of all the identities. -func (client *Client) GetMaxSequenceId(ctx context.Context, args GetMaxSequenceIdArgs) (*uint64, error) { - locationId, _ := uuid.Parse("e4a70778-cb2c-4e85-b7cc-3f3c7ae2d408") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", nil, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue uint64 - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetMaxSequenceId function -type GetMaxSequenceIdArgs struct { -} - -// Read identity of the home tenant request user. -func (client *Client) GetSelf(ctx context.Context, args GetSelfArgs) (*IdentitySelf, error) { - locationId, _ := uuid.Parse("4bb02b5b-c120-4be2-b68e-21f7c50a4b82") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", nil, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue IdentitySelf - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetSelf function -type GetSelfArgs struct { -} - -// [Preview API] -func (client *Client) AddMember(ctx context.Context, args AddMemberArgs) (*bool, error) { - routeValues := make(map[string]string) - if args.ContainerId == nil || *args.ContainerId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ContainerId"} - } - routeValues["containerId"] = *args.ContainerId - if args.MemberId == nil || *args.MemberId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.MemberId"} - } - routeValues["memberId"] = *args.MemberId - - locationId, _ := uuid.Parse("8ba35978-138e-41f8-8963-7b1ea2c5f775") - resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue bool - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the AddMember function -type AddMemberArgs struct { - // (required) - ContainerId *string - // (required) - MemberId *string -} - -// [Preview API] -func (client *Client) ReadMember(ctx context.Context, args ReadMemberArgs) (*string, error) { +func (client *ClientImpl) ReadMember(ctx context.Context, args ReadMemberArgs) (*string, error) { routeValues := make(map[string]string) if args.ContainerId == nil || *args.ContainerId == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ContainerId"} @@ -615,69 +778,7 @@ type ReadMemberArgs struct { } // [Preview API] -func (client *Client) ReadMembers(ctx context.Context, args ReadMembersArgs) (*[]string, error) { - routeValues := make(map[string]string) - if args.ContainerId == nil || *args.ContainerId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ContainerId"} - } - routeValues["containerId"] = *args.ContainerId - - queryParams := url.Values{} - if args.QueryMembership != nil { - queryParams.Add("queryMembership", string(*args.QueryMembership)) - } - locationId, _ := uuid.Parse("8ba35978-138e-41f8-8963-7b1ea2c5f775") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []string - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the ReadMembers function -type ReadMembersArgs struct { - // (required) - ContainerId *string - // (optional) - QueryMembership *QueryMembership -} - -// [Preview API] -func (client *Client) RemoveMember(ctx context.Context, args RemoveMemberArgs) (*bool, error) { - routeValues := make(map[string]string) - if args.ContainerId == nil || *args.ContainerId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ContainerId"} - } - routeValues["containerId"] = *args.ContainerId - if args.MemberId == nil || *args.MemberId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.MemberId"} - } - routeValues["memberId"] = *args.MemberId - - locationId, _ := uuid.Parse("8ba35978-138e-41f8-8963-7b1ea2c5f775") - resp, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue bool - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the RemoveMember function -type RemoveMemberArgs struct { - // (required) - ContainerId *string - // (required) - MemberId *string -} - -// [Preview API] -func (client *Client) ReadMemberOf(ctx context.Context, args ReadMemberOfArgs) (*string, error) { +func (client *ClientImpl) ReadMemberOf(ctx context.Context, args ReadMemberOfArgs) (*string, error) { routeValues := make(map[string]string) if args.MemberId == nil || *args.MemberId == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.MemberId"} @@ -714,7 +815,38 @@ type ReadMemberOfArgs struct { } // [Preview API] -func (client *Client) ReadMembersOf(ctx context.Context, args ReadMembersOfArgs) (*[]string, error) { +func (client *ClientImpl) ReadMembers(ctx context.Context, args ReadMembersArgs) (*[]string, error) { + routeValues := make(map[string]string) + if args.ContainerId == nil || *args.ContainerId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ContainerId"} + } + routeValues["containerId"] = *args.ContainerId + + queryParams := url.Values{} + if args.QueryMembership != nil { + queryParams.Add("queryMembership", string(*args.QueryMembership)) + } + locationId, _ := uuid.Parse("8ba35978-138e-41f8-8963-7b1ea2c5f775") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []string + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the ReadMembers function +type ReadMembersArgs struct { + // (required) + ContainerId *string + // (optional) + QueryMembership *QueryMembership +} + +// [Preview API] +func (client *ClientImpl) ReadMembersOf(ctx context.Context, args ReadMembersOfArgs) (*[]string, error) { routeValues := make(map[string]string) if args.MemberId == nil || *args.MemberId == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.MemberId"} @@ -745,49 +877,77 @@ type ReadMembersOfArgs struct { } // [Preview API] -func (client *Client) CreateScope(ctx context.Context, args CreateScopeArgs) (*IdentityScope, error) { - if args.Info == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Info"} - } +func (client *ClientImpl) RemoveMember(ctx context.Context, args RemoveMemberArgs) (*bool, error) { routeValues := make(map[string]string) - if args.ScopeId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ScopeId"} + if args.ContainerId == nil || *args.ContainerId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.ContainerId"} } - routeValues["scopeId"] = (*args.ScopeId).String() + routeValues["containerId"] = *args.ContainerId + if args.MemberId == nil || *args.MemberId == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.MemberId"} + } + routeValues["memberId"] = *args.MemberId - body, marshalErr := json.Marshal(*args.Info) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("4e11e2bf-1e79-4eb5-8f34-a6337bd0de38") - resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1-preview.2", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + locationId, _ := uuid.Parse("8ba35978-138e-41f8-8963-7b1ea2c5f775") + resp, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue IdentityScope + var responseValue bool err = client.Client.UnmarshalBody(resp, &responseValue) return &responseValue, err } -// Arguments for the CreateScope function -type CreateScopeArgs struct { +// Arguments for the RemoveMember function +type RemoveMemberArgs struct { // (required) - Info *CreateScopeInfo + ContainerId *string // (required) - ScopeId *uuid.UUID + MemberId *string } -// [Preview API] -func (client *Client) DeleteScope(ctx context.Context, args DeleteScopeArgs) error { - routeValues := make(map[string]string) - if args.ScopeId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.ScopeId"} +func (client *ClientImpl) UpdateIdentities(ctx context.Context, args UpdateIdentitiesArgs) (*[]IdentityUpdateData, error) { + if args.Identities == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Identities"} + } + body, marshalErr := json.Marshal(*args.Identities) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("28010c54-d0c0-4c89-a5b0-1c9e188b9fb7") + resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", nil, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err } - routeValues["scopeId"] = (*args.ScopeId).String() - locationId, _ := uuid.Parse("4e11e2bf-1e79-4eb5-8f34-a6337bd0de38") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.2", routeValues, nil, nil, "", "application/json", nil) + var responseValue []IdentityUpdateData + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateIdentities function +type UpdateIdentitiesArgs struct { + // (required) + Identities *azuredevops.VssJsonCollectionWrapper +} + +func (client *ClientImpl) UpdateIdentity(ctx context.Context, args UpdateIdentityArgs) error { + if args.Identity == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.Identity"} + } + routeValues := make(map[string]string) + if args.IdentityId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.IdentityId"} + } + routeValues["identityId"] = (*args.IdentityId).String() + + body, marshalErr := json.Marshal(*args.Identity) + if marshalErr != nil { + return marshalErr + } + locationId, _ := uuid.Parse("28010c54-d0c0-4c89-a5b0-1c9e188b9fb7") + _, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) if err != nil { return err } @@ -795,63 +955,16 @@ func (client *Client) DeleteScope(ctx context.Context, args DeleteScopeArgs) err return nil } -// Arguments for the DeleteScope function -type DeleteScopeArgs struct { +// Arguments for the UpdateIdentity function +type UpdateIdentityArgs struct { // (required) - ScopeId *uuid.UUID + Identity *Identity + // (required) + IdentityId *uuid.UUID } // [Preview API] -func (client *Client) GetScopeById(ctx context.Context, args GetScopeByIdArgs) (*IdentityScope, error) { - routeValues := make(map[string]string) - if args.ScopeId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ScopeId"} - } - routeValues["scopeId"] = (*args.ScopeId).String() - - locationId, _ := uuid.Parse("4e11e2bf-1e79-4eb5-8f34-a6337bd0de38") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.2", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue IdentityScope - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetScopeById function -type GetScopeByIdArgs struct { - // (required) - ScopeId *uuid.UUID -} - -// [Preview API] -func (client *Client) GetScopeByName(ctx context.Context, args GetScopeByNameArgs) (*IdentityScope, error) { - queryParams := url.Values{} - if args.ScopeName == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "scopeName"} - } - queryParams.Add("scopeName", *args.ScopeName) - locationId, _ := uuid.Parse("4e11e2bf-1e79-4eb5-8f34-a6337bd0de38") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.2", nil, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue IdentityScope - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetScopeByName function -type GetScopeByNameArgs struct { - // (required) - ScopeName *string -} - -// [Preview API] -func (client *Client) UpdateScope(ctx context.Context, args UpdateScopeArgs) error { +func (client *ClientImpl) UpdateScope(ctx context.Context, args UpdateScopeArgs) error { if args.PatchDocument == nil { return &azuredevops.ArgumentNilError{ArgumentName: "args.PatchDocument"} } @@ -881,62 +994,3 @@ type UpdateScopeArgs struct { // (required) ScopeId *uuid.UUID } - -// [Preview API] -func (client *Client) GetSignedInToken(ctx context.Context, args GetSignedInTokenArgs) (*delegatedauthorization.AccessTokenResult, error) { - locationId, _ := uuid.Parse("6074ff18-aaad-4abb-a41e-5c75f6178057") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", nil, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue delegatedauthorization.AccessTokenResult - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetSignedInToken function -type GetSignedInTokenArgs struct { -} - -// [Preview API] -func (client *Client) GetSignoutToken(ctx context.Context, args GetSignoutTokenArgs) (*delegatedauthorization.AccessTokenResult, error) { - locationId, _ := uuid.Parse("be39e83c-7529-45e9-9c67-0410885880da") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", nil, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue delegatedauthorization.AccessTokenResult - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetSignoutToken function -type GetSignoutTokenArgs struct { -} - -// [Preview API] -func (client *Client) GetTenant(ctx context.Context, args GetTenantArgs) (*TenantInfo, error) { - routeValues := make(map[string]string) - if args.TenantId == nil || *args.TenantId == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.TenantId"} - } - routeValues["tenantId"] = *args.TenantId - - locationId, _ := uuid.Parse("5f0a1723-2e2c-4c31-8cae-002d01bdd592") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue TenantInfo - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetTenant function -type GetTenantArgs struct { - // (required) - TenantId *string -} diff --git a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/operations/client.go b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/operations/client.go index 20361d4a..f6939dc8 100644 --- a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/operations/client.go +++ b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/operations/client.go @@ -16,19 +16,24 @@ import ( "net/url" ) -type Client struct { +type Client interface { + // Gets an operation from the the operationId using the given pluginId. + GetOperation(context.Context, GetOperationArgs) (*Operation, error) +} + +type ClientImpl struct { Client azuredevops.Client } -func NewClient(ctx context.Context, connection *azuredevops.Connection) *Client { +func NewClient(ctx context.Context, connection *azuredevops.Connection) Client { client := connection.GetClientByUrl(connection.BaseUrl) - return &Client{ + return &ClientImpl{ Client: *client, } } // Gets an operation from the the operationId using the given pluginId. -func (client *Client) GetOperation(ctx context.Context, args GetOperationArgs) (*Operation, error) { +func (client *ClientImpl) GetOperation(ctx context.Context, args GetOperationArgs) (*Operation, error) { routeValues := make(map[string]string) if args.OperationId == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.OperationId"} diff --git a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/policy/client.go b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/policy/client.go index 5a22ec01..985639fa 100644 --- a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/policy/client.go +++ b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/policy/client.go @@ -21,22 +21,49 @@ import ( var ResourceAreaId, _ = uuid.Parse("fb13a388-40dd-4a04-b530-013a739c72ef") -type Client struct { +type Client interface { + // Create a policy configuration of a given policy type. + CreatePolicyConfiguration(context.Context, CreatePolicyConfigurationArgs) (*PolicyConfiguration, error) + // Delete a policy configuration by its ID. + DeletePolicyConfiguration(context.Context, DeletePolicyConfigurationArgs) error + // Get a policy configuration by its ID. + GetPolicyConfiguration(context.Context, GetPolicyConfigurationArgs) (*PolicyConfiguration, error) + // Retrieve a specific revision of a given policy by ID. + GetPolicyConfigurationRevision(context.Context, GetPolicyConfigurationRevisionArgs) (*PolicyConfiguration, error) + // Retrieve all revisions for a given policy. + GetPolicyConfigurationRevisions(context.Context, GetPolicyConfigurationRevisionsArgs) (*[]PolicyConfiguration, error) + // Get a list of policy configurations in a project. + GetPolicyConfigurations(context.Context, GetPolicyConfigurationsArgs) (*GetPolicyConfigurationsResponseValue, error) + // [Preview API] Gets the present evaluation state of a policy. + GetPolicyEvaluation(context.Context, GetPolicyEvaluationArgs) (*PolicyEvaluationRecord, error) + // [Preview API] Retrieves a list of all the policy evaluation statuses for a specific pull request. + GetPolicyEvaluations(context.Context, GetPolicyEvaluationsArgs) (*[]PolicyEvaluationRecord, error) + // Retrieve a specific policy type by ID. + GetPolicyType(context.Context, GetPolicyTypeArgs) (*PolicyType, error) + // Retrieve all available policy types. + GetPolicyTypes(context.Context, GetPolicyTypesArgs) (*[]PolicyType, error) + // [Preview API] Requeue the policy evaluation. + RequeuePolicyEvaluation(context.Context, RequeuePolicyEvaluationArgs) (*PolicyEvaluationRecord, error) + // Update a policy configuration by its ID. + UpdatePolicyConfiguration(context.Context, UpdatePolicyConfigurationArgs) (*PolicyConfiguration, error) +} + +type ClientImpl struct { Client azuredevops.Client } -func NewClient(ctx context.Context, connection *azuredevops.Connection) (*Client, error) { +func NewClient(ctx context.Context, connection *azuredevops.Connection) (Client, error) { client, err := connection.GetClientByResourceAreaId(ctx, ResourceAreaId) if err != nil { return nil, err } - return &Client{ + return &ClientImpl{ Client: *client, }, nil } // Create a policy configuration of a given policy type. -func (client *Client) CreatePolicyConfiguration(ctx context.Context, args CreatePolicyConfigurationArgs) (*PolicyConfiguration, error) { +func (client *ClientImpl) CreatePolicyConfiguration(ctx context.Context, args CreatePolicyConfigurationArgs) (*PolicyConfiguration, error) { if args.Configuration == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Configuration"} } @@ -75,7 +102,7 @@ type CreatePolicyConfigurationArgs struct { } // Delete a policy configuration by its ID. -func (client *Client) DeletePolicyConfiguration(ctx context.Context, args DeletePolicyConfigurationArgs) error { +func (client *ClientImpl) DeletePolicyConfiguration(ctx context.Context, args DeletePolicyConfigurationArgs) error { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -104,7 +131,7 @@ type DeletePolicyConfigurationArgs struct { } // Get a policy configuration by its ID. -func (client *Client) GetPolicyConfiguration(ctx context.Context, args GetPolicyConfigurationArgs) (*PolicyConfiguration, error) { +func (client *ClientImpl) GetPolicyConfiguration(ctx context.Context, args GetPolicyConfigurationArgs) (*PolicyConfiguration, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -134,8 +161,87 @@ type GetPolicyConfigurationArgs struct { ConfigurationId *int } +// Retrieve a specific revision of a given policy by ID. +func (client *ClientImpl) GetPolicyConfigurationRevision(ctx context.Context, args GetPolicyConfigurationRevisionArgs) (*PolicyConfiguration, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.ConfigurationId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ConfigurationId"} + } + routeValues["configurationId"] = strconv.Itoa(*args.ConfigurationId) + if args.RevisionId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RevisionId"} + } + routeValues["revisionId"] = strconv.Itoa(*args.RevisionId) + + locationId, _ := uuid.Parse("fe1e68a2-60d3-43cb-855b-85e41ae97c95") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue PolicyConfiguration + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetPolicyConfigurationRevision function +type GetPolicyConfigurationRevisionArgs struct { + // (required) Project ID or project name + Project *string + // (required) The policy configuration ID. + ConfigurationId *int + // (required) The revision ID. + RevisionId *int +} + +// Retrieve all revisions for a given policy. +func (client *ClientImpl) GetPolicyConfigurationRevisions(ctx context.Context, args GetPolicyConfigurationRevisionsArgs) (*[]PolicyConfiguration, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.ConfigurationId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ConfigurationId"} + } + routeValues["configurationId"] = strconv.Itoa(*args.ConfigurationId) + + queryParams := url.Values{} + if args.Top != nil { + queryParams.Add("$top", strconv.Itoa(*args.Top)) + } + if args.Skip != nil { + queryParams.Add("$skip", strconv.Itoa(*args.Skip)) + } + locationId, _ := uuid.Parse("fe1e68a2-60d3-43cb-855b-85e41ae97c95") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []PolicyConfiguration + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetPolicyConfigurationRevisions function +type GetPolicyConfigurationRevisionsArgs struct { + // (required) Project ID or project name + Project *string + // (required) The policy configuration ID. + ConfigurationId *int + // (optional) The number of revisions to retrieve. + Top *int + // (optional) The number of revisions to ignore. For example, to retrieve results 101-150, set top to 50 and skip to 100. + Skip *int +} + // Get a list of policy configurations in a project. -func (client *Client) GetPolicyConfigurations(ctx context.Context, args GetPolicyConfigurationsArgs) (*GetPolicyConfigurationsResponseValue, error) { +func (client *ClientImpl) GetPolicyConfigurations(ctx context.Context, args GetPolicyConfigurationsArgs) (*GetPolicyConfigurationsResponseValue, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -146,6 +252,12 @@ func (client *Client) GetPolicyConfigurations(ctx context.Context, args GetPolic if args.Scope != nil { queryParams.Add("scope", *args.Scope) } + if args.Top != nil { + queryParams.Add("$top", strconv.Itoa(*args.Top)) + } + if args.ContinuationToken != nil { + queryParams.Add("continuationToken", *args.ContinuationToken) + } if args.PolicyType != nil { queryParams.Add("policyType", (*args.PolicyType).String()) } @@ -167,6 +279,10 @@ type GetPolicyConfigurationsArgs struct { Project *string // (optional) [Provided for legacy reasons] The scope on which a subset of policies is defined. Scope *string + // (optional) Maximum number of policies to return. + Top *int + // (optional) The continuation token used for pagination. + ContinuationToken *string // (optional) Filter returned policies to only this type PolicyType *uuid.UUID } @@ -178,48 +294,8 @@ type GetPolicyConfigurationsResponseValue struct { ContinuationToken string } -// Update a policy configuration by its ID. -func (client *Client) UpdatePolicyConfiguration(ctx context.Context, args UpdatePolicyConfigurationArgs) (*PolicyConfiguration, error) { - if args.Configuration == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Configuration"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.ConfigurationId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ConfigurationId"} - } - routeValues["configurationId"] = strconv.Itoa(*args.ConfigurationId) - - body, marshalErr := json.Marshal(*args.Configuration) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("dad91cbe-d183-45f8-9c6e-9c1164472121") - resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue PolicyConfiguration - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdatePolicyConfiguration function -type UpdatePolicyConfigurationArgs struct { - // (required) The policy configuration to update. - Configuration *PolicyConfiguration - // (required) Project ID or project name - Project *string - // (required) ID of the existing policy configuration to be updated. - ConfigurationId *int -} - // [Preview API] Gets the present evaluation state of a policy. -func (client *Client) GetPolicyEvaluation(ctx context.Context, args GetPolicyEvaluationArgs) (*PolicyEvaluationRecord, error) { +func (client *ClientImpl) GetPolicyEvaluation(ctx context.Context, args GetPolicyEvaluationArgs) (*PolicyEvaluationRecord, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -249,39 +325,8 @@ type GetPolicyEvaluationArgs struct { EvaluationId *uuid.UUID } -// [Preview API] Requeue the policy evaluation. -func (client *Client) RequeuePolicyEvaluation(ctx context.Context, args RequeuePolicyEvaluationArgs) (*PolicyEvaluationRecord, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.EvaluationId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.EvaluationId"} - } - routeValues["evaluationId"] = (*args.EvaluationId).String() - - locationId, _ := uuid.Parse("46aecb7a-5d2c-4647-897b-0209505a9fe4") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue PolicyEvaluationRecord - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the RequeuePolicyEvaluation function -type RequeuePolicyEvaluationArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the policy evaluation to be retrieved. - EvaluationId *uuid.UUID -} - // [Preview API] Retrieves a list of all the policy evaluation statuses for a specific pull request. -func (client *Client) GetPolicyEvaluations(ctx context.Context, args GetPolicyEvaluationsArgs) (*[]PolicyEvaluationRecord, error) { +func (client *ClientImpl) GetPolicyEvaluations(ctx context.Context, args GetPolicyEvaluationsArgs) (*[]PolicyEvaluationRecord, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -327,87 +372,8 @@ type GetPolicyEvaluationsArgs struct { Skip *int } -// Retrieve a specific revision of a given policy by ID. -func (client *Client) GetPolicyConfigurationRevision(ctx context.Context, args GetPolicyConfigurationRevisionArgs) (*PolicyConfiguration, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.ConfigurationId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ConfigurationId"} - } - routeValues["configurationId"] = strconv.Itoa(*args.ConfigurationId) - if args.RevisionId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RevisionId"} - } - routeValues["revisionId"] = strconv.Itoa(*args.RevisionId) - - locationId, _ := uuid.Parse("fe1e68a2-60d3-43cb-855b-85e41ae97c95") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue PolicyConfiguration - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPolicyConfigurationRevision function -type GetPolicyConfigurationRevisionArgs struct { - // (required) Project ID or project name - Project *string - // (required) The policy configuration ID. - ConfigurationId *int - // (required) The revision ID. - RevisionId *int -} - -// Retrieve all revisions for a given policy. -func (client *Client) GetPolicyConfigurationRevisions(ctx context.Context, args GetPolicyConfigurationRevisionsArgs) (*[]PolicyConfiguration, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.ConfigurationId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ConfigurationId"} - } - routeValues["configurationId"] = strconv.Itoa(*args.ConfigurationId) - - queryParams := url.Values{} - if args.Top != nil { - queryParams.Add("$top", strconv.Itoa(*args.Top)) - } - if args.Skip != nil { - queryParams.Add("$skip", strconv.Itoa(*args.Skip)) - } - locationId, _ := uuid.Parse("fe1e68a2-60d3-43cb-855b-85e41ae97c95") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []PolicyConfiguration - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetPolicyConfigurationRevisions function -type GetPolicyConfigurationRevisionsArgs struct { - // (required) Project ID or project name - Project *string - // (required) The policy configuration ID. - ConfigurationId *int - // (optional) The number of revisions to retrieve. - Top *int - // (optional) The number of revisions to ignore. For example, to retrieve results 101-150, set top to 50 and skip to 100. - Skip *int -} - // Retrieve a specific policy type by ID. -func (client *Client) GetPolicyType(ctx context.Context, args GetPolicyTypeArgs) (*PolicyType, error) { +func (client *ClientImpl) GetPolicyType(ctx context.Context, args GetPolicyTypeArgs) (*PolicyType, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -438,7 +404,7 @@ type GetPolicyTypeArgs struct { } // Retrieve all available policy types. -func (client *Client) GetPolicyTypes(ctx context.Context, args GetPolicyTypesArgs) (*[]PolicyType, error) { +func (client *ClientImpl) GetPolicyTypes(ctx context.Context, args GetPolicyTypesArgs) (*[]PolicyType, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -461,3 +427,74 @@ type GetPolicyTypesArgs struct { // (required) Project ID or project name Project *string } + +// [Preview API] Requeue the policy evaluation. +func (client *ClientImpl) RequeuePolicyEvaluation(ctx context.Context, args RequeuePolicyEvaluationArgs) (*PolicyEvaluationRecord, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.EvaluationId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.EvaluationId"} + } + routeValues["evaluationId"] = (*args.EvaluationId).String() + + locationId, _ := uuid.Parse("46aecb7a-5d2c-4647-897b-0209505a9fe4") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue PolicyEvaluationRecord + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the RequeuePolicyEvaluation function +type RequeuePolicyEvaluationArgs struct { + // (required) Project ID or project name + Project *string + // (required) ID of the policy evaluation to be retrieved. + EvaluationId *uuid.UUID +} + +// Update a policy configuration by its ID. +func (client *ClientImpl) UpdatePolicyConfiguration(ctx context.Context, args UpdatePolicyConfigurationArgs) (*PolicyConfiguration, error) { + if args.Configuration == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Configuration"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.ConfigurationId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.ConfigurationId"} + } + routeValues["configurationId"] = strconv.Itoa(*args.ConfigurationId) + + body, marshalErr := json.Marshal(*args.Configuration) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("dad91cbe-d183-45f8-9c6e-9c1164472121") + resp, err := client.Client.Send(ctx, http.MethodPut, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue PolicyConfiguration + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdatePolicyConfiguration function +type UpdatePolicyConfigurationArgs struct { + // (required) The policy configuration to update. + Configuration *PolicyConfiguration + // (required) Project ID or project name + Project *string + // (required) ID of the existing policy configuration to be updated. + ConfigurationId *int +} diff --git a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/test/client.go b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/test/client.go index 9e9c0087..80a0d68e 100644 --- a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/test/client.go +++ b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/test/client.go @@ -23,22 +23,162 @@ import ( var ResourceAreaId, _ = uuid.Parse("c2aa639c-3ccc-4740-b3b6-ce2a1e1d984e") -type Client struct { +type Client interface { + // Add test cases to suite. + AddTestCasesToSuite(context.Context, AddTestCasesToSuiteArgs) (*[]SuiteTestCase, error) + // Add test results to a test run. + AddTestResultsToTestRun(context.Context, AddTestResultsToTestRunArgs) (*[]TestCaseResult, error) + // [Preview API] Attach a file to a test result. + CreateTestResultAttachment(context.Context, CreateTestResultAttachmentArgs) (*TestAttachmentReference, error) + // Create new test run. + CreateTestRun(context.Context, CreateTestRunArgs) (*TestRun, error) + // [Preview API] Attach a file to a test run. + CreateTestRunAttachment(context.Context, CreateTestRunAttachmentArgs) (*TestAttachmentReference, error) + // [Preview API] Create a test session + CreateTestSession(context.Context, CreateTestSessionArgs) (*TestSession, error) + // [Preview API] Attach a file to a test result + CreateTestSubResultAttachment(context.Context, CreateTestSubResultAttachmentArgs) (*TestAttachmentReference, error) + // [Preview API] Delete a test case. + DeleteTestCase(context.Context, DeleteTestCaseArgs) error + // Delete a test run by its ID. + DeleteTestRun(context.Context, DeleteTestRunArgs) error + // Gets the action results for an iteration in a test result. + GetActionResults(context.Context, GetActionResultsArgs) (*[]TestActionResultModel, error) + // [Preview API] Get code coverage data for a build. + GetBuildCodeCoverage(context.Context, GetBuildCodeCoverageArgs) (*[]BuildCoverage, error) + // Get a test point. + GetPoint(context.Context, GetPointArgs) (*TestPoint, error) + // Get a list of test points. + GetPoints(context.Context, GetPointsArgs) (*[]TestPoint, error) + // [Preview API] Get test points using query. + GetPointsByQuery(context.Context, GetPointsByQueryArgs) (*TestPointsQuery, error) + // Get a list of parameterized results + GetResultParameters(context.Context, GetResultParametersArgs) (*[]TestResultParameterModel, error) + // [Preview API] Get test result retention settings + GetResultRetentionSettings(context.Context, GetResultRetentionSettingsArgs) (*ResultRetentionSettings, error) + // Get a specific test case in a test suite with test case id. + GetTestCaseById(context.Context, GetTestCaseByIdArgs) (*SuiteTestCase, error) + // Get all test cases in a suite. + GetTestCases(context.Context, GetTestCasesArgs) (*[]SuiteTestCase, error) + // Get iteration for a result + GetTestIteration(context.Context, GetTestIterationArgs) (*TestIterationDetailsModel, error) + // Get iterations for a result + GetTestIterations(context.Context, GetTestIterationsArgs) (*[]TestIterationDetailsModel, error) + // [Preview API] Download a test result attachment by its ID. + GetTestResultAttachmentContent(context.Context, GetTestResultAttachmentContentArgs) (io.ReadCloser, error) + // [Preview API] Get list of test result attachments reference. + GetTestResultAttachments(context.Context, GetTestResultAttachmentsArgs) (*[]TestAttachment, error) + // [Preview API] Download a test result attachment by its ID. + GetTestResultAttachmentZip(context.Context, GetTestResultAttachmentZipArgs) (io.ReadCloser, error) + // Get a test result for a test run. + GetTestResultById(context.Context, GetTestResultByIdArgs) (*TestCaseResult, error) + // Get test results for a test run. + GetTestResults(context.Context, GetTestResultsArgs) (*[]TestCaseResult, error) + // [Preview API] Download a test run attachment by its ID. + GetTestRunAttachmentContent(context.Context, GetTestRunAttachmentContentArgs) (io.ReadCloser, error) + // [Preview API] Get list of test run attachments reference. + GetTestRunAttachments(context.Context, GetTestRunAttachmentsArgs) (*[]TestAttachment, error) + // [Preview API] Download a test run attachment by its ID. + GetTestRunAttachmentZip(context.Context, GetTestRunAttachmentZipArgs) (io.ReadCloser, error) + // Get a test run by its ID. + GetTestRunById(context.Context, GetTestRunByIdArgs) (*TestRun, error) + // [Preview API] Get code coverage data for a test run + GetTestRunCodeCoverage(context.Context, GetTestRunCodeCoverageArgs) (*[]TestRunCoverage, error) + // Get a list of test runs. + GetTestRuns(context.Context, GetTestRunsArgs) (*[]TestRun, error) + // Get test run statistics , used when we want to get summary of a run by outcome. + GetTestRunStatistics(context.Context, GetTestRunStatisticsArgs) (*TestRunStatistic, error) + // [Preview API] Get a list of test sessions + GetTestSessions(context.Context, GetTestSessionsArgs) (*[]TestSession, error) + // [Preview API] Download a test sub result attachment + GetTestSubResultAttachmentContent(context.Context, GetTestSubResultAttachmentContentArgs) (io.ReadCloser, error) + // [Preview API] Get list of test sub result attachments + GetTestSubResultAttachments(context.Context, GetTestSubResultAttachmentsArgs) (*[]TestAttachment, error) + // [Preview API] Download a test sub result attachment + GetTestSubResultAttachmentZip(context.Context, GetTestSubResultAttachmentZipArgs) (io.ReadCloser, error) + // [Preview API] Get history of a test method using TestHistoryQuery + QueryTestHistory(context.Context, QueryTestHistoryArgs) (*TestHistoryQuery, error) + // Query Test Runs based on filters. Mandatory fields are minLastUpdatedDate and maxLastUpdatedDate. + QueryTestRuns(context.Context, QueryTestRunsArgs) (*QueryTestRunsResponseValue, error) + // The test points associated with the test cases are removed from the test suite. The test case work item is not deleted from the system. See test cases resource to delete a test case permanently. + RemoveTestCasesFromSuiteUrl(context.Context, RemoveTestCasesFromSuiteUrlArgs) error + // [Preview API] Update test result retention settings + UpdateResultRetentionSettings(context.Context, UpdateResultRetentionSettingsArgs) (*ResultRetentionSettings, error) + // Updates the properties of the test case association in a suite. + UpdateSuiteTestCases(context.Context, UpdateSuiteTestCasesArgs) (*[]SuiteTestCase, error) + // Update test points. + UpdateTestPoints(context.Context, UpdateTestPointsArgs) (*[]TestPoint, error) + // Update test results in a test run. + UpdateTestResults(context.Context, UpdateTestResultsArgs) (*[]TestCaseResult, error) + // Update test run by its ID. + UpdateTestRun(context.Context, UpdateTestRunArgs) (*TestRun, error) + // [Preview API] Update a test session + UpdateTestSession(context.Context, UpdateTestSessionArgs) (*TestSession, error) +} + +type ClientImpl struct { Client azuredevops.Client } -func NewClient(ctx context.Context, connection *azuredevops.Connection) (*Client, error) { +func NewClient(ctx context.Context, connection *azuredevops.Connection) (Client, error) { client, err := connection.GetClientByResourceAreaId(ctx, ResourceAreaId) if err != nil { return nil, err } - return &Client{ + return &ClientImpl{ Client: *client, }, nil } -// Gets the action results for an iteration in a test result. -func (client *Client) GetActionResults(ctx context.Context, args GetActionResultsArgs) (*[]TestActionResultModel, error) { +// Add test cases to suite. +func (client *ClientImpl) AddTestCasesToSuite(ctx context.Context, args AddTestCasesToSuiteArgs) (*[]SuiteTestCase, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.PlanId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PlanId"} + } + routeValues["planId"] = strconv.Itoa(*args.PlanId) + if args.SuiteId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.SuiteId"} + } + routeValues["suiteId"] = strconv.Itoa(*args.SuiteId) + if args.TestCaseIds == nil || *args.TestCaseIds == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.TestCaseIds"} + } + routeValues["testCaseIds"] = *args.TestCaseIds + routeValues["action"] = "TestCases" + + locationId, _ := uuid.Parse("a4a1ec1c-b03f-41ca-8857-704594ecf58e") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []SuiteTestCase + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the AddTestCasesToSuite function +type AddTestCasesToSuiteArgs struct { + // (required) Project ID or project name + Project *string + // (required) ID of the test plan that contains the suite. + PlanId *int + // (required) ID of the test suite to which the test cases must be added. + SuiteId *int + // (required) IDs of the test cases to add to the suite. Ids are specified in comma separated format. + TestCaseIds *string +} + +// Add test results to a test run. +func (client *ClientImpl) AddTestResultsToTestRun(ctx context.Context, args AddTestResultsToTestRunArgs) (*[]TestCaseResult, error) { + if args.Results == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Results"} + } routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -48,45 +188,34 @@ func (client *Client) GetActionResults(ctx context.Context, args GetActionResult return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} } routeValues["runId"] = strconv.Itoa(*args.RunId) - if args.TestCaseResultId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} - } - routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) - if args.IterationId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} - } - routeValues["iterationId"] = strconv.Itoa(*args.IterationId) - if args.ActionPath != nil && *args.ActionPath != "" { - routeValues["actionPath"] = *args.ActionPath - } - locationId, _ := uuid.Parse("eaf40c31-ff84-4062-aafd-d5664be11a37") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + body, marshalErr := json.Marshal(*args.Results) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("4637d869-3a76-4468-8057-0bb02aa385cf") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) if err != nil { return nil, err } - var responseValue []TestActionResultModel + var responseValue []TestCaseResult err = client.Client.UnmarshalCollectionBody(resp, &responseValue) return &responseValue, err } -// Arguments for the GetActionResults function -type GetActionResultsArgs struct { +// Arguments for the AddTestResultsToTestRun function +type AddTestResultsToTestRunArgs struct { + // (required) List of test results to add. + Results *[]TestCaseResult // (required) Project ID or project name Project *string - // (required) ID of the test run that contains the result. + // (required) Test run ID into which test results to add. RunId *int - // (required) ID of the test result that contains the iterations. - TestCaseResultId *int - // (required) ID of the iteration that contains the actions. - IterationId *int - // (optional) Path of a specific action, used to get just that action. - ActionPath *string } // [Preview API] Attach a file to a test result. -func (client *Client) CreateTestResultAttachment(ctx context.Context, args CreateTestResultAttachmentArgs) (*TestAttachmentReference, error) { +func (client *ClientImpl) CreateTestResultAttachment(ctx context.Context, args CreateTestResultAttachmentArgs) (*TestAttachmentReference, error) { if args.AttachmentRequestModel == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentRequestModel"} } @@ -131,8 +260,121 @@ type CreateTestResultAttachmentArgs struct { TestCaseResultId *int } +// Create new test run. +func (client *ClientImpl) CreateTestRun(ctx context.Context, args CreateTestRunArgs) (*TestRun, error) { + if args.TestRun == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestRun"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + + body, marshalErr := json.Marshal(*args.TestRun) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("cadb3810-d47d-4a3c-a234-fe5f3be50138") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue TestRun + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateTestRun function +type CreateTestRunArgs struct { + // (required) Run details RunCreateModel + TestRun *RunCreateModel + // (required) Project ID or project name + Project *string +} + +// [Preview API] Attach a file to a test run. +func (client *ClientImpl) CreateTestRunAttachment(ctx context.Context, args CreateTestRunAttachmentArgs) (*TestAttachmentReference, error) { + if args.AttachmentRequestModel == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentRequestModel"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RunId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + } + routeValues["runId"] = strconv.Itoa(*args.RunId) + + body, marshalErr := json.Marshal(*args.AttachmentRequestModel) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("4f004af4-a507-489c-9b13-cb62060beb11") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue TestAttachmentReference + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateTestRunAttachment function +type CreateTestRunAttachmentArgs struct { + // (required) Attachment details TestAttachmentRequestModel + AttachmentRequestModel *TestAttachmentRequestModel + // (required) Project ID or project name + Project *string + // (required) ID of the test run against which attachment has to be uploaded. + RunId *int +} + +// [Preview API] Create a test session +func (client *ClientImpl) CreateTestSession(ctx context.Context, args CreateTestSessionArgs) (*TestSession, error) { + if args.TestSession == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestSession"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.Team != nil && *args.Team != "" { + routeValues["team"] = *args.Team + } + + body, marshalErr := json.Marshal(*args.TestSession) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("1500b4b4-6c69-4ca6-9b18-35e9e97fe2ac") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue TestSession + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the CreateTestSession function +type CreateTestSessionArgs struct { + // (required) Test session details for creation + TestSession *TestSession + // (required) Project ID or project name + Project *string + // (optional) Team ID or team name + Team *string +} + // [Preview API] Attach a file to a test result -func (client *Client) CreateTestSubResultAttachment(ctx context.Context, args CreateTestSubResultAttachmentArgs) (*TestAttachmentReference, error) { +func (client *ClientImpl) CreateTestSubResultAttachment(ctx context.Context, args CreateTestSubResultAttachmentArgs) (*TestAttachmentReference, error) { if args.AttachmentRequestModel == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentRequestModel"} } @@ -184,49 +426,66 @@ type CreateTestSubResultAttachmentArgs struct { TestSubResultId *int } -// [Preview API] Download a test result attachment by its ID. -func (client *Client) GetTestResultAttachmentContent(ctx context.Context, args GetTestResultAttachmentContentArgs) (io.ReadCloser, error) { +// [Preview API] Delete a test case. +func (client *ClientImpl) DeleteTestCase(ctx context.Context, args DeleteTestCaseArgs) error { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} } routeValues["project"] = *args.Project - if args.RunId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + if args.TestCaseId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseId"} } - routeValues["runId"] = strconv.Itoa(*args.RunId) - if args.TestCaseResultId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} - } - routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) - if args.AttachmentId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentId"} - } - routeValues["attachmentId"] = strconv.Itoa(*args.AttachmentId) + routeValues["testCaseId"] = strconv.Itoa(*args.TestCaseId) - locationId, _ := uuid.Parse("2bffebe9-2f0f-4639-9af8-56129e9fed2d") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/octet-stream", nil) + locationId, _ := uuid.Parse("4d472e0f-e32c-4ef8-adf4-a4078772889c") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) if err != nil { - return nil, err + return err } - return resp.Body, err + return nil } -// Arguments for the GetTestResultAttachmentContent function -type GetTestResultAttachmentContentArgs struct { +// Arguments for the DeleteTestCase function +type DeleteTestCaseArgs struct { // (required) Project ID or project name Project *string - // (required) ID of the test run that contains the testCaseResultId. - RunId *int - // (required) ID of the test result whose attachment has to be downloaded. - TestCaseResultId *int - // (required) ID of the test result attachment to be downloaded. - AttachmentId *int + // (required) Id of test case to delete. + TestCaseId *int } -// [Preview API] Get list of test result attachments reference. -func (client *Client) GetTestResultAttachments(ctx context.Context, args GetTestResultAttachmentsArgs) (*[]TestAttachment, error) { +// Delete a test run by its ID. +func (client *ClientImpl) DeleteTestRun(ctx context.Context, args DeleteTestRunArgs) error { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RunId == nil { + return &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + } + routeValues["runId"] = strconv.Itoa(*args.RunId) + + locationId, _ := uuid.Parse("cadb3810-d47d-4a3c-a234-fe5f3be50138") + _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return err + } + + return nil +} + +// Arguments for the DeleteTestRun function +type DeleteTestRunArgs struct { + // (required) Project ID or project name + Project *string + // (required) ID of the run to delete. + RunId *int +} + +// Gets the action results for an iteration in a test result. +func (client *ClientImpl) GetActionResults(ctx context.Context, args GetActionResultsArgs) (*[]TestActionResultModel, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -240,352 +499,41 @@ func (client *Client) GetTestResultAttachments(ctx context.Context, args GetTest return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} } routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) + if args.IterationId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} + } + routeValues["iterationId"] = strconv.Itoa(*args.IterationId) + if args.ActionPath != nil && *args.ActionPath != "" { + routeValues["actionPath"] = *args.ActionPath + } - locationId, _ := uuid.Parse("2bffebe9-2f0f-4639-9af8-56129e9fed2d") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + locationId, _ := uuid.Parse("eaf40c31-ff84-4062-aafd-d5664be11a37") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue []TestAttachment + var responseValue []TestActionResultModel err = client.Client.UnmarshalCollectionBody(resp, &responseValue) return &responseValue, err } -// Arguments for the GetTestResultAttachments function -type GetTestResultAttachmentsArgs struct { +// Arguments for the GetActionResults function +type GetActionResultsArgs struct { // (required) Project ID or project name Project *string // (required) ID of the test run that contains the result. RunId *int - // (required) ID of the test result. + // (required) ID of the test result that contains the iterations. TestCaseResultId *int -} - -// [Preview API] Download a test result attachment by its ID. -func (client *Client) GetTestResultAttachmentZip(ctx context.Context, args GetTestResultAttachmentZipArgs) (io.ReadCloser, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RunId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} - } - routeValues["runId"] = strconv.Itoa(*args.RunId) - if args.TestCaseResultId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} - } - routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) - if args.AttachmentId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentId"} - } - routeValues["attachmentId"] = strconv.Itoa(*args.AttachmentId) - - locationId, _ := uuid.Parse("2bffebe9-2f0f-4639-9af8-56129e9fed2d") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/zip", nil) - if err != nil { - return nil, err - } - - return resp.Body, err -} - -// Arguments for the GetTestResultAttachmentZip function -type GetTestResultAttachmentZipArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the test run that contains the testCaseResultId. - RunId *int - // (required) ID of the test result whose attachment has to be downloaded. - TestCaseResultId *int - // (required) ID of the test result attachment to be downloaded. - AttachmentId *int -} - -// [Preview API] Download a test sub result attachment -func (client *Client) GetTestSubResultAttachmentContent(ctx context.Context, args GetTestSubResultAttachmentContentArgs) (io.ReadCloser, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RunId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} - } - routeValues["runId"] = strconv.Itoa(*args.RunId) - if args.TestCaseResultId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} - } - routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) - if args.AttachmentId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentId"} - } - routeValues["attachmentId"] = strconv.Itoa(*args.AttachmentId) - - queryParams := url.Values{} - if args.TestSubResultId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "testSubResultId"} - } - queryParams.Add("testSubResultId", strconv.Itoa(*args.TestSubResultId)) - locationId, _ := uuid.Parse("2bffebe9-2f0f-4639-9af8-56129e9fed2d") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/octet-stream", nil) - if err != nil { - return nil, err - } - - return resp.Body, err -} - -// Arguments for the GetTestSubResultAttachmentContent function -type GetTestSubResultAttachmentContentArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the test run that contains the result. - RunId *int - // (required) ID of the test results that contains sub result. - TestCaseResultId *int - // (required) ID of the test result attachment to be downloaded - AttachmentId *int - // (required) ID of the test sub result whose attachment has to be downloaded - TestSubResultId *int -} - -// [Preview API] Get list of test sub result attachments -func (client *Client) GetTestSubResultAttachments(ctx context.Context, args GetTestSubResultAttachmentsArgs) (*[]TestAttachment, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RunId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} - } - routeValues["runId"] = strconv.Itoa(*args.RunId) - if args.TestCaseResultId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} - } - routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) - - queryParams := url.Values{} - if args.TestSubResultId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "testSubResultId"} - } - queryParams.Add("testSubResultId", strconv.Itoa(*args.TestSubResultId)) - locationId, _ := uuid.Parse("2bffebe9-2f0f-4639-9af8-56129e9fed2d") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []TestAttachment - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetTestSubResultAttachments function -type GetTestSubResultAttachmentsArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the test run that contains the result. - RunId *int - // (required) ID of the test results that contains sub result. - TestCaseResultId *int - // (required) ID of the test sub result whose attachment has to be downloaded - TestSubResultId *int -} - -// [Preview API] Download a test sub result attachment -func (client *Client) GetTestSubResultAttachmentZip(ctx context.Context, args GetTestSubResultAttachmentZipArgs) (io.ReadCloser, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RunId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} - } - routeValues["runId"] = strconv.Itoa(*args.RunId) - if args.TestCaseResultId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} - } - routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) - if args.AttachmentId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentId"} - } - routeValues["attachmentId"] = strconv.Itoa(*args.AttachmentId) - - queryParams := url.Values{} - if args.TestSubResultId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "testSubResultId"} - } - queryParams.Add("testSubResultId", strconv.Itoa(*args.TestSubResultId)) - locationId, _ := uuid.Parse("2bffebe9-2f0f-4639-9af8-56129e9fed2d") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/zip", nil) - if err != nil { - return nil, err - } - - return resp.Body, err -} - -// Arguments for the GetTestSubResultAttachmentZip function -type GetTestSubResultAttachmentZipArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the test run that contains the result. - RunId *int - // (required) ID of the test results that contains sub result. - TestCaseResultId *int - // (required) ID of the test result attachment to be downloaded - AttachmentId *int - // (required) ID of the test sub result whose attachment has to be downloaded - TestSubResultId *int -} - -// [Preview API] Attach a file to a test run. -func (client *Client) CreateTestRunAttachment(ctx context.Context, args CreateTestRunAttachmentArgs) (*TestAttachmentReference, error) { - if args.AttachmentRequestModel == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentRequestModel"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RunId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} - } - routeValues["runId"] = strconv.Itoa(*args.RunId) - - body, marshalErr := json.Marshal(*args.AttachmentRequestModel) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("4f004af4-a507-489c-9b13-cb62060beb11") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue TestAttachmentReference - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateTestRunAttachment function -type CreateTestRunAttachmentArgs struct { - // (required) Attachment details TestAttachmentRequestModel - AttachmentRequestModel *TestAttachmentRequestModel - // (required) Project ID or project name - Project *string - // (required) ID of the test run against which attachment has to be uploaded. - RunId *int -} - -// [Preview API] Download a test run attachment by its ID. -func (client *Client) GetTestRunAttachmentContent(ctx context.Context, args GetTestRunAttachmentContentArgs) (io.ReadCloser, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RunId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} - } - routeValues["runId"] = strconv.Itoa(*args.RunId) - if args.AttachmentId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentId"} - } - routeValues["attachmentId"] = strconv.Itoa(*args.AttachmentId) - - locationId, _ := uuid.Parse("4f004af4-a507-489c-9b13-cb62060beb11") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/octet-stream", nil) - if err != nil { - return nil, err - } - - return resp.Body, err -} - -// Arguments for the GetTestRunAttachmentContent function -type GetTestRunAttachmentContentArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the test run whose attachment has to be downloaded. - RunId *int - // (required) ID of the test run attachment to be downloaded. - AttachmentId *int -} - -// [Preview API] Get list of test run attachments reference. -func (client *Client) GetTestRunAttachments(ctx context.Context, args GetTestRunAttachmentsArgs) (*[]TestAttachment, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RunId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} - } - routeValues["runId"] = strconv.Itoa(*args.RunId) - - locationId, _ := uuid.Parse("4f004af4-a507-489c-9b13-cb62060beb11") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []TestAttachment - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetTestRunAttachments function -type GetTestRunAttachmentsArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the test run. - RunId *int -} - -// [Preview API] Download a test run attachment by its ID. -func (client *Client) GetTestRunAttachmentZip(ctx context.Context, args GetTestRunAttachmentZipArgs) (io.ReadCloser, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RunId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} - } - routeValues["runId"] = strconv.Itoa(*args.RunId) - if args.AttachmentId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentId"} - } - routeValues["attachmentId"] = strconv.Itoa(*args.AttachmentId) - - locationId, _ := uuid.Parse("4f004af4-a507-489c-9b13-cb62060beb11") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/zip", nil) - if err != nil { - return nil, err - } - - return resp.Body, err -} - -// Arguments for the GetTestRunAttachmentZip function -type GetTestRunAttachmentZipArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the test run whose attachment has to be downloaded. - RunId *int - // (required) ID of the test run attachment to be downloaded. - AttachmentId *int + // (required) ID of the iteration that contains the actions. + IterationId *int + // (optional) Path of a specific action, used to get just that action. + ActionPath *string } // [Preview API] Get code coverage data for a build. -func (client *Client) GetBuildCodeCoverage(ctx context.Context, args GetBuildCodeCoverageArgs) (*[]BuildCoverage, error) { +func (client *ClientImpl) GetBuildCodeCoverage(ctx context.Context, args GetBuildCodeCoverageArgs) (*[]BuildCoverage, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -622,187 +570,8 @@ type GetBuildCodeCoverageArgs struct { Flags *int } -// [Preview API] Get code coverage data for a test run -func (client *Client) GetTestRunCodeCoverage(ctx context.Context, args GetTestRunCodeCoverageArgs) (*[]TestRunCoverage, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RunId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} - } - routeValues["runId"] = strconv.Itoa(*args.RunId) - - queryParams := url.Values{} - if args.Flags == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "flags"} - } - queryParams.Add("flags", strconv.Itoa(*args.Flags)) - locationId, _ := uuid.Parse("9629116f-3b89-4ed8-b358-d4694efda160") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []TestRunCoverage - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetTestRunCodeCoverage function -type GetTestRunCodeCoverageArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the test run for which code coverage data needs to be fetched. - RunId *int - // (required) Value of flags determine the level of code coverage details to be fetched. Flags are additive. Expected Values are 1 for Modules, 2 for Functions, 4 for BlockData. - Flags *int -} - -// Get iteration for a result -func (client *Client) GetTestIteration(ctx context.Context, args GetTestIterationArgs) (*TestIterationDetailsModel, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RunId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} - } - routeValues["runId"] = strconv.Itoa(*args.RunId) - if args.TestCaseResultId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} - } - routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) - if args.IterationId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} - } - routeValues["iterationId"] = strconv.Itoa(*args.IterationId) - - queryParams := url.Values{} - if args.IncludeActionResults != nil { - queryParams.Add("includeActionResults", strconv.FormatBool(*args.IncludeActionResults)) - } - locationId, _ := uuid.Parse("73eb9074-3446-4c44-8296-2f811950ff8d") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue TestIterationDetailsModel - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetTestIteration function -type GetTestIterationArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the test run that contains the result. - RunId *int - // (required) ID of the test result that contains the iterations. - TestCaseResultId *int - // (required) Id of the test results Iteration. - IterationId *int - // (optional) Include result details for each action performed in the test iteration. ActionResults refer to outcome (pass/fail) of test steps that are executed as part of a running a manual test. Including the ActionResults flag gets the outcome of test steps in the actionResults section and test parameters in the parameters section for each test iteration. - IncludeActionResults *bool -} - -// Get iterations for a result -func (client *Client) GetTestIterations(ctx context.Context, args GetTestIterationsArgs) (*[]TestIterationDetailsModel, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RunId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} - } - routeValues["runId"] = strconv.Itoa(*args.RunId) - if args.TestCaseResultId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} - } - routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) - - queryParams := url.Values{} - if args.IncludeActionResults != nil { - queryParams.Add("includeActionResults", strconv.FormatBool(*args.IncludeActionResults)) - } - locationId, _ := uuid.Parse("73eb9074-3446-4c44-8296-2f811950ff8d") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []TestIterationDetailsModel - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetTestIterations function -type GetTestIterationsArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the test run that contains the result. - RunId *int - // (required) ID of the test result that contains the iterations. - TestCaseResultId *int - // (optional) Include result details for each action performed in the test iteration. ActionResults refer to outcome (pass/fail) of test steps that are executed as part of a running a manual test. Including the ActionResults flag gets the outcome of test steps in the actionResults section and test parameters in the parameters section for each test iteration. - IncludeActionResults *bool -} - -// Get a list of parameterized results -func (client *Client) GetResultParameters(ctx context.Context, args GetResultParametersArgs) (*[]TestResultParameterModel, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RunId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} - } - routeValues["runId"] = strconv.Itoa(*args.RunId) - if args.TestCaseResultId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} - } - routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) - if args.IterationId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} - } - routeValues["iterationId"] = strconv.Itoa(*args.IterationId) - - queryParams := url.Values{} - if args.ParamName != nil { - queryParams.Add("paramName", *args.ParamName) - } - locationId, _ := uuid.Parse("7c69810d-3354-4af3-844a-180bd25db08a") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []TestResultParameterModel - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetResultParameters function -type GetResultParametersArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the test run that contains the result. - RunId *int - // (required) ID of the test result that contains the iterations. - TestCaseResultId *int - // (required) ID of the iteration that contains the parameterized results. - IterationId *int - // (optional) Name of the parameter. - ParamName *string -} - // Get a test point. -func (client *Client) GetPoint(ctx context.Context, args GetPointArgs) (*TestPoint, error) { +func (client *ClientImpl) GetPoint(ctx context.Context, args GetPointArgs) (*TestPoint, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -851,7 +620,7 @@ type GetPointArgs struct { } // Get a list of test points. -func (client *Client) GetPoints(ctx context.Context, args GetPointsArgs) (*[]TestPoint, error) { +func (client *ClientImpl) GetPoints(ctx context.Context, args GetPointsArgs) (*[]TestPoint, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -923,60 +692,8 @@ type GetPointsArgs struct { Top *int } -// Update test points. -func (client *Client) UpdateTestPoints(ctx context.Context, args UpdateTestPointsArgs) (*[]TestPoint, error) { - if args.PointUpdateModel == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PointUpdateModel"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.PlanId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PlanId"} - } - routeValues["planId"] = strconv.Itoa(*args.PlanId) - if args.SuiteId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.SuiteId"} - } - routeValues["suiteId"] = strconv.Itoa(*args.SuiteId) - if args.PointIds == nil || *args.PointIds == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.PointIds"} - } - routeValues["pointIds"] = *args.PointIds - - body, marshalErr := json.Marshal(*args.PointUpdateModel) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("3bcfd5c8-be62-488e-b1da-b8289ce9299c") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []TestPoint - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdateTestPoints function -type UpdateTestPointsArgs struct { - // (required) Data to update. - PointUpdateModel *PointUpdateModel - // (required) Project ID or project name - Project *string - // (required) ID of the test plan. - PlanId *int - // (required) ID of the suite that contains the points. - SuiteId *int - // (required) ID of the test point to get. Use a comma-separated list of IDs to update multiple test points. - PointIds *string -} - // [Preview API] Get test points using query. -func (client *Client) GetPointsByQuery(ctx context.Context, args GetPointsByQueryArgs) (*TestPointsQuery, error) { +func (client *ClientImpl) GetPointsByQuery(ctx context.Context, args GetPointsByQueryArgs) (*TestPointsQuery, error) { if args.Query == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Query"} } @@ -1020,8 +737,57 @@ type GetPointsByQueryArgs struct { Top *int } +// Get a list of parameterized results +func (client *ClientImpl) GetResultParameters(ctx context.Context, args GetResultParametersArgs) (*[]TestResultParameterModel, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RunId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + } + routeValues["runId"] = strconv.Itoa(*args.RunId) + if args.TestCaseResultId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} + } + routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) + if args.IterationId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} + } + routeValues["iterationId"] = strconv.Itoa(*args.IterationId) + + queryParams := url.Values{} + if args.ParamName != nil { + queryParams.Add("paramName", *args.ParamName) + } + locationId, _ := uuid.Parse("7c69810d-3354-4af3-844a-180bd25db08a") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []TestResultParameterModel + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetResultParameters function +type GetResultParametersArgs struct { + // (required) Project ID or project name + Project *string + // (required) ID of the test run that contains the result. + RunId *int + // (required) ID of the test result that contains the iterations. + TestCaseResultId *int + // (required) ID of the iteration that contains the parameterized results. + IterationId *int + // (optional) Name of the parameter. + ParamName *string +} + // [Preview API] Get test result retention settings -func (client *Client) GetResultRetentionSettings(ctx context.Context, args GetResultRetentionSettingsArgs) (*ResultRetentionSettings, error) { +func (client *ClientImpl) GetResultRetentionSettings(ctx context.Context, args GetResultRetentionSettingsArgs) (*ResultRetentionSettings, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1045,45 +811,90 @@ type GetResultRetentionSettingsArgs struct { Project *string } -// [Preview API] Update test result retention settings -func (client *Client) UpdateResultRetentionSettings(ctx context.Context, args UpdateResultRetentionSettingsArgs) (*ResultRetentionSettings, error) { - if args.RetentionSettings == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RetentionSettings"} - } +// Get a specific test case in a test suite with test case id. +func (client *ClientImpl) GetTestCaseById(ctx context.Context, args GetTestCaseByIdArgs) (*SuiteTestCase, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} } routeValues["project"] = *args.Project - - body, marshalErr := json.Marshal(*args.RetentionSettings) - if marshalErr != nil { - return nil, marshalErr + if args.PlanId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PlanId"} } - locationId, _ := uuid.Parse("a3206d9e-fa8d-42d3-88cb-f75c51e69cde") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + routeValues["planId"] = strconv.Itoa(*args.PlanId) + if args.SuiteId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.SuiteId"} + } + routeValues["suiteId"] = strconv.Itoa(*args.SuiteId) + if args.TestCaseIds == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseIds"} + } + routeValues["testCaseIds"] = strconv.Itoa(*args.TestCaseIds) + routeValues["action"] = "TestCases" + + locationId, _ := uuid.Parse("a4a1ec1c-b03f-41ca-8857-704594ecf58e") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue ResultRetentionSettings + var responseValue SuiteTestCase err = client.Client.UnmarshalBody(resp, &responseValue) return &responseValue, err } -// Arguments for the UpdateResultRetentionSettings function -type UpdateResultRetentionSettingsArgs struct { - // (required) Test result retention settings details to be updated - RetentionSettings *ResultRetentionSettings +// Arguments for the GetTestCaseById function +type GetTestCaseByIdArgs struct { // (required) Project ID or project name Project *string + // (required) ID of the test plan that contains the suites. + PlanId *int + // (required) ID of the suite that contains the test case. + SuiteId *int + // (required) ID of the test case to get. + TestCaseIds *int } -// Add test results to a test run. -func (client *Client) AddTestResultsToTestRun(ctx context.Context, args AddTestResultsToTestRunArgs) (*[]TestCaseResult, error) { - if args.Results == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Results"} +// Get all test cases in a suite. +func (client *ClientImpl) GetTestCases(ctx context.Context, args GetTestCasesArgs) (*[]SuiteTestCase, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} } + routeValues["project"] = *args.Project + if args.PlanId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PlanId"} + } + routeValues["planId"] = strconv.Itoa(*args.PlanId) + if args.SuiteId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.SuiteId"} + } + routeValues["suiteId"] = strconv.Itoa(*args.SuiteId) + routeValues["action"] = "TestCases" + + locationId, _ := uuid.Parse("a4a1ec1c-b03f-41ca-8857-704594ecf58e") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []SuiteTestCase + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetTestCases function +type GetTestCasesArgs struct { + // (required) Project ID or project name + Project *string + // (required) ID of the test plan that contains the suites. + PlanId *int + // (required) ID of the suite to get. + SuiteId *int +} + +// Get iteration for a result +func (client *ClientImpl) GetTestIteration(ctx context.Context, args GetTestIterationArgs) (*TestIterationDetailsModel, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1093,34 +904,208 @@ func (client *Client) AddTestResultsToTestRun(ctx context.Context, args AddTestR return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} } routeValues["runId"] = strconv.Itoa(*args.RunId) - - body, marshalErr := json.Marshal(*args.Results) - if marshalErr != nil { - return nil, marshalErr + if args.TestCaseResultId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} } - locationId, _ := uuid.Parse("4637d869-3a76-4468-8057-0bb02aa385cf") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) + if args.IterationId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.IterationId"} + } + routeValues["iterationId"] = strconv.Itoa(*args.IterationId) + + queryParams := url.Values{} + if args.IncludeActionResults != nil { + queryParams.Add("includeActionResults", strconv.FormatBool(*args.IncludeActionResults)) + } + locationId, _ := uuid.Parse("73eb9074-3446-4c44-8296-2f811950ff8d") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue []TestCaseResult + var responseValue TestIterationDetailsModel + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetTestIteration function +type GetTestIterationArgs struct { + // (required) Project ID or project name + Project *string + // (required) ID of the test run that contains the result. + RunId *int + // (required) ID of the test result that contains the iterations. + TestCaseResultId *int + // (required) Id of the test results Iteration. + IterationId *int + // (optional) Include result details for each action performed in the test iteration. ActionResults refer to outcome (pass/fail) of test steps that are executed as part of a running a manual test. Including the ActionResults flag gets the outcome of test steps in the actionResults section and test parameters in the parameters section for each test iteration. + IncludeActionResults *bool +} + +// Get iterations for a result +func (client *ClientImpl) GetTestIterations(ctx context.Context, args GetTestIterationsArgs) (*[]TestIterationDetailsModel, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RunId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + } + routeValues["runId"] = strconv.Itoa(*args.RunId) + if args.TestCaseResultId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} + } + routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) + + queryParams := url.Values{} + if args.IncludeActionResults != nil { + queryParams.Add("includeActionResults", strconv.FormatBool(*args.IncludeActionResults)) + } + locationId, _ := uuid.Parse("73eb9074-3446-4c44-8296-2f811950ff8d") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []TestIterationDetailsModel err = client.Client.UnmarshalCollectionBody(resp, &responseValue) return &responseValue, err } -// Arguments for the AddTestResultsToTestRun function -type AddTestResultsToTestRunArgs struct { - // (required) List of test results to add. - Results *[]TestCaseResult +// Arguments for the GetTestIterations function +type GetTestIterationsArgs struct { // (required) Project ID or project name Project *string - // (required) Test run ID into which test results to add. + // (required) ID of the test run that contains the result. RunId *int + // (required) ID of the test result that contains the iterations. + TestCaseResultId *int + // (optional) Include result details for each action performed in the test iteration. ActionResults refer to outcome (pass/fail) of test steps that are executed as part of a running a manual test. Including the ActionResults flag gets the outcome of test steps in the actionResults section and test parameters in the parameters section for each test iteration. + IncludeActionResults *bool +} + +// [Preview API] Download a test result attachment by its ID. +func (client *ClientImpl) GetTestResultAttachmentContent(ctx context.Context, args GetTestResultAttachmentContentArgs) (io.ReadCloser, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RunId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + } + routeValues["runId"] = strconv.Itoa(*args.RunId) + if args.TestCaseResultId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} + } + routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) + if args.AttachmentId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentId"} + } + routeValues["attachmentId"] = strconv.Itoa(*args.AttachmentId) + + locationId, _ := uuid.Parse("2bffebe9-2f0f-4639-9af8-56129e9fed2d") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/octet-stream", nil) + if err != nil { + return nil, err + } + + return resp.Body, err +} + +// Arguments for the GetTestResultAttachmentContent function +type GetTestResultAttachmentContentArgs struct { + // (required) Project ID or project name + Project *string + // (required) ID of the test run that contains the testCaseResultId. + RunId *int + // (required) ID of the test result whose attachment has to be downloaded. + TestCaseResultId *int + // (required) ID of the test result attachment to be downloaded. + AttachmentId *int +} + +// [Preview API] Get list of test result attachments reference. +func (client *ClientImpl) GetTestResultAttachments(ctx context.Context, args GetTestResultAttachmentsArgs) (*[]TestAttachment, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RunId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + } + routeValues["runId"] = strconv.Itoa(*args.RunId) + if args.TestCaseResultId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} + } + routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) + + locationId, _ := uuid.Parse("2bffebe9-2f0f-4639-9af8-56129e9fed2d") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []TestAttachment + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetTestResultAttachments function +type GetTestResultAttachmentsArgs struct { + // (required) Project ID or project name + Project *string + // (required) ID of the test run that contains the result. + RunId *int + // (required) ID of the test result. + TestCaseResultId *int +} + +// [Preview API] Download a test result attachment by its ID. +func (client *ClientImpl) GetTestResultAttachmentZip(ctx context.Context, args GetTestResultAttachmentZipArgs) (io.ReadCloser, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RunId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + } + routeValues["runId"] = strconv.Itoa(*args.RunId) + if args.TestCaseResultId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} + } + routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) + if args.AttachmentId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentId"} + } + routeValues["attachmentId"] = strconv.Itoa(*args.AttachmentId) + + locationId, _ := uuid.Parse("2bffebe9-2f0f-4639-9af8-56129e9fed2d") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/zip", nil) + if err != nil { + return nil, err + } + + return resp.Body, err +} + +// Arguments for the GetTestResultAttachmentZip function +type GetTestResultAttachmentZipArgs struct { + // (required) Project ID or project name + Project *string + // (required) ID of the test run that contains the testCaseResultId. + RunId *int + // (required) ID of the test result whose attachment has to be downloaded. + TestCaseResultId *int + // (required) ID of the test result attachment to be downloaded. + AttachmentId *int } // Get a test result for a test run. -func (client *Client) GetTestResultById(ctx context.Context, args GetTestResultByIdArgs) (*TestCaseResult, error) { +func (client *ClientImpl) GetTestResultById(ctx context.Context, args GetTestResultByIdArgs) (*TestCaseResult, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1163,7 +1148,7 @@ type GetTestResultByIdArgs struct { } // Get test results for a test run. -func (client *Client) GetTestResults(ctx context.Context, args GetTestResultsArgs) (*[]TestCaseResult, error) { +func (client *ClientImpl) GetTestResults(ctx context.Context, args GetTestResultsArgs) (*[]TestCaseResult, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1219,11 +1204,43 @@ type GetTestResultsArgs struct { Outcomes *[]TestOutcome } -// Update test results in a test run. -func (client *Client) UpdateTestResults(ctx context.Context, args UpdateTestResultsArgs) (*[]TestCaseResult, error) { - if args.Results == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Results"} +// [Preview API] Download a test run attachment by its ID. +func (client *ClientImpl) GetTestRunAttachmentContent(ctx context.Context, args GetTestRunAttachmentContentArgs) (io.ReadCloser, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} } + routeValues["project"] = *args.Project + if args.RunId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + } + routeValues["runId"] = strconv.Itoa(*args.RunId) + if args.AttachmentId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentId"} + } + routeValues["attachmentId"] = strconv.Itoa(*args.AttachmentId) + + locationId, _ := uuid.Parse("4f004af4-a507-489c-9b13-cb62060beb11") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/octet-stream", nil) + if err != nil { + return nil, err + } + + return resp.Body, err +} + +// Arguments for the GetTestRunAttachmentContent function +type GetTestRunAttachmentContentArgs struct { + // (required) Project ID or project name + Project *string + // (required) ID of the test run whose attachment has to be downloaded. + RunId *int + // (required) ID of the test run attachment to be downloaded. + AttachmentId *int +} + +// [Preview API] Get list of test run attachments reference. +func (client *ClientImpl) GetTestRunAttachments(ctx context.Context, args GetTestRunAttachmentsArgs) (*[]TestAttachment, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1234,33 +1251,27 @@ func (client *Client) UpdateTestResults(ctx context.Context, args UpdateTestResu } routeValues["runId"] = strconv.Itoa(*args.RunId) - body, marshalErr := json.Marshal(*args.Results) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("4637d869-3a76-4468-8057-0bb02aa385cf") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + locationId, _ := uuid.Parse("4f004af4-a507-489c-9b13-cb62060beb11") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) if err != nil { return nil, err } - var responseValue []TestCaseResult + var responseValue []TestAttachment err = client.Client.UnmarshalCollectionBody(resp, &responseValue) return &responseValue, err } -// Arguments for the UpdateTestResults function -type UpdateTestResultsArgs struct { - // (required) List of test results to update. - Results *[]TestCaseResult +// Arguments for the GetTestRunAttachments function +type GetTestRunAttachmentsArgs struct { // (required) Project ID or project name Project *string - // (required) Test run ID whose test results to update. + // (required) ID of the test run. RunId *int } -// Get test run statistics , used when we want to get summary of a run by outcome. -func (client *Client) GetTestRunStatistics(ctx context.Context, args GetTestRunStatisticsArgs) (*TestRunStatistic, error) { +// [Preview API] Download a test run attachment by its ID. +func (client *ClientImpl) GetTestRunAttachmentZip(ctx context.Context, args GetTestRunAttachmentZipArgs) (io.ReadCloser, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1270,91 +1281,32 @@ func (client *Client) GetTestRunStatistics(ctx context.Context, args GetTestRunS return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} } routeValues["runId"] = strconv.Itoa(*args.RunId) + if args.AttachmentId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentId"} + } + routeValues["attachmentId"] = strconv.Itoa(*args.AttachmentId) - locationId, _ := uuid.Parse("0a42c424-d764-4a16-a2d5-5c85f87d0ae8") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + locationId, _ := uuid.Parse("4f004af4-a507-489c-9b13-cb62060beb11") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/zip", nil) if err != nil { return nil, err } - var responseValue TestRunStatistic - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err + return resp.Body, err } -// Arguments for the GetTestRunStatistics function -type GetTestRunStatisticsArgs struct { +// Arguments for the GetTestRunAttachmentZip function +type GetTestRunAttachmentZipArgs struct { // (required) Project ID or project name Project *string - // (required) ID of the run to get. - RunId *int -} - -// Create new test run. -func (client *Client) CreateTestRun(ctx context.Context, args CreateTestRunArgs) (*TestRun, error) { - if args.TestRun == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestRun"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - - body, marshalErr := json.Marshal(*args.TestRun) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("cadb3810-d47d-4a3c-a234-fe5f3be50138") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue TestRun - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateTestRun function -type CreateTestRunArgs struct { - // (required) Run details RunCreateModel - TestRun *RunCreateModel - // (required) Project ID or project name - Project *string -} - -// Delete a test run by its ID. -func (client *Client) DeleteTestRun(ctx context.Context, args DeleteTestRunArgs) error { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RunId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} - } - routeValues["runId"] = strconv.Itoa(*args.RunId) - - locationId, _ := uuid.Parse("cadb3810-d47d-4a3c-a234-fe5f3be50138") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeleteTestRun function -type DeleteTestRunArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the run to delete. + // (required) ID of the test run whose attachment has to be downloaded. RunId *int + // (required) ID of the test run attachment to be downloaded. + AttachmentId *int } // Get a test run by its ID. -func (client *Client) GetTestRunById(ctx context.Context, args GetTestRunByIdArgs) (*TestRun, error) { +func (client *ClientImpl) GetTestRunById(ctx context.Context, args GetTestRunByIdArgs) (*TestRun, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1386,12 +1338,50 @@ type GetTestRunByIdArgs struct { Project *string // (required) ID of the run to get. RunId *int - // (optional) Defualt value is true. It includes details like run statistics,release,build,Test enviornment,Post process state and more + // (optional) Default value is true. It includes details like run statistics, release, build, test environment, post process state, and more. IncludeDetails *bool } +// [Preview API] Get code coverage data for a test run +func (client *ClientImpl) GetTestRunCodeCoverage(ctx context.Context, args GetTestRunCodeCoverageArgs) (*[]TestRunCoverage, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RunId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + } + routeValues["runId"] = strconv.Itoa(*args.RunId) + + queryParams := url.Values{} + if args.Flags == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "flags"} + } + queryParams.Add("flags", strconv.Itoa(*args.Flags)) + locationId, _ := uuid.Parse("9629116f-3b89-4ed8-b358-d4694efda160") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []TestRunCoverage + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetTestRunCodeCoverage function +type GetTestRunCodeCoverageArgs struct { + // (required) Project ID or project name + Project *string + // (required) ID of the test run for which code coverage data needs to be fetched. + RunId *int + // (required) Value of flags determine the level of code coverage details to be fetched. Flags are additive. Expected Values are 1 for Modules, 2 for Functions, 4 for BlockData. + Flags *int +} + // Get a list of test runs. -func (client *Client) GetTestRuns(ctx context.Context, args GetTestRunsArgs) (*[]TestRun, error) { +func (client *ClientImpl) GetTestRuns(ctx context.Context, args GetTestRunsArgs) (*[]TestRun, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1456,8 +1446,269 @@ type GetTestRunsArgs struct { Top *int } +// Get test run statistics , used when we want to get summary of a run by outcome. +func (client *ClientImpl) GetTestRunStatistics(ctx context.Context, args GetTestRunStatisticsArgs) (*TestRunStatistic, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RunId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + } + routeValues["runId"] = strconv.Itoa(*args.RunId) + + locationId, _ := uuid.Parse("0a42c424-d764-4a16-a2d5-5c85f87d0ae8") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue TestRunStatistic + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetTestRunStatistics function +type GetTestRunStatisticsArgs struct { + // (required) Project ID or project name + Project *string + // (required) ID of the run to get. + RunId *int +} + +// [Preview API] Get a list of test sessions +func (client *ClientImpl) GetTestSessions(ctx context.Context, args GetTestSessionsArgs) (*[]TestSession, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.Team != nil && *args.Team != "" { + routeValues["team"] = *args.Team + } + + queryParams := url.Values{} + if args.Period != nil { + queryParams.Add("period", strconv.Itoa(*args.Period)) + } + if args.AllSessions != nil { + queryParams.Add("allSessions", strconv.FormatBool(*args.AllSessions)) + } + if args.IncludeAllProperties != nil { + queryParams.Add("includeAllProperties", strconv.FormatBool(*args.IncludeAllProperties)) + } + if args.Source != nil { + queryParams.Add("source", string(*args.Source)) + } + if args.IncludeOnlyCompletedSessions != nil { + queryParams.Add("includeOnlyCompletedSessions", strconv.FormatBool(*args.IncludeOnlyCompletedSessions)) + } + locationId, _ := uuid.Parse("1500b4b4-6c69-4ca6-9b18-35e9e97fe2ac") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []TestSession + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetTestSessions function +type GetTestSessionsArgs struct { + // (required) Project ID or project name + Project *string + // (optional) Team ID or team name + Team *string + // (optional) Period in days from now, for which test sessions are fetched. + Period *int + // (optional) If false, returns test sessions for current user. Otherwise, it returns test sessions for all users + AllSessions *bool + // (optional) If true, it returns all properties of the test sessions. Otherwise, it returns the skinny version. + IncludeAllProperties *bool + // (optional) Source of the test session. + Source *TestSessionSource + // (optional) If true, it returns test sessions in completed state. Otherwise, it returns test sessions for all states + IncludeOnlyCompletedSessions *bool +} + +// [Preview API] Download a test sub result attachment +func (client *ClientImpl) GetTestSubResultAttachmentContent(ctx context.Context, args GetTestSubResultAttachmentContentArgs) (io.ReadCloser, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RunId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + } + routeValues["runId"] = strconv.Itoa(*args.RunId) + if args.TestCaseResultId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} + } + routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) + if args.AttachmentId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentId"} + } + routeValues["attachmentId"] = strconv.Itoa(*args.AttachmentId) + + queryParams := url.Values{} + if args.TestSubResultId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "testSubResultId"} + } + queryParams.Add("testSubResultId", strconv.Itoa(*args.TestSubResultId)) + locationId, _ := uuid.Parse("2bffebe9-2f0f-4639-9af8-56129e9fed2d") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/octet-stream", nil) + if err != nil { + return nil, err + } + + return resp.Body, err +} + +// Arguments for the GetTestSubResultAttachmentContent function +type GetTestSubResultAttachmentContentArgs struct { + // (required) Project ID or project name + Project *string + // (required) ID of the test run that contains the result. + RunId *int + // (required) ID of the test results that contains sub result. + TestCaseResultId *int + // (required) ID of the test result attachment to be downloaded + AttachmentId *int + // (required) ID of the test sub result whose attachment has to be downloaded + TestSubResultId *int +} + +// [Preview API] Get list of test sub result attachments +func (client *ClientImpl) GetTestSubResultAttachments(ctx context.Context, args GetTestSubResultAttachmentsArgs) (*[]TestAttachment, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RunId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + } + routeValues["runId"] = strconv.Itoa(*args.RunId) + if args.TestCaseResultId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} + } + routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) + + queryParams := url.Values{} + if args.TestSubResultId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "testSubResultId"} + } + queryParams.Add("testSubResultId", strconv.Itoa(*args.TestSubResultId)) + locationId, _ := uuid.Parse("2bffebe9-2f0f-4639-9af8-56129e9fed2d") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []TestAttachment + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the GetTestSubResultAttachments function +type GetTestSubResultAttachmentsArgs struct { + // (required) Project ID or project name + Project *string + // (required) ID of the test run that contains the result. + RunId *int + // (required) ID of the test results that contains sub result. + TestCaseResultId *int + // (required) ID of the test sub result whose attachment has to be downloaded + TestSubResultId *int +} + +// [Preview API] Download a test sub result attachment +func (client *ClientImpl) GetTestSubResultAttachmentZip(ctx context.Context, args GetTestSubResultAttachmentZipArgs) (io.ReadCloser, error) { + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RunId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + } + routeValues["runId"] = strconv.Itoa(*args.RunId) + if args.TestCaseResultId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseResultId"} + } + routeValues["testCaseResultId"] = strconv.Itoa(*args.TestCaseResultId) + if args.AttachmentId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.AttachmentId"} + } + routeValues["attachmentId"] = strconv.Itoa(*args.AttachmentId) + + queryParams := url.Values{} + if args.TestSubResultId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "testSubResultId"} + } + queryParams.Add("testSubResultId", strconv.Itoa(*args.TestSubResultId)) + locationId, _ := uuid.Parse("2bffebe9-2f0f-4639-9af8-56129e9fed2d") + resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/zip", nil) + if err != nil { + return nil, err + } + + return resp.Body, err +} + +// Arguments for the GetTestSubResultAttachmentZip function +type GetTestSubResultAttachmentZipArgs struct { + // (required) Project ID or project name + Project *string + // (required) ID of the test run that contains the result. + RunId *int + // (required) ID of the test results that contains sub result. + TestCaseResultId *int + // (required) ID of the test result attachment to be downloaded + AttachmentId *int + // (required) ID of the test sub result whose attachment has to be downloaded + TestSubResultId *int +} + +// [Preview API] Get history of a test method using TestHistoryQuery +func (client *ClientImpl) QueryTestHistory(ctx context.Context, args QueryTestHistoryArgs) (*TestHistoryQuery, error) { + if args.Filter == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Filter"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + + body, marshalErr := json.Marshal(*args.Filter) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("929fd86c-3e38-4d8c-b4b6-90df256e5971") + resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.2", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue TestHistoryQuery + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the QueryTestHistory function +type QueryTestHistoryArgs struct { + // (required) TestHistoryQuery to get history + Filter *TestHistoryQuery + // (required) Project ID or project name + Project *string +} + // Query Test Runs based on filters. Mandatory fields are minLastUpdatedDate and maxLastUpdatedDate. -func (client *Client) QueryTestRuns(ctx context.Context, args QueryTestRunsArgs) (*QueryTestRunsResponseValue, error) { +func (client *ClientImpl) QueryTestRuns(ctx context.Context, args QueryTestRunsArgs) (*QueryTestRunsResponseValue, error) { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1572,25 +1823,25 @@ type QueryTestRunsArgs struct { MaxLastUpdatedDate *azuredevops.Time // (optional) Current state of the Runs to be queried. State *TestRunState - // (optional) Plan Ids of the Runs to be queried, comma seperated list of valid ids (limit no. of ids 10). + // (optional) Plan Ids of the Runs to be queried, comma separated list of valid ids (limit no. of ids 10). PlanIds *[]int // (optional) Automation type of the Runs to be queried. IsAutomated *bool // (optional) PublishContext of the Runs to be queried. PublishContext *TestRunPublishContext - // (optional) Build Ids of the Runs to be queried, comma seperated list of valid ids (limit no. of ids 10). + // (optional) Build Ids of the Runs to be queried, comma separated list of valid ids (limit no. of ids 10). BuildIds *[]int - // (optional) Build Definition Ids of the Runs to be queried, comma seperated list of valid ids (limit no. of ids 10). + // (optional) Build Definition Ids of the Runs to be queried, comma separated list of valid ids (limit no. of ids 10). BuildDefIds *[]int // (optional) Source Branch name of the Runs to be queried. BranchName *string - // (optional) Release Ids of the Runs to be queried, comma seperated list of valid ids (limit no. of ids 10). + // (optional) Release Ids of the Runs to be queried, comma separated list of valid ids (limit no. of ids 10). ReleaseIds *[]int - // (optional) Release Definition Ids of the Runs to be queried, comma seperated list of valid ids (limit no. of ids 10). + // (optional) Release Definition Ids of the Runs to be queried, comma separated list of valid ids (limit no. of ids 10). ReleaseDefIds *[]int - // (optional) Release Environment Ids of the Runs to be queried, comma seperated list of valid ids (limit no. of ids 10). + // (optional) Release Environment Ids of the Runs to be queried, comma separated list of valid ids (limit no. of ids 10). ReleaseEnvIds *[]int - // (optional) Release Environment Definition Ids of the Runs to be queried, comma seperated list of valid ids (limit no. of ids 10). + // (optional) Release Environment Definition Ids of the Runs to be queried, comma separated list of valid ids (limit no. of ids 10). ReleaseEnvDefIds *[]int // (optional) Run Title of the Runs to be queried. RunTitle *string @@ -1607,308 +1858,8 @@ type QueryTestRunsResponseValue struct { ContinuationToken string } -// Update test run by its ID. -func (client *Client) UpdateTestRun(ctx context.Context, args UpdateTestRunArgs) (*TestRun, error) { - if args.RunUpdateModel == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunUpdateModel"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.RunId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} - } - routeValues["runId"] = strconv.Itoa(*args.RunId) - - body, marshalErr := json.Marshal(*args.RunUpdateModel) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("cadb3810-d47d-4a3c-a234-fe5f3be50138") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue TestRun - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdateTestRun function -type UpdateTestRunArgs struct { - // (required) Run details RunUpdateModel - RunUpdateModel *RunUpdateModel - // (required) Project ID or project name - Project *string - // (required) ID of the run to update. - RunId *int -} - -// [Preview API] Create a test session -func (client *Client) CreateTestSession(ctx context.Context, args CreateTestSessionArgs) (*TestSession, error) { - if args.TestSession == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestSession"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.Team != nil && *args.Team != "" { - routeValues["team"] = *args.Team - } - - body, marshalErr := json.Marshal(*args.TestSession) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("1500b4b4-6c69-4ca6-9b18-35e9e97fe2ac") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue TestSession - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the CreateTestSession function -type CreateTestSessionArgs struct { - // (required) Test session details for creation - TestSession *TestSession - // (required) Project ID or project name - Project *string - // (optional) Team ID or team name - Team *string -} - -// [Preview API] Get a list of test sessions -func (client *Client) GetTestSessions(ctx context.Context, args GetTestSessionsArgs) (*[]TestSession, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.Team != nil && *args.Team != "" { - routeValues["team"] = *args.Team - } - - queryParams := url.Values{} - if args.Period != nil { - queryParams.Add("period", strconv.Itoa(*args.Period)) - } - if args.AllSessions != nil { - queryParams.Add("allSessions", strconv.FormatBool(*args.AllSessions)) - } - if args.IncludeAllProperties != nil { - queryParams.Add("includeAllProperties", strconv.FormatBool(*args.IncludeAllProperties)) - } - if args.Source != nil { - queryParams.Add("source", string(*args.Source)) - } - if args.IncludeOnlyCompletedSessions != nil { - queryParams.Add("includeOnlyCompletedSessions", strconv.FormatBool(*args.IncludeOnlyCompletedSessions)) - } - locationId, _ := uuid.Parse("1500b4b4-6c69-4ca6-9b18-35e9e97fe2ac") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1-preview.1", routeValues, queryParams, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []TestSession - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetTestSessions function -type GetTestSessionsArgs struct { - // (required) Project ID or project name - Project *string - // (optional) Team ID or team name - Team *string - // (optional) Period in days from now, for which test sessions are fetched. - Period *int - // (optional) If false, returns test sessions for current user. Otherwise, it returns test sessions for all users - AllSessions *bool - // (optional) If true, it returns all properties of the test sessions. Otherwise, it returns the skinny version. - IncludeAllProperties *bool - // (optional) Source of the test session. - Source *TestSessionSource - // (optional) If true, it returns test sessions in completed state. Otherwise, it returns test sessions for all states - IncludeOnlyCompletedSessions *bool -} - -// [Preview API] Update a test session -func (client *Client) UpdateTestSession(ctx context.Context, args UpdateTestSessionArgs) (*TestSession, error) { - if args.TestSession == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestSession"} - } - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.Team != nil && *args.Team != "" { - routeValues["team"] = *args.Team - } - - body, marshalErr := json.Marshal(*args.TestSession) - if marshalErr != nil { - return nil, marshalErr - } - locationId, _ := uuid.Parse("1500b4b4-6c69-4ca6-9b18-35e9e97fe2ac") - resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue TestSession - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the UpdateTestSession function -type UpdateTestSessionArgs struct { - // (required) Test session details for update - TestSession *TestSession - // (required) Project ID or project name - Project *string - // (optional) Team ID or team name - Team *string -} - -// Add test cases to suite. -func (client *Client) AddTestCasesToSuite(ctx context.Context, args AddTestCasesToSuiteArgs) (*[]SuiteTestCase, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.PlanId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PlanId"} - } - routeValues["planId"] = strconv.Itoa(*args.PlanId) - if args.SuiteId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.SuiteId"} - } - routeValues["suiteId"] = strconv.Itoa(*args.SuiteId) - if args.TestCaseIds == nil || *args.TestCaseIds == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.TestCaseIds"} - } - routeValues["testCaseIds"] = *args.TestCaseIds - routeValues["action"] = "TestCases" - - locationId, _ := uuid.Parse("a4a1ec1c-b03f-41ca-8857-704594ecf58e") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []SuiteTestCase - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the AddTestCasesToSuite function -type AddTestCasesToSuiteArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the test plan that contains the suite. - PlanId *int - // (required) ID of the test suite to which the test cases must be added. - SuiteId *int - // (required) IDs of the test cases to add to the suite. Ids are specified in comma separated format. - TestCaseIds *string -} - -// Get a specific test case in a test suite with test case id. -func (client *Client) GetTestCaseById(ctx context.Context, args GetTestCaseByIdArgs) (*SuiteTestCase, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.PlanId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PlanId"} - } - routeValues["planId"] = strconv.Itoa(*args.PlanId) - if args.SuiteId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.SuiteId"} - } - routeValues["suiteId"] = strconv.Itoa(*args.SuiteId) - if args.TestCaseIds == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseIds"} - } - routeValues["testCaseIds"] = strconv.Itoa(*args.TestCaseIds) - routeValues["action"] = "TestCases" - - locationId, _ := uuid.Parse("a4a1ec1c-b03f-41ca-8857-704594ecf58e") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue SuiteTestCase - err = client.Client.UnmarshalBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetTestCaseById function -type GetTestCaseByIdArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the test plan that contains the suites. - PlanId *int - // (required) ID of the suite that contains the test case. - SuiteId *int - // (required) ID of the test case to get. - TestCaseIds *int -} - -// Get all test cases in a suite. -func (client *Client) GetTestCases(ctx context.Context, args GetTestCasesArgs) (*[]SuiteTestCase, error) { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.PlanId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PlanId"} - } - routeValues["planId"] = strconv.Itoa(*args.PlanId) - if args.SuiteId == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.SuiteId"} - } - routeValues["suiteId"] = strconv.Itoa(*args.SuiteId) - routeValues["action"] = "TestCases" - - locationId, _ := uuid.Parse("a4a1ec1c-b03f-41ca-8857-704594ecf58e") - resp, err := client.Client.Send(ctx, http.MethodGet, locationId, "5.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return nil, err - } - - var responseValue []SuiteTestCase - err = client.Client.UnmarshalCollectionBody(resp, &responseValue) - return &responseValue, err -} - -// Arguments for the GetTestCases function -type GetTestCasesArgs struct { - // (required) Project ID or project name - Project *string - // (required) ID of the test plan that contains the suites. - PlanId *int - // (required) ID of the suite to get. - SuiteId *int -} - // The test points associated with the test cases are removed from the test suite. The test case work item is not deleted from the system. See test cases resource to delete a test case permanently. -func (client *Client) RemoveTestCasesFromSuiteUrl(ctx context.Context, args RemoveTestCasesFromSuiteUrlArgs) error { +func (client *ClientImpl) RemoveTestCasesFromSuiteUrl(ctx context.Context, args RemoveTestCasesFromSuiteUrlArgs) error { routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} @@ -1949,8 +1900,42 @@ type RemoveTestCasesFromSuiteUrlArgs struct { TestCaseIds *string } +// [Preview API] Update test result retention settings +func (client *ClientImpl) UpdateResultRetentionSettings(ctx context.Context, args UpdateResultRetentionSettingsArgs) (*ResultRetentionSettings, error) { + if args.RetentionSettings == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RetentionSettings"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + + body, marshalErr := json.Marshal(*args.RetentionSettings) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("a3206d9e-fa8d-42d3-88cb-f75c51e69cde") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue ResultRetentionSettings + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateResultRetentionSettings function +type UpdateResultRetentionSettingsArgs struct { + // (required) Test result retention settings details to be updated + RetentionSettings *ResultRetentionSettings + // (required) Project ID or project name + Project *string +} + // Updates the properties of the test case association in a suite. -func (client *Client) UpdateSuiteTestCases(ctx context.Context, args UpdateSuiteTestCasesArgs) (*[]SuiteTestCase, error) { +func (client *ClientImpl) UpdateSuiteTestCases(ctx context.Context, args UpdateSuiteTestCasesArgs) (*[]SuiteTestCase, error) { if args.SuiteTestCaseUpdateModel == nil { return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.SuiteTestCaseUpdateModel"} } @@ -2002,65 +1987,173 @@ type UpdateSuiteTestCasesArgs struct { TestCaseIds *string } -// [Preview API] Delete a test case. -func (client *Client) DeleteTestCase(ctx context.Context, args DeleteTestCaseArgs) error { - routeValues := make(map[string]string) - if args.Project == nil || *args.Project == "" { - return &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} - } - routeValues["project"] = *args.Project - if args.TestCaseId == nil { - return &azuredevops.ArgumentNilError{ArgumentName: "args.TestCaseId"} - } - routeValues["testCaseId"] = strconv.Itoa(*args.TestCaseId) - - locationId, _ := uuid.Parse("4d472e0f-e32c-4ef8-adf4-a4078772889c") - _, err := client.Client.Send(ctx, http.MethodDelete, locationId, "5.1-preview.1", routeValues, nil, nil, "", "application/json", nil) - if err != nil { - return err - } - - return nil -} - -// Arguments for the DeleteTestCase function -type DeleteTestCaseArgs struct { - // (required) Project ID or project name - Project *string - // (required) Id of test case to delete. - TestCaseId *int -} - -// [Preview API] Get history of a test method using TestHistoryQuery -func (client *Client) QueryTestHistory(ctx context.Context, args QueryTestHistoryArgs) (*TestHistoryQuery, error) { - if args.Filter == nil { - return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Filter"} +// Update test points. +func (client *ClientImpl) UpdateTestPoints(ctx context.Context, args UpdateTestPointsArgs) (*[]TestPoint, error) { + if args.PointUpdateModel == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PointUpdateModel"} } routeValues := make(map[string]string) if args.Project == nil || *args.Project == "" { return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} } routeValues["project"] = *args.Project + if args.PlanId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.PlanId"} + } + routeValues["planId"] = strconv.Itoa(*args.PlanId) + if args.SuiteId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.SuiteId"} + } + routeValues["suiteId"] = strconv.Itoa(*args.SuiteId) + if args.PointIds == nil || *args.PointIds == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.PointIds"} + } + routeValues["pointIds"] = *args.PointIds - body, marshalErr := json.Marshal(*args.Filter) + body, marshalErr := json.Marshal(*args.PointUpdateModel) if marshalErr != nil { return nil, marshalErr } - locationId, _ := uuid.Parse("929fd86c-3e38-4d8c-b4b6-90df256e5971") - resp, err := client.Client.Send(ctx, http.MethodPost, locationId, "5.1-preview.2", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + locationId, _ := uuid.Parse("3bcfd5c8-be62-488e-b1da-b8289ce9299c") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) if err != nil { return nil, err } - var responseValue TestHistoryQuery + var responseValue []TestPoint + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateTestPoints function +type UpdateTestPointsArgs struct { + // (required) Data to update. + PointUpdateModel *PointUpdateModel + // (required) Project ID or project name + Project *string + // (required) ID of the test plan. + PlanId *int + // (required) ID of the suite that contains the points. + SuiteId *int + // (required) ID of the test point to get. Use a comma-separated list of IDs to update multiple test points. + PointIds *string +} + +// Update test results in a test run. +func (client *ClientImpl) UpdateTestResults(ctx context.Context, args UpdateTestResultsArgs) (*[]TestCaseResult, error) { + if args.Results == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.Results"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RunId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + } + routeValues["runId"] = strconv.Itoa(*args.RunId) + + body, marshalErr := json.Marshal(*args.Results) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("4637d869-3a76-4468-8057-0bb02aa385cf") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue []TestCaseResult + err = client.Client.UnmarshalCollectionBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateTestResults function +type UpdateTestResultsArgs struct { + // (required) List of test results to update. + Results *[]TestCaseResult + // (required) Project ID or project name + Project *string + // (required) Test run ID whose test results to update. + RunId *int +} + +// Update test run by its ID. +func (client *ClientImpl) UpdateTestRun(ctx context.Context, args UpdateTestRunArgs) (*TestRun, error) { + if args.RunUpdateModel == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunUpdateModel"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.RunId == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.RunId"} + } + routeValues["runId"] = strconv.Itoa(*args.RunId) + + body, marshalErr := json.Marshal(*args.RunUpdateModel) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("cadb3810-d47d-4a3c-a234-fe5f3be50138") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue TestRun err = client.Client.UnmarshalBody(resp, &responseValue) return &responseValue, err } -// Arguments for the QueryTestHistory function -type QueryTestHistoryArgs struct { - // (required) TestHistoryQuery to get history - Filter *TestHistoryQuery +// Arguments for the UpdateTestRun function +type UpdateTestRunArgs struct { + // (required) Run details RunUpdateModel + RunUpdateModel *RunUpdateModel // (required) Project ID or project name Project *string + // (required) ID of the run to update. + RunId *int +} + +// [Preview API] Update a test session +func (client *ClientImpl) UpdateTestSession(ctx context.Context, args UpdateTestSessionArgs) (*TestSession, error) { + if args.TestSession == nil { + return nil, &azuredevops.ArgumentNilError{ArgumentName: "args.TestSession"} + } + routeValues := make(map[string]string) + if args.Project == nil || *args.Project == "" { + return nil, &azuredevops.ArgumentNilOrEmptyError{ArgumentName: "args.Project"} + } + routeValues["project"] = *args.Project + if args.Team != nil && *args.Team != "" { + routeValues["team"] = *args.Team + } + + body, marshalErr := json.Marshal(*args.TestSession) + if marshalErr != nil { + return nil, marshalErr + } + locationId, _ := uuid.Parse("1500b4b4-6c69-4ca6-9b18-35e9e97fe2ac") + resp, err := client.Client.Send(ctx, http.MethodPatch, locationId, "5.1-preview.1", routeValues, nil, bytes.NewReader(body), "application/json", "application/json", nil) + if err != nil { + return nil, err + } + + var responseValue TestSession + err = client.Client.UnmarshalBody(resp, &responseValue) + return &responseValue, err +} + +// Arguments for the UpdateTestSession function +type UpdateTestSessionArgs struct { + // (required) Test session details for update + TestSession *TestSession + // (required) Project ID or project name + Project *string + // (optional) Team ID or team name + Team *string } diff --git a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/test/models.go b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/test/models.go index 47c1f1e2..b8a0ae75 100644 --- a/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/test/models.go +++ b/vendor/github.com/Microsoft/azure-devops-go-api/azuredevops/test/models.go @@ -238,7 +238,7 @@ type CloneOperationInformation struct { SourcePlan *ShallowReference `json:"sourcePlan,omitempty"` // Shallow reference of the source SourceProject *ShallowReference `json:"sourceProject,omitempty"` - // Current state of the operation. When State reaches Suceeded or Failed, the operation is complete + // Current state of the operation. When State reaches Succeeded or Failed, the operation is complete State *CloneOperationState `json:"state,omitempty"` // Url for getting the clone information Url *string `json:"url,omitempty"` diff --git a/vendor/github.com/PagerDuty/go-pagerduty/LICENSE.txt b/vendor/github.com/PagerDuty/go-pagerduty/LICENSE.txt index 0c80aa6c..e872ebb3 100644 --- a/vendor/github.com/PagerDuty/go-pagerduty/LICENSE.txt +++ b/vendor/github.com/PagerDuty/go-pagerduty/LICENSE.txt @@ -1,14 +1,201 @@ -Copyright:: Copyright (c) 2016 PagerDuty, Inc. -License:: Apache License, Version 2.0 + Apache License + Version 2.0, January 2004 + http://www.apache.org/licenses/ -Licensed under the Apache License, Version 2.0 (the "License"); -you may not use this file except in compliance with the License. -You may obtain a copy of the License at + TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION - http://www.apache.org/licenses/LICENSE-2.0 + 1. Definitions. -Unless required by applicable law or agreed to in writing, software -distributed under the License is distributed on an "AS IS" BASIS, -WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -See the License for the specific language governing permissions and -limitations under the License. + "License" shall mean the terms and conditions for use, reproduction, + and distribution as defined by Sections 1 through 9 of this document. + + "Licensor" shall mean the copyright owner or entity authorized by + the copyright owner that is granting the License. + + "Legal Entity" shall mean the union of the acting entity and all + other entities that control, are controlled by, or are under common + control with that entity. For the purposes of this definition, + "control" means (i) the power, direct or indirect, to cause the + direction or management of such entity, whether by contract or + otherwise, or (ii) ownership of fifty percent (50%) or more of the + outstanding shares, or (iii) beneficial ownership of such entity. + + "You" (or "Your") shall mean an individual or Legal Entity + exercising permissions granted by this License. + + "Source" form shall mean the preferred form for making modifications, + including but not limited to software source code, documentation + source, and configuration files. + + "Object" form shall mean any form resulting from mechanical + transformation or translation of a Source form, including but + not limited to compiled object code, generated documentation, + and conversions to other media types. + + "Work" shall mean the work of authorship, whether in Source or + Object form, made available under the License, as indicated by a + copyright notice that is included in or attached to the work + (an example is provided in the Appendix below). + + "Derivative Works" shall mean any work, whether in Source or Object + form, that is based on (or derived from) the Work and for which the + editorial revisions, annotations, elaborations, or other modifications + represent, as a whole, an original work of authorship. For the purposes + of this License, Derivative Works shall not include works that remain + separable from, or merely link (or bind by name) to the interfaces of, + the Work and Derivative Works thereof. + + "Contribution" shall mean any work of authorship, including + the original version of the Work and any modifications or additions + to that Work or Derivative Works thereof, that is intentionally + submitted to Licensor for inclusion in the Work by the copyright owner + or by an individual or Legal Entity authorized to submit on behalf of + the copyright owner. For the purposes of this definition, "submitted" + means any form of electronic, verbal, or written communication sent + to the Licensor or its representatives, including but not limited to + communication on electronic mailing lists, source code control systems, + and issue tracking systems that are managed by, or on behalf of, the + Licensor for the purpose of discussing and improving the Work, but + excluding communication that is conspicuously marked or otherwise + designated in writing by the copyright owner as "Not a Contribution." + + "Contributor" shall mean Licensor and any individual or Legal Entity + on behalf of whom a Contribution has been received by Licensor and + subsequently incorporated within the Work. + + 2. Grant of Copyright License. Subject to the terms and conditions of + this License, each Contributor hereby grants to You a perpetual, + worldwide, non-exclusive, no-charge, royalty-free, irrevocable + copyright license to reproduce, prepare Derivative Works of, + publicly display, publicly perform, sublicense, and distribute the + Work and such Derivative Works in Source or Object form. + + 3. Grant of Patent License. Subject to the terms and conditions of + this License, each Contributor 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, and otherwise transfer the Work, + where such license applies only to those patent claims licensable + by such Contributor that are necessarily infringed by their + Contribution(s) alone or by combination of their Contribution(s) + with the Work to which such Contribution(s) was submitted. If You + institute patent litigation against any entity (including a + cross-claim or counterclaim in a lawsuit) alleging that the Work + or a Contribution incorporated within the Work constitutes direct + or contributory patent infringement, then any patent licenses + granted to You under this License for that Work shall terminate + as of the date such litigation is filed. + + 4. Redistribution. You may reproduce and distribute copies of the + Work or Derivative Works thereof in any medium, with or without + modifications, and in Source or Object form, provided that You + meet the following conditions: + + (a) You must give any other recipients of the Work or + Derivative Works a copy of this License; and + + (b) You must cause any modified files to carry prominent notices + stating that You changed the files; and + + (c) You must retain, in the Source form of any Derivative Works + that You distribute, all copyright, patent, trademark, and + attribution notices from the Source form of the Work, + excluding those notices that do not pertain to any part of + the Derivative Works; and + + (d) If the Work includes a "NOTICE" text file as part of its + distribution, then any Derivative Works that You distribute must + include a readable copy of the attribution notices contained + within such NOTICE file, excluding those notices that do not + pertain to any part of the Derivative Works, in at least one + of the following places: within a NOTICE text file distributed + as part of the Derivative Works; within the Source form or + documentation, if provided along with the Derivative Works; or, + within a display generated by the Derivative Works, if and + wherever such third-party notices normally appear. The contents + of the NOTICE file are for informational purposes only and + do not modify the License. You may add Your own attribution + notices within Derivative Works that You distribute, alongside + or as an addendum to the NOTICE text from the Work, provided + that such additional attribution notices cannot be construed + as modifying the License. + + You may add Your own copyright statement to Your modifications and + may provide additional or different license terms and conditions + for use, reproduction, or distribution of Your modifications, or + for any such Derivative Works as a whole, provided Your use, + reproduction, and distribution of the Work otherwise complies with + the conditions stated in this License. + + 5. Submission of Contributions. Unless You explicitly state otherwise, + any Contribution intentionally submitted for inclusion in the Work + by You to the Licensor shall be under the terms and conditions of + this License, without any additional terms or conditions. + Notwithstanding the above, nothing herein shall supersede or modify + the terms of any separate license agreement you may have executed + with Licensor regarding such Contributions. + + 6. Trademarks. This License does not grant permission to use the trade + names, trademarks, service marks, or product names of the Licensor, + except as required for reasonable and customary use in describing the + origin of the Work and reproducing the content of the NOTICE file. + + 7. Disclaimer of Warranty. Unless required by applicable law or + agreed to in writing, Licensor provides the Work (and each + Contributor provides its Contributions) on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or + implied, including, without limitation, any warranties or conditions + of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A + PARTICULAR PURPOSE. You are solely responsible for determining the + appropriateness of using or redistributing the Work and assume any + risks associated with Your exercise of permissions under this License. + + 8. Limitation of Liability. In no event and under no legal theory, + whether in tort (including negligence), contract, or otherwise, + unless required by applicable law (such as deliberate and grossly + negligent acts) or agreed to in writing, shall any Contributor be + liable to You for damages, including any direct, indirect, special, + incidental, or consequential damages of any character arising as a + result of this License or out of the use or inability to use the + Work (including but not limited to damages for loss of goodwill, + work stoppage, computer failure or malfunction, or any and all + other commercial damages or losses), even if such Contributor + has been advised of the possibility of such damages. + + 9. Accepting Warranty or Additional Liability. While redistributing + the Work or Derivative Works thereof, You may choose to offer, + and charge a fee for, acceptance of support, warranty, indemnity, + or other liability obligations and/or rights consistent with this + License. However, in accepting such obligations, You may act only + on Your own behalf and on Your sole responsibility, not on behalf + of any other Contributor, and only if You agree to indemnify, + defend, and hold each Contributor harmless for any liability + incurred by, or claims asserted against, such Contributor by reason + of your accepting any such warranty or additional liability. + + END OF TERMS AND CONDITIONS + + APPENDIX: How to apply the Apache License to your work. + + To apply the Apache License to your work, attach the following + boilerplate notice, with the fields enclosed by brackets "[]" + replaced with your own identifying information. (Don't include + the brackets!) The text should be enclosed in the appropriate + comment syntax for the file format. We also recommend that a + file or class name and description of purpose be included on the + same "printed page" as the copyright notice for easier + identification within third-party archives. + + Copyright 2017 PagerDuty, Inc. + + Licensed under the Apache License, Version 2.0 (the "License"); + you may not use this file except in compliance with the License. + You may obtain a copy of the License at + + http://www.apache.org/licenses/LICENSE-2.0 + + Unless required by applicable law or agreed to in writing, software + distributed under the License is distributed on an "AS IS" BASIS, + WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + See the License for the specific language governing permissions and + limitations under the License. diff --git a/vendor/github.com/PagerDuty/go-pagerduty/README.md b/vendor/github.com/PagerDuty/go-pagerduty/README.md index aac3fa6b..eeb83444 100644 --- a/vendor/github.com/PagerDuty/go-pagerduty/README.md +++ b/vendor/github.com/PagerDuty/go-pagerduty/README.md @@ -5,15 +5,27 @@ go-pagerduty is a CLI and [go](https://golang.org/) client library for the [Page ## Installation -``` +First, download the source code +```cli go get github.com/PagerDuty/go-pagerduty ``` +Next build the application. +```cli +cd $GOPATH/src/github.com/PagerDuty/go-pagerduty +go build -o $GOPATH/bin/pd command/* +``` +If you do not have the dependencies necessary to build the project, run this in the project root and try again + +```cli +go get ./... +``` + ## Usage ### CLI -The CLI requires an [authentication token](https://v2.developer.pagerduty.com/docs/authentication), which can be sepcified in `.pd.yml` +The CLI requires an [authentication token](https://v2.developer.pagerduty.com/docs/authentication), which can be specified in `.pd.yml` file in the home directory of the user, or passed as a command-line argument. Example of config file: @@ -22,12 +34,6 @@ Example of config file: authtoken: fooBar ``` -#### Install -```cli -cd $GOPATH/github.com/PagerDuty/go-pagerduty -go build -o $GOPATH/bin/pd command/* -``` - #### Commands `pd` command provides a single entrypoint for all the API endpoints, with individual API represented by their own sub commands. For an exhaustive list of sub-commands, try: @@ -57,12 +63,12 @@ var authtoken = "" // Set your auth token here func main() { var opts pagerduty.ListEscalationPoliciesOptions client := pagerduty.NewClient(authtoken) - if eps, err := client.ListEscalationPolicies(opts); err != nil { + eps, err := client.ListEscalationPolicies(opts) + if err != nil { panic(err) - } else { - for _, p := range eps.EscalationPolicies { - fmt.Println(p.Name) - } + } + for _, p := range eps.EscalationPolicies { + fmt.Println(p.Name) } } ``` @@ -71,6 +77,8 @@ The PagerDuty API client also exposes its HTTP client as the `HTTPClient` field. If you need to use your own HTTP client, for doing things like defining your own transport settings, you can replace the default HTTP client with your own by simply by setting a new value in the `HTTPClient` field. +## License +[Apache License 2.0](http://www.apache.org/licenses/LICENSE-2.0) ## Contributing diff --git a/vendor/github.com/PagerDuty/go-pagerduty/client.go b/vendor/github.com/PagerDuty/go-pagerduty/client.go index 51aea355..6594f8bc 100644 --- a/vendor/github.com/PagerDuty/go-pagerduty/client.go +++ b/vendor/github.com/PagerDuty/go-pagerduty/client.go @@ -85,7 +85,8 @@ var defaultHTTPClient HTTPClient = newDefaultHTTPClient() // Client wraps http client type Client struct { - authToken string + authToken string + apiEndpoint string // HTTPClient is the HTTP client used for making requests against the // PagerDuty API. You can use either *http.Client here, or your own @@ -96,8 +97,9 @@ type Client struct { // NewClient creates an API client func NewClient(authToken string) *Client { return &Client{ - authToken: authToken, - HTTPClient: defaultHTTPClient, + authToken: authToken, + apiEndpoint: apiEndpoint, + HTTPClient: defaultHTTPClient, } } @@ -130,7 +132,7 @@ func (c *Client) get(path string) (*http.Response, error) { } func (c *Client) do(method, path string, body io.Reader, headers *map[string]string) (*http.Response, error) { - endpoint := apiEndpoint + path + endpoint := c.apiEndpoint + path req, _ := http.NewRequest(method, endpoint, body) req.Header.Set("Accept", "application/vnd.pagerduty+json;version=2") if headers != nil { diff --git a/vendor/github.com/PagerDuty/go-pagerduty/escalation_policy.go b/vendor/github.com/PagerDuty/go-pagerduty/escalation_policy.go index c8b50fe0..74befc66 100644 --- a/vendor/github.com/PagerDuty/go-pagerduty/escalation_policy.go +++ b/vendor/github.com/PagerDuty/go-pagerduty/escalation_policy.go @@ -23,9 +23,9 @@ type EscalationPolicy struct { APIObject Name string `json:"name,omitempty"` EscalationRules []EscalationRule `json:"escalation_rules,omitempty"` - Services []APIReference `json:"services,omitempty"` + Services []APIObject `json:"services,omitempty"` NumLoops uint `json:"num_loops,omitempty"` - Teams []APIReference `json:"teams,omitempty"` + Teams []APIReference `json:"teams"` Description string `json:"description,omitempty"` RepeatEnabled bool `json:"repeat_enabled,omitempty"` } diff --git a/vendor/github.com/PagerDuty/go-pagerduty/event_v2.go b/vendor/github.com/PagerDuty/go-pagerduty/event_v2.go index 8198dea9..1051cf79 100644 --- a/vendor/github.com/PagerDuty/go-pagerduty/event_v2.go +++ b/vendor/github.com/PagerDuty/go-pagerduty/event_v2.go @@ -14,6 +14,7 @@ type V2Event struct { Action string `json:"event_action"` DedupKey string `json:"dedup_key,omitempty"` Images []interface{} `json:"images,omitempty"` + Links []interface{} `json:"links,omitempty"` Client string `json:"client,omitempty"` ClientURL string `json:"client_url,omitempty"` Payload *V2Payload `json:"payload,omitempty"` diff --git a/vendor/github.com/PagerDuty/go-pagerduty/incident.go b/vendor/github.com/PagerDuty/go-pagerduty/incident.go index c172bb09..8dd8649f 100644 --- a/vendor/github.com/PagerDuty/go-pagerduty/incident.go +++ b/vendor/github.com/PagerDuty/go-pagerduty/incident.go @@ -7,28 +7,56 @@ import ( "github.com/google/go-querystring/query" ) -// Acknowledgement is the data structure of an acknoledgement of an incident. +// Acknowledgement is the data structure of an acknowledgement of an incident. type Acknowledgement struct { - At string - Acknowledger APIObject + At string `json:"at,omitempty"` + Acknowledger APIObject `json:"acknowledger,omitempty"` } // PendingAction is the data structure for any pending actions on an incident. type PendingAction struct { - Type string - At string + Type string `json:"type,omitempty"` + At string `json:"at,omitempty"` } // Assignment is the data structure for an assignment of an incident type Assignment struct { - At string - Assignee APIObject + At string `json:"at,omitempty"` + Assignee APIObject `json:"assignee,omitempty"` +} + +// AlertCounts is the data structure holding a summary of the number of alerts by status of an incident. +type AlertCounts struct { + Triggered uint `json:"triggered,omitempty"` + Resolved uint `json:"resolved,omitempty"` + All uint `json:"all,omitempty"` +} + +// Priority is the data structure describing the priority of an incident. +type Priority struct { + APIObject + Name string `json:"name,omitempty"` + Description string `json:"description,omitempty"` +} + +// Resolve reason is the data structure describing the reason an incident was resolved +type ResolveReason struct { + Type string `json:"type,omitempty"` + Incident APIObject `json:"incident"` +} + +// IncidentBody is the datastructure containing data describing the incident. +type IncidentBody struct { + Type string `json:"type,omitempty"` + Details string `json:"details,omitempty"` } // Incident is a normalized, de-duplicated event generated by a PagerDuty integration. type Incident struct { APIObject IncidentNumber uint `json:"incident_number,omitempty"` + Title string `json:"title,omitempty"` + Description string `json:"description,omitempty"` CreatedAt string `json:"created_at,omitempty"` PendingActions []PendingAction `json:"pending_actions,omitempty"` IncidentKey string `json:"incident_key,omitempty"` @@ -40,10 +68,14 @@ type Incident struct { FirstTriggerLogEntry APIObject `json:"first_trigger_log_entry,omitempty"` EscalationPolicy APIObject `json:"escalation_policy,omitempty"` Teams []APIObject `json:"teams,omitempty"` + Priority *Priority `json:"priority,omitempty"` Urgency string `json:"urgency,omitempty"` Status string `json:"status,omitempty"` Id string `json:"id,omitempty"` - Priority APIObject `json:"priority,omitempty"` + ResolveReason ResolveReason `json:"resolve_reason,omitempty"` + AlertCounts AlertCounts `json:"alert_counts,omitempty"` + Body IncidentBody `json:"body,omitempty"` + IsMergeable bool `json:"is_mergeable,omitempty"` } // ListIncidentsResponse is the response structure when calling the ListIncident API endpoint. @@ -83,32 +115,29 @@ func (c *Client) ListIncidents(o ListIncidentsOptions) (*ListIncidentsResponse, return &result, c.decodeJSON(resp, &result) } -// CreateIncident is the structure POST'd to the incidents endpoint. It wraps a CreateIncidentValue -type CreateIncident struct { - Incident CreateIncidentOptions `json:"incident"` -} - // createIncidentResponse is returned from the API when creating a response. type createIncidentResponse struct { - Incident Incident `json:incident` + Incident Incident `json:"incident"` } // CreateIncidentOptions is the structure used when POSTing to the CreateIncident API endpoint. type CreateIncidentOptions struct { - Type string `json:"type"` - Title string `json:"title"` - Service APIReference `json:"service"` - Priority APIReference `json:"priority"` - IncidentKey string `json:"incident_key"` - Body APIDetails `json:"body"` - EscalationPolicy APIReference `json:"escalation_policy"` + Type string `json:"type"` + Title string `json:"title"` + Service *APIReference `json:"service"` + Priority *APIReference `json:"priority,omitempty"` + IncidentKey string `json:"incident_key,omitempty"` + Body *APIDetails `json:"body,omitempty"` + EscalationPolicy *APIReference `json:"escalation_policy,omitempty"` } // CreateIncident creates an incident synchronously without a corresponding event from a monitoring service. -func (c *Client) CreateIncident(from string, i *CreateIncident) (*Incident, error) { +func (c *Client) CreateIncident(from string, o *CreateIncidentOptions) (*Incident, error) { headers := make(map[string]string) headers["From"] = from - resp, e := c.post("/incidents", i, &headers) + data := make(map[string]*CreateIncidentOptions) + data["incident"] = o + resp, e := c.post("/incidents", data, &headers) if e != nil { return nil, e } @@ -132,6 +161,16 @@ func (c *Client) ManageIncidents(from string, incidents []Incident) error { return e } +// MergeIncidents a list of source incidents into a specified incident. +func (c *Client) MergeIncidents(from string, id string, incidents []Incident) error { + r := make(map[string][]Incident) + r["source_incidents"] = incidents + headers := make(map[string]string) + headers["From"] = from + _, e := c.put("/incidents/"+id+"/merge", r, &headers) + return e +} + // GetIncident shows detailed information about an incident. func (c *Client) GetIncident(id string) (*Incident, error) { resp, err := c.get("/incidents/" + id) @@ -176,34 +215,43 @@ func (c *Client) ListIncidentNotes(id string) ([]IncidentNote, error) { // IncidentAlert is a alert for the specified incident. type IncidentAlert struct { - ID string `json:"id,omitempty"` - Summary string `json:"summary,omitempty"` - CreatedAt string `json:"created_at,omitempty"` - AlertKey string `json:"alert_key,omitempty"` + APIObject + CreatedAt string `json:"created_at,omitempty"` + Status string `json:"status,omitempty"` + AlertKey string `json:"alert_key,omitempty"` + Service APIObject `json:"service,omitempty"` + Body map[string]interface{} `json:"body,omitempty"` + Incident APIReference `json:"incident,omitempty"` + Suppressed bool `json:"suppressed,omitempty"` + Severity string `json:"severity,omitempty"` + Integration APIObject `json:"integration,omitempty"` +} + +// ListAlertsResponse is the response structure when calling the ListAlert API endpoint. +type ListAlertsResponse struct { + APIListObject + Alerts []IncidentAlert `json:"alerts,omitempty"` } // ListIncidentAlerts lists existing alerts for the specified incident. -func (c *Client) ListIncidentAlerts(id string) ([]IncidentAlert, error) { - resp, err := c.get("/incidents/"+id+"/alerts") +func (c *Client) ListIncidentAlerts(id string) (*ListAlertsResponse, error) { + resp, err := c.get("/incidents/" + id + "/alerts") if err != nil { return nil, err } - var result map[string][]IncidentAlert - if err := c.decodeJSON(resp, &result); err != nil { - return nil, err - } - alerts, ok := result["alerts"] - if !ok { - return nil, fmt.Errorf("JSON response does not have alerts field") - } - return alerts, nil + + var result ListAlertsResponse + return &result, c.decodeJSON(resp, &result) } // CreateIncidentNote creates a new note for the specified incident. func (c *Client) CreateIncidentNote(id string, note IncidentNote) error { data := make(map[string]IncidentNote) + headers := make(map[string]string) + headers["From"] = note.User.Summary + data["note"] = note - _, err := c.post("/incidents/"+id+"/notes", data, nil) + _, err := c.post("/incidents/"+id+"/notes", data, &headers) return err } @@ -242,3 +290,18 @@ func (c *Client) ListIncidentLogEntries(id string, o ListIncidentLogEntriesOptio var result ListIncidentLogEntriesResponse return &result, c.decodeJSON(resp, &result) } + +// Alert is a list of all of the alerts that happened to an incident. +type Alert struct { + APIObject + Service APIObject `json:"service,omitempty"` + CreatedAt string `json:"created_at,omitempty"` + Status string `json:"status,omitempty"` + AlertKey string `json:"alert_key,omitempty"` + Incident APIObject `json:"incident,omitempty"` +} + +type ListAlertResponse struct { + APIListObject + Alerts []Alert `json:"alerts,omitempty"` +} diff --git a/vendor/github.com/PagerDuty/go-pagerduty/log_entry.go b/vendor/github.com/PagerDuty/go-pagerduty/log_entry.go index e1fecc43..1b5e2fc0 100644 --- a/vendor/github.com/PagerDuty/go-pagerduty/log_entry.go +++ b/vendor/github.com/PagerDuty/go-pagerduty/log_entry.go @@ -68,7 +68,7 @@ func (c *Client) ListLogEntries(o ListLogEntriesOptions) (*ListLogEntryResponse, // GetLogEntryOptions is the data structure used when calling the GetLogEntry API endpoint. type GetLogEntryOptions struct { - TimeZone string `url:"timezone,omitempty"` + TimeZone string `url:"time_zone,omitempty"` Includes []string `url:"include,omitempty,brackets"` } diff --git a/vendor/github.com/PagerDuty/go-pagerduty/maintenance_window.go b/vendor/github.com/PagerDuty/go-pagerduty/maintenance_window.go index 2316f0fd..21e9061f 100644 --- a/vendor/github.com/PagerDuty/go-pagerduty/maintenance_window.go +++ b/vendor/github.com/PagerDuty/go-pagerduty/maintenance_window.go @@ -49,14 +49,25 @@ func (c *Client) ListMaintenanceWindows(o ListMaintenanceWindowsOptions) (*ListM return &result, c.decodeJSON(resp, &result) } -// CreateMaintenanceWindows creates a new maintenance window for the specified services. -func (c *Client) CreateMaintenanceWindows(m MaintenanceWindow) (*MaintenanceWindow, error) { +// CreateMaintenanceWindow creates a new maintenance window for the specified services. +func (c *Client) CreateMaintenanceWindow(from string, o MaintenanceWindow) (*MaintenanceWindow, error) { data := make(map[string]MaintenanceWindow) - data["maintenance_window"] = m - resp, err := c.post("/maintenance_windows", data, nil) + o.Type = "maintenance_window" + data["maintenance_window"] = o + headers := make(map[string]string) + if from != "" { + headers["From"] = from + } + resp, err := c.post("/maintenance_windows", data, &headers) return getMaintenanceWindowFromResponse(c, resp, err) } +// CreateMaintenanceWindows creates a new maintenance window for the specified services. +// Deprecated: Use `CreateMaintenanceWindow` instead. +func (c *Client) CreateMaintenanceWindows(o MaintenanceWindow) (*MaintenanceWindow, error) { + return c.CreateMaintenanceWindow("", o) +} + // DeleteMaintenanceWindow deletes an existing maintenance window if it's in the future, or ends it if it's currently on-going. func (c *Client) DeleteMaintenanceWindow(id string) error { _, err := c.delete("/maintenance_windows/" + id) diff --git a/vendor/github.com/PagerDuty/go-pagerduty/on_call.go b/vendor/github.com/PagerDuty/go-pagerduty/on_call.go index 6c7c3caf..537ef102 100644 --- a/vendor/github.com/PagerDuty/go-pagerduty/on_call.go +++ b/vendor/github.com/PagerDuty/go-pagerduty/on_call.go @@ -6,12 +6,12 @@ import ( // OnCall represents a contiguous unit of time for which a user will be on call for a given escalation policy and escalation rule. type OnCall struct { - User APIObject `json:"user,omitempty"` - Schedule APIObject `json:"schedule,omitempty"` - EscalationPolicy APIObject `json:"escalation_policy,omitempty"` - EscalationLevel uint `json:"escalation_level,omitempty"` - Start string `json:"start,omitempty"` - End string `json:"end,omitempty"` + User User `json:"user,omitempty"` + Schedule Schedule `json:"schedule,omitempty"` + EscalationPolicy EscalationPolicy `json:"escalation_policy,omitempty"` + EscalationLevel uint `json:"escalation_level,omitempty"` + Start string `json:"start,omitempty"` + End string `json:"end,omitempty"` } // ListOnCallsResponse is the data structure returned from calling the ListOnCalls API endpoint. diff --git a/vendor/github.com/PagerDuty/go-pagerduty/user.go b/vendor/github.com/PagerDuty/go-pagerduty/user.go index 92b170ed..62e15579 100644 --- a/vendor/github.com/PagerDuty/go-pagerduty/user.go +++ b/vendor/github.com/PagerDuty/go-pagerduty/user.go @@ -7,42 +7,51 @@ import ( "github.com/google/go-querystring/query" ) -// ContactMethod is a way of contacting the user. -type ContactMethod struct { - ID string - Label string - Address string - Type string - SendShortEmail bool `json:"send_short_email"` -} - // NotificationRule is a rule for notifying the user. type NotificationRule struct { - ID string + ID string `json:"id"` StartDelayInMinutes uint `json:"start_delay_in_minutes"` CreatedAt string `json:"created_at"` ContactMethod ContactMethod `json:"contact_method"` - Urgency string - Type string + Urgency string `json:"urgency"` + Type string `json:"type"` } // User is a member of a PagerDuty account that has the ability to interact with incidents and other data on the account. type User struct { APIObject - Name string `json:"name"` - Email string `json:"email"` - Timezone string `json:"timezone,omitempty"` - Color string `json:"color,omitempty"` - Role string `json:"role,omitempty"` - AvatarURL string `json:"avatar_url,omitempty"` - Description string `json:"description,omitempty"` - InvitationSent bool + Type string `json:"type"` + Name string `json:"name"` + Summary string `json:"summary"` + Email string `json:"email"` + Timezone string `json:"time_zone,omitempty"` + Color string `json:"color,omitempty"` + Role string `json:"role,omitempty"` + AvatarURL string `json:"avatar_url,omitempty"` + Description string `json:"description,omitempty"` + InvitationSent bool `json:"invitation_sent,omitempty"` ContactMethods []ContactMethod `json:"contact_methods"` NotificationRules []NotificationRule `json:"notification_rules"` JobTitle string `json:"job_title,omitempty"` Teams []Team } +// ContactMethod is a way of contacting the user. +type ContactMethod struct { + ID string `json:"id"` + Type string `json:"type"` + Summary string `json:"summary"` + Self string `json:"self"` + Label string `json:"label"` + Address string `json:"address"` + SendShortEmail bool `json:"send_short_email,omitempty"` + SendHTMLEmail bool `json:"send_html_email,omitempty"` + Blacklisted bool `json:"blacklisted,omitempty"` + CountryCode int `json:"country_code,omitempty"` + Enabled bool `json:"enabled,omitempty"` + HTMLUrl string `json:"html_url"` +} + // ListUsersResponse is the data structure returned from calling the ListUsers API endpoint. type ListUsersResponse struct { APIListObject @@ -57,6 +66,12 @@ type ListUsersOptions struct { Includes []string `url:"include,omitempty,brackets"` } +// ListContactMethodResponse is the data structure returned from calling the GetUserContactMethod API endpoint. +type ListContactMethodsResponse struct { + APIListObject + ContactMethods []ContactMethod `json:"contact_methods"` +} + // GetUserOptions is the data structure used when calling the GetUser API endpoint. type GetUserOptions struct { Includes []string `url:"include,omitempty,brackets"` @@ -123,3 +138,35 @@ func getUserFromResponse(c *Client, resp *http.Response, err error) (*User, erro } return &t, nil } + +// ListUserContactMethod fetches contact methods of the existing user. +func (c *Client) ListUserContactMethods(userId string) (*ListContactMethodsResponse, error) { + resp, err := c.get("/users/" + userId + "/contact_methods") + if err != nil { + return nil, err + } + var result ListContactMethodsResponse + return &result, c.decodeJSON(resp, &result) +} + +// GetContactMethod gets details about a contact method. +func (c *Client) GetUserContactMethod(userID, id string) (*ContactMethod, error) { + resp, err := c.get("/users/" + userID + "/contact_methods/" + id) + return getContactMethodFromResponse(c, resp, err) +} + +func getContactMethodFromResponse(c *Client, resp *http.Response, err error) (*ContactMethod, error) { + if err != nil { + return nil, err + } + var target map[string]ContactMethod + if dErr := c.decodeJSON(resp, &target); dErr != nil { + return nil, fmt.Errorf("Could not decode JSON response: %v", dErr) + } + rootNode := "contact_method" + t, nodeOK := target[rootNode] + if !nodeOK { + return nil, fmt.Errorf("JSON response does not have %s field", rootNode) + } + return &t, nil +} diff --git a/vendor/github.com/PagerDuty/go-pagerduty/vendor.go b/vendor/github.com/PagerDuty/go-pagerduty/vendor.go index 7a5bdd81..cb971602 100644 --- a/vendor/github.com/PagerDuty/go-pagerduty/vendor.go +++ b/vendor/github.com/PagerDuty/go-pagerduty/vendor.go @@ -10,15 +10,18 @@ import ( // Vendor represents a specific type of integration. AWS Cloudwatch, Splunk, Datadog, etc are all examples of vendors that can be integrated in PagerDuty by making an integration. type Vendor struct { APIObject - Name string `json:"name,omitempty"` - LogoURL string `json:"logo_url,omitempty"` - LongName string `json:"long_name,omitempty"` - WebsiteURL string `json:"website_url,omitempty"` - Description string `json:"description,omitempty"` - Connectable bool `json:"connectable,omitempty"` - ThumbnailURL string `json:"thumbnail_url,omitempty"` - GenericServiceType string `json:"generic_service_type,omitempty"` - IntegrationGuideURL string `json:"integration_guide_url,omitempty"` + Name string `json:"name,omitempty"` + LogoURL string `json:"logo_url,omitempty"` + LongName string `json:"long_name,omitempty"` + WebsiteURL string `json:"website_url,omitempty"` + Description string `json:"description,omitempty"` + Connectable bool `json:"connectable,omitempty"` + ThumbnailURL string `json:"thumbnail_url,omitempty"` + GenericServiceType string `json:"generic_service_type,omitempty"` + IntegrationGuideURL string `json:"integration_guide_url,omitempty"` + AlertCreationDefault string `json:"alert_creation_default,omitempty"` + AlertCreationEditable bool `json:"alert_creation_editable,omitempty"` + IsPDCEF bool `json:"is_pd_cef,omitempty"` } // ListVendorResponse is the data structure returned from calling the ListVendors API endpoint. diff --git a/vendor/github.com/PuerkitoBio/goquery/go.mod b/vendor/github.com/PuerkitoBio/goquery/go.mod index 15ac160c..2fa1332a 100644 --- a/vendor/github.com/PuerkitoBio/goquery/go.mod +++ b/vendor/github.com/PuerkitoBio/goquery/go.mod @@ -4,5 +4,3 @@ require ( github.com/andybalholm/cascadia v1.0.0 golang.org/x/net v0.0.0-20181114220301-adae6a3d119a ) - -go 1.13 diff --git a/vendor/github.com/VictorAvelar/devto-api-go/devto/articles.go b/vendor/github.com/VictorAvelar/devto-api-go/devto/articles.go index 0e1b07c2..9469e472 100644 --- a/vendor/github.com/VictorAvelar/devto-api-go/devto/articles.go +++ b/vendor/github.com/VictorAvelar/devto-api-go/devto/articles.go @@ -4,102 +4,224 @@ import ( "context" "encoding/json" "fmt" - "io/ioutil" "net/http" "strings" "github.com/google/go-querystring/query" ) -//ArticlesResource implements the APIResource interface -//for devto articles. +// ArticlesResource implements the APIResource interface +// for devto articles. type ArticlesResource struct { API *Client } -//List will return the articles uploaded to devto, the result -//can be narrowed down, filtered or enhanced using query +// List will return the articles uploaded to devto, the result +// can be narrowed down, filtered or enhanced using query // parameters as specified on the documentation. -//See: https://docs.dev.to/api/#tag/articles/paths/~1articles/get -func (ar *ArticlesResource) List(ctx context.Context, opt ArticleListOptions) ([]Article, error) { - var l []Article +// See: https://docs.dev.to/api/#tag/articles/paths/~1articles/get +func (ar *ArticlesResource) List(ctx context.Context, opt ArticleListOptions) ([]ListedArticle, error) { q, err := query.Values(opt) if err != nil { return nil, err } - req, _ := ar.API.NewRequest(http.MethodGet, fmt.Sprintf("api/articles?%s", q.Encode()), nil) - res, _ := ar.API.HTTPClient.Do(req) - cont, err := ioutil.ReadAll(res.Body) + req, err := ar.API.NewRequest(http.MethodGet, fmt.Sprintf("api/articles?%s", q.Encode()), nil) if err != nil { return nil, err } - json.Unmarshal(cont, &l) - return l, nil -} -//Find will retrieve an Article matching the ID passed. -func (ar *ArticlesResource) Find(ctx context.Context, id uint32) (Article, error) { - var art Article - req, _ := ar.API.NewRequest(http.MethodGet, fmt.Sprintf("api/articles/%d", id), nil) res, err := ar.API.HTTPClient.Do(req) if err != nil { - return art, err + return nil, err } - cont, err := ioutil.ReadAll(res.Body) + defer res.Body.Close() + + if nonSuccessfulResponse(res) { + return nil, unmarshalErrorResponse(res) + } + var articles []ListedArticle + if err := json.NewDecoder(res.Body).Decode(&articles); err != nil { + return nil, err + } + return articles, nil +} + +// ListForTag is a convenience method for retrieving articles +// for a particular tag, calling the base List method. +func (ar *ArticlesResource) ListForTag(ctx context.Context, tag string, page int) ([]ListedArticle, error) { + return ar.List(ctx, ArticleListOptions{Tags: tag, Page: page}) +} + +// ListForUser is a convenience method for retrieving articles +// written by a particular user, calling the base List method. +func (ar *ArticlesResource) ListForUser(ctx context.Context, username string, page int) ([]ListedArticle, error) { + return ar.List(ctx, ArticleListOptions{Username: username, Page: page}) +} + +// ListMyPublishedArticles lists all published articles +// written by the user authenticated with this client, +// erroring if the caller is not authenticated. Articles in +// the response will be listed in reverse chronological order +// by their publication times. +// +// If opts is nil, then no query parameters will be sent; the +// page number will be 1 and the page size will be 30 +// articles. +func (ar *ArticlesResource) ListMyPublishedArticles(ctx context.Context, opts *MyArticlesOptions) ([]ListedArticle, error) { + return ar.listMyArticles(ctx, "api/articles/me/published", opts) +} + +// ListMyUnpublishedArticles lists all unpublished articles +// written by the user authenticated with this client, +// erroring if the caller is not authenticated. Articles in +// the response will be listed in reverse chronological order +// by their creation times. +// +// If opts is nil, then no query parameters will be sent; the +// page number will be 1 and the page size will be 30 +// articles. +func (ar *ArticlesResource) ListMyUnpublishedArticles(ctx context.Context, opts *MyArticlesOptions) ([]ListedArticle, error) { + return ar.listMyArticles(ctx, "api/articles/me/unpublished", opts) +} + +// ListAllMyArticles lists all articles written by the user +// authenticated with this client, erroring if the caller is +// not authenticated. Articles in the response will be listed +// in reverse chronological order by their creation times, +// with unpublished articles listed before published articles. +// +// If opts is nil, then no query parameters will be sent; the +// page number will be 1 and the page size will be 30 +// articles. +func (ar *ArticlesResource) ListAllMyArticles(ctx context.Context, opts *MyArticlesOptions) ([]ListedArticle, error) { + return ar.listMyArticles(ctx, "api/articles/me/all", opts) +} + +// listMyArticles serves for handling roundtrips to the +// /api/articles/me/* endpoints, requesting articles from the +// endpoint passed in, and returning a list of articles. +func (ar *ArticlesResource) listMyArticles( + ctx context.Context, + endpoint string, + opts *MyArticlesOptions, +) ([]ListedArticle, error) { + if ar.API.Config.InsecureOnly { + return nil, ErrProtectedEndpoint + } + + req, err := ar.API.NewRequest(http.MethodGet, endpoint, nil) if err != nil { - return art, err + return nil, err + } + req.Header.Add(APIKeyHeader, ar.API.Config.APIKey) + + if opts != nil { + q, err := query.Values(opts) + if err != nil { + return nil, err + } + req.URL.RawQuery = q.Encode() + } + + res, err := ar.API.HTTPClient.Do(req) + if err != nil { + return nil, err + } + defer res.Body.Close() + + if nonSuccessfulResponse(res) { + return nil, unmarshalErrorResponse(res) + } + var articles []ListedArticle + if err := json.NewDecoder(res.Body).Decode(&articles); err != nil { + return nil, err + } + return articles, nil +} + +// Find will retrieve an Article matching the ID passed. +func (ar *ArticlesResource) Find(ctx context.Context, id uint32) (Article, error) { + req, err := ar.API.NewRequest(http.MethodGet, fmt.Sprintf("api/articles/%d", id), nil) + if err != nil { + return Article{}, err + } + + res, err := ar.API.HTTPClient.Do(req) + if err != nil { + return Article{}, err + } + defer res.Body.Close() + + if nonSuccessfulResponse(res) { + return Article{}, unmarshalErrorResponse(res) + } + var art Article + if err := json.NewDecoder(res.Body).Decode(&art); err != nil { + return Article{}, err } - json.Unmarshal(cont, &art) return art, nil } -//New will create a new article on dev.to -func (ar *ArticlesResource) New(ctx context.Context, a Article) (Article, error) { +// New will create a new article on dev.to +func (ar *ArticlesResource) New(ctx context.Context, u ArticleUpdate) (Article, error) { if ar.API.Config.InsecureOnly { - return a, ErrProtectedEndpoint + return Article{}, ErrProtectedEndpoint } - cont, err := json.Marshal(a) + cont, err := json.Marshal(&u) if err != nil { - return a, err + return Article{}, err } req, err := ar.API.NewRequest(http.MethodPost, "api/articles", strings.NewReader(string(cont))) if err != nil { - return a, err + return Article{}, err } req.Header.Add(APIKeyHeader, ar.API.Config.APIKey) res, err := ar.API.HTTPClient.Do(req) if err != nil { - return a, err + return Article{}, err } - content, err := ioutil.ReadAll(res.Body) - if err != nil { - return a, err + defer res.Body.Close() + + if nonSuccessfulResponse(res) { + return Article{}, unmarshalErrorResponse(res) + } + + var a Article + if err := json.NewDecoder(res.Body).Decode(&a); err != nil { + return Article{}, err } - json.Unmarshal(content, &a) return a, nil } -func (ar *ArticlesResource) Update(ctx context.Context, a Article) (Article, error) { +// Update will mutate the resource by id, and all the changes +// performed to the Article will be applied, thus validation +// on the API side. +func (ar *ArticlesResource) Update(ctx context.Context, u ArticleUpdate, id uint32) (Article, error) { if ar.API.Config.InsecureOnly { - return a, ErrProtectedEndpoint + return Article{}, ErrProtectedEndpoint } - cont, err := json.Marshal(a) + cont, err := json.Marshal(&u) if err != nil { - return a, err + return Article{}, err } - req, err := ar.API.NewRequest(http.MethodPut, fmt.Sprintf("api/articles/%d", a.ID), strings.NewReader(string(cont))) + req, err := ar.API.NewRequest(http.MethodPut, fmt.Sprintf("api/articles/%d", id), strings.NewReader(string(cont))) if err != nil { - return a, err + return Article{}, err } req.Header.Add(APIKeyHeader, ar.API.Config.APIKey) res, err := ar.API.HTTPClient.Do(req) if err != nil { - return a, err + return Article{}, err } - content, err := ioutil.ReadAll(res.Body) - if err != nil { - return a, err + defer res.Body.Close() + + if nonSuccessfulResponse(res) { + return Article{}, unmarshalErrorResponse(res) + } + + var a Article + if err := json.NewDecoder(res.Body).Decode(&a); err != nil { + return Article{}, err } - json.Unmarshal(content, &a) return a, nil } diff --git a/vendor/github.com/VictorAvelar/devto-api-go/devto/config.go b/vendor/github.com/VictorAvelar/devto-api-go/devto/config.go index 75c222e9..1ca1ed44 100644 --- a/vendor/github.com/VictorAvelar/devto-api-go/devto/config.go +++ b/vendor/github.com/VictorAvelar/devto-api-go/devto/config.go @@ -2,25 +2,25 @@ package devto import "errors" -//Confugration errors +// Configuration errors var ( ErrMissingRequiredParameter = errors.New("a required parameter is missing") ) -//Config contains the elements required to initialize a +// Config contains the elements required to initialize a // devto client. type Config struct { APIKey string InsecureOnly bool } -//NewConfig build a devto configuration instance with the -//required parameters. +// NewConfig build a devto configuration instance with the +// required parameters. // -//It takes a boolean (p) as first parameter to indicate if -//you need access to endpoints which require authentication, -//and a API key as second paramenter, if p is set to true and -//you don't provide an API key, it will return an error. +// It takes a boolean (p) as first parameter to indicate if +// you need access to endpoints which require authentication, +// and a API key as second parameter, if p is set to true and +// you don't provide an API key, it will return an error. func NewConfig(p bool, k string) (c *Config, err error) { if p == true && k == "" { return nil, ErrMissingRequiredParameter diff --git a/vendor/github.com/VictorAvelar/devto-api-go/devto/devto.go b/vendor/github.com/VictorAvelar/devto-api-go/devto/devto.go index e7c14907..3d7a1744 100644 --- a/vendor/github.com/VictorAvelar/devto-api-go/devto/devto.go +++ b/vendor/github.com/VictorAvelar/devto-api-go/devto/devto.go @@ -15,7 +15,7 @@ const ( APIKeyHeader string = "api-key" ) -//devto client errors +// devto client errors var ( ErrMissingConfig = errors.New("missing configuration") ErrProtectedEndpoint = errors.New("to use this resource you need to provide an authentication method") @@ -25,8 +25,8 @@ type httpClient interface { Do(req *http.Request) (res *http.Response, err error) } -//Client is the main data structure for performing actions -//against dev.to API +// Client is the main data structure for performing actions +// against dev.to API type Client struct { Context context.Context BaseURL *url.URL @@ -35,8 +35,8 @@ type Client struct { Articles *ArticlesResource } -//NewClient takes a context, a configuration pointer and optionally a -//base http client (bc) to build an Client instance. +// NewClient takes a context, a configuration pointer and optionally a +// base http client (bc) to build an Client instance. func NewClient(ctx context.Context, conf *Config, bc httpClient, bu string) (dev *Client, err error) { if bc == nil { bc = http.DefaultClient @@ -54,7 +54,10 @@ func NewClient(ctx context.Context, conf *Config, bc httpClient, bu string) (dev bu = BaseURL } - u, _ := url.Parse(bu) + u, err := url.Parse(bu) + if err != nil { + return nil, err + } c := &Client{ Context: ctx, @@ -66,7 +69,7 @@ func NewClient(ctx context.Context, conf *Config, bc httpClient, bu string) (dev return c, nil } -//NewRequest build the request relative to the client BaseURL +// NewRequest build the request relative to the client BaseURL func (c *Client) NewRequest(method string, uri string, body io.Reader) (*http.Request, error) { u, err := url.Parse(uri) if err != nil { diff --git a/vendor/github.com/VictorAvelar/devto-api-go/devto/doc.go b/vendor/github.com/VictorAvelar/devto-api-go/devto/doc.go new file mode 100644 index 00000000..5dd0a63b --- /dev/null +++ b/vendor/github.com/VictorAvelar/devto-api-go/devto/doc.go @@ -0,0 +1,10 @@ +// Package devto is a wrapper around dev.to REST API +// +// Where programmers share ideas and help each other grow. +// It is an online community for sharing and discovering great ideas, +// having debates, and making friends. Anyone can share articles, +// questions, discussions, etc. as long as they have the rights to the +// words they are sharing. Cross-posting from your own blog is welcome. +// +// See: https://docs.dev.to/api +package devto diff --git a/vendor/github.com/VictorAvelar/devto-api-go/devto/types.go b/vendor/github.com/VictorAvelar/devto-api-go/devto/types.go index c25dc08d..0a9b6894 100644 --- a/vendor/github.com/VictorAvelar/devto-api-go/devto/types.go +++ b/vendor/github.com/VictorAvelar/devto-api-go/devto/types.go @@ -1,12 +1,14 @@ package devto import ( + "encoding/json" + "fmt" "net/url" "strings" "time" ) -//User contains information about a devto account +// User contains information about a devto account type User struct { Name string `json:"name,omitempty"` Username string `json:"username,omitempty"` @@ -17,8 +19,8 @@ type User struct { ProfileImage90 *WebURL `json:"profile_image_90,omitempty"` } -//Organization describes a company or group that -//publishes content to devto. +// Organization describes a company or group that +// publishes content to devto. type Organization struct { Name string `json:"name,omitempty"` Username string `json:"username,omitempty"` @@ -27,40 +29,161 @@ type Organization struct { ProfileImage90 *WebURL `json:"profile_image_90,omitempty"` } -//Tags are a group of topics related to an article -type Tags []string - -//Article contains all the information related to a single -//information resource from devto. -type Article struct { - TypeOf string `json:"type_of,omitempty"` - ID uint32 `json:"id,omitempty"` - Title string `json:"title,omitempty"` - Description string `json:"description,omitempty"` - CoverImage *WebURL `json:"cover_image,omitempty"` - SocialImage *WebURL `json:"social_image,omitempty"` - PublishedAt *time.Time `json:"published_at,omitempty"` - EditedAt *time.Time `json:"edited_at,omitempty"` - CrossPostedAt *time.Time `json:"crossposted_at,omitempty"` - LastCommentAt *time.Time `json:"last_comment_at,omitempty"` - TagList Tags `json:"tag_list,omitempty"` - Tags string `json:"tags,omitempty"` - Slug string `json:"slug,omitempty"` - Path *WebURL `json:"path,omitempty"` - URL *WebURL `json:"url,omitempty"` - CanonicalURL *WebURL `json:"canonical_url,omitempty"` - CommentsCount uint `json:"comments_count,omitempty"` - PositiveReactionsCount uint `json:"positive_reactions_count,omitempty"` - PublishedTimestamp *time.Time `json:"published_timestamp,omitempty"` - User User `json:"user,omitempty"` - Organization Organization `json:"organization,omitempty"` - BodyHTML string `json:"body_html,omitempty"` - BodyMarkdown string `json:"body_markdown,omitempty"` - Published bool `json:"published,omitempty"` +// FlareTag represents an article's flare tag, if the article +// has one. +type FlareTag struct { + Name string `json:"name"` + BGColorHex string `json:"bg_color_hex"` + TextColorHex string `json:"text_color_hex"` } -//ArticleListOptions holds the query values to pass as -//query string parameter to the Articles List action. +// Tags are a group of topics related to an article +type Tags []string + +// This deserialization logic is so that if a listed article +// originates from the /articles endpoint instead of +// /articles/me/*, its Published field is returned as true, +// since /articles exclusively returns articles that have been +// published. +type listedArticleJSON struct { + TypeOf string `json:"type_of,omitempty"` + ID uint32 `json:"id,omitempty"` + Title string `json:"title,omitempty"` + Description string `json:"description,omitempty"` + CoverImage *WebURL `json:"cover_image,omitempty"` + PublishedAt *time.Time `json:"published_at,omitempty"` + PublishedTimestamp string `json:"published_timestamp,omitempty"` + TagList Tags `json:"tag_list,omitempty"` + Slug string `json:"slug,omitempty"` + Path string `json:"path,omitempty"` + URL *WebURL `json:"url,omitempty"` + CanonicalURL *WebURL `json:"canonical_url,omitempty"` + CommentsCount uint `json:"comments_count,omitempty"` + PositiveReactionsCount uint `json:"positive_reactions_count,omitempty"` + User User `json:"user,omitempty"` + Organization *Organization `json:"organization,omitempty"` + FlareTag *FlareTag `json:"flare_tag,omitempty"` + BodyMarkdown string `json:"body_markdown,omitempty"` + Published *bool `json:"published,omitempty"` +} + +func (j *listedArticleJSON) listedArticle() ListedArticle { + a := ListedArticle{ + TypeOf: j.TypeOf, + ID: j.ID, + Title: j.Title, + Description: j.Description, + CoverImage: j.CoverImage, + PublishedAt: j.PublishedAt, + PublishedTimestamp: j.PublishedTimestamp, + TagList: j.TagList, + Slug: j.Slug, + Path: j.Path, + URL: j.URL, + CanonicalURL: j.CanonicalURL, + CommentsCount: j.CommentsCount, + PositiveReactionsCount: j.PositiveReactionsCount, + User: j.User, + Organization: j.Organization, + FlareTag: j.FlareTag, + BodyMarkdown: j.BodyMarkdown, + } + + if j.Published != nil { + a.Published = *j.Published + } else { + // "published" currently is included in the API + // response for dev.to's /articles/me/* endpoints, + // but not in /articles, so we are setting this + // to true since /articles only returns articles + // that are published. + a.Published = true + } + return a +} + +// ListedArticle represents an article returned from one of +// the list articles endpoints (/articles, /articles/me/*). +type ListedArticle struct { + TypeOf string `json:"type_of,omitempty"` + ID uint32 `json:"id,omitempty"` + Title string `json:"title,omitempty"` + Description string `json:"description,omitempty"` + CoverImage *WebURL `json:"cover_image,omitempty"` + PublishedAt *time.Time `json:"published_at,omitempty"` + PublishedTimestamp string `json:"published_timestamp,omitempty"` + TagList Tags `json:"tag_list,omitempty"` + Slug string `json:"slug,omitempty"` + Path string `json:"path,omitempty"` + URL *WebURL `json:"url,omitempty"` + CanonicalURL *WebURL `json:"canonical_url,omitempty"` + CommentsCount uint `json:"comments_count,omitempty"` + PositiveReactionsCount uint `json:"positive_reactions_count,omitempty"` + User User `json:"user,omitempty"` + Organization *Organization `json:"organization,omitempty"` + FlareTag *FlareTag `json:"flare_tag,omitempty"` + // Only present in "/articles/me/*" endpoints + BodyMarkdown string `json:"body_markdown,omitempty"` + Published bool `json:"published,omitempty"` +} + +// UnmarshalJSON implements the JSON Unmarshaler interface. +func (a *ListedArticle) UnmarshalJSON(b []byte) error { + var j listedArticleJSON + if err := json.Unmarshal(b, &j); err != nil { + return err + } + + *a = j.listedArticle() + return nil +} + +// Article contains all the information related to a single +// information resource from devto. +type Article struct { + TypeOf string `json:"type_of,omitempty"` + ID uint32 `json:"id,omitempty"` + Title string `json:"title,omitempty"` + Description string `json:"description,omitempty"` + CoverImage *WebURL `json:"cover_image,omitempty"` + SocialImage *WebURL `json:"social_image,omitempty"` + ReadablePublishDate string `json:"readable_publish_date"` + Published bool `json:"published,omitempty"` + PublishedAt *time.Time `json:"published_at,omitempty"` + CreatedAt *time.Time `json:"created_at,omitempty"` + EditedAt *time.Time `json:"edited_at,omitempty"` + CrossPostedAt *time.Time `json:"crossposted_at,omitempty"` + LastCommentAt *time.Time `json:"last_comment_at,omitempty"` + TagList string `json:"tag_list,omitempty"` + Tags Tags `json:"tags,omitempty"` + Slug string `json:"slug,omitempty"` + Path *WebURL `json:"path,omitempty"` + URL *WebURL `json:"url,omitempty"` + CanonicalURL *WebURL `json:"canonical_url,omitempty"` + CommentsCount uint `json:"comments_count,omitempty"` + PositiveReactionsCount uint `json:"positive_reactions_count,omitempty"` + User User `json:"user,omitempty"` + BodyHTML string `json:"body_html,omitempty"` + BodyMarkdown string `json:"body_markdown,omitempty"` +} + +// ArticleUpdate represents an update to an article; it is +// used as the payload in POST and PUT requests for writing +// articles. +type ArticleUpdate struct { + Title string `json:"title"` + BodyMarkdown string `json:"body_markdown"` + Published bool `json:"published"` + Series *string `json:"series"` + MainImage string `json:"main_image,omitempty"` + CanonicalURL string `json:"canonical_url,omitempty"` + Description string `json:"description,omitempty"` + Tags []string `json:"tags,omitempty"` + OrganizationID int32 `json:"organization_id,omitempty"` +} + +// ArticleListOptions holds the query values to pass as +// query string parameter to the Articles List action. type ArticleListOptions struct { Tags string `url:"tag,omitempty"` Username string `url:"username,omitempty"` @@ -69,12 +192,21 @@ type ArticleListOptions struct { Page int `url:"page,omitempty"` } +// MyArticlesOptions defines pagination options used as query +// params in the dev.to "list my articles" endpoints. +type MyArticlesOptions struct { + Page int `url:"page,omitempty"` + PerPage int `url:"per_page,omitempty"` +} + +// WebURL is a class embed to override default unmarshal +// behavior. type WebURL struct { *url.URL } -//UnmarshalJSON overrides the default unmarshal behaviour -//for URL +// UnmarshalJSON overrides the default unmarshal behaviour +// for URL func (s *WebURL) UnmarshalJSON(b []byte) error { c := string(b) c = strings.Trim(c, "\"") @@ -85,3 +217,14 @@ func (s *WebURL) UnmarshalJSON(b []byte) error { s.URL = uri return nil } + +// ErrorResponse is an error returned from a dev.to API +// endpoint. +type ErrorResponse struct { + ErrorMessage string `json:"error"` + Status int `json:"status"` +} + +func (e *ErrorResponse) Error() string { + return fmt.Sprintf(`%d error: "%s"`, e.Status, e.ErrorMessage) +} diff --git a/vendor/github.com/VictorAvelar/devto-api-go/devto/utilities.go b/vendor/github.com/VictorAvelar/devto-api-go/devto/utilities.go new file mode 100644 index 00000000..e7b72201 --- /dev/null +++ b/vendor/github.com/VictorAvelar/devto-api-go/devto/utilities.go @@ -0,0 +1,38 @@ +package devto + +import ( + "encoding/json" + "fmt" + "io/ioutil" + "net/http" +) + +// nonSuccessfulResponse indicates that the status code for +// the HTTP response passed in was not one of the "success" +// (2XX) status codes +func nonSuccessfulResponse(res *http.Response) bool { return res.StatusCode/100 != 2 } + +// attempt to deserialize the error response; if it succeeds, +// the error will be an ErrorResponse, otherwise it will be +// an error indicating that the error response could not be +// deserialized. +func unmarshalErrorResponse(res *http.Response) error { + var e ErrorResponse + if err := json.NewDecoder(res.Body).Decode(&e); err != nil { + return fmt.Errorf( + `unexpected error deserializing %d response: "%v"`, + res.StatusCode, + err, + ) + } + return &e +} + +func decodeResponse(r *http.Response) []byte { + c, err := ioutil.ReadAll(r.Body) + if err != nil { + return []byte("") + } + defer r.Body.Close() + return c +} diff --git a/vendor/github.com/adlio/trello/board.go b/vendor/github.com/adlio/trello/board.go index f63b7ec7..66a4067e 100644 --- a/vendor/github.com/adlio/trello/board.go +++ b/vendor/github.com/adlio/trello/board.go @@ -20,6 +20,7 @@ type Board struct { Closed bool `json:"closed"` IDOrganization string `json:"idOrganization"` Pinned bool `json:"pinned"` + Starred bool `json:"starred"` URL string `json:"url"` ShortURL string `json:"shortUrl"` Prefs struct { @@ -42,6 +43,7 @@ type Board struct { CanBePrivate bool `json:"canBePrivate"` CanInvite bool `json:"canInvite"` } `json:"prefs"` + Subscribed bool `json:"subscribed"` LabelNames struct { Black string `json:"black,omitempty"` Blue string `json:"blue,omitempty"` @@ -85,7 +87,7 @@ func (b *Board) CreatedAt() time.Time { } // CreateBoard creates a board remote. -// Attribute currently supported as exra argument: powerUps. +// Attribute currently supported as exra argument: defaultLists, powerUps. // Attributes currently known to be unsupported: idBoardSource, keepFromSource. // // API Docs: https://developers.trello.com/reference/#boardsid @@ -118,6 +120,10 @@ func (c *Client) CreateBoard(board *Board, extraArgs Arguments) error { args["prefs_cardAging"] = board.Prefs.CardAging } + // Expects "true" or "false" + if defaultLists, ok := extraArgs["defaultLists"]; ok { + args["defaultLists"] = defaultLists + } // Expects one of "all", "calendar", "cardAging", "recap", or "voting". if powerUps, ok := extraArgs["powerUps"]; ok { args["powerUps"] = powerUps @@ -130,6 +136,12 @@ func (c *Client) CreateBoard(board *Board, extraArgs Arguments) error { return err } +// Update PUTs the supported board attributes remote and updates +// the struct from the returned values. +func (b *Board) Update(extraArgs Arguments) error { + return b.client.PutBoard(b, extraArgs) +} + // Delete makes a DELETE call for the receiver Board. func (b *Board) Delete(extraArgs Arguments) error { path := fmt.Sprintf("boards/%s", b.ID) @@ -162,6 +174,49 @@ func (m *Member) GetBoards(args Arguments) (boards []*Board, err error) { err = m.client.Get(path, args, &boards) for i := range boards { boards[i].client = m.client + + for j := range boards[i].Lists { + boards[i].Lists[j].client = m.client + } } return } + +// PutBoard PUTs a board remote. Extra arguments are currently unsupported. +// +// API Docs: https://developers.trello.com/reference#idnext +func (c *Client) PutBoard(board *Board, extraArgs Arguments) error { + path := fmt.Sprintf("boards/%s", board.ID) + args := Arguments{ + "desc": board.Desc, + "name": board.Name, + "prefs/selfJoin": fmt.Sprintf("%t", board.Prefs.SelfJoin), + "prefs/cardCovers": fmt.Sprintf("%t", board.Prefs.CardCovers), + "idOrganization": board.IDOrganization, + } + + if board.Prefs.Voting != "" { + args["prefs/voting"] = board.Prefs.Voting + } + if board.Prefs.PermissionLevel != "" { + args["prefs/permissionLevel"] = board.Prefs.PermissionLevel + } + if board.Prefs.Comments != "" { + args["prefs/comments"] = board.Prefs.Comments + } + if board.Prefs.Invitations != "" { + args["prefs/invitations"] = board.Prefs.Invitations + } + if board.Prefs.Background != "" { + args["prefs/background"] = board.Prefs.Background + } + if board.Prefs.CardAging != "" { + args["prefs/cardAging"] = board.Prefs.CardAging + } + + err := c.Put(path, args, &board) + if err == nil { + board.client = c + } + return err +} diff --git a/vendor/github.com/adlio/trello/card.go b/vendor/github.com/adlio/trello/card.go index 206739e3..a6fa0c8f 100644 --- a/vendor/github.com/adlio/trello/card.go +++ b/vendor/github.com/adlio/trello/card.go @@ -91,6 +91,7 @@ func (c *Card) CreatedAt() time.Time { return t } + // CustomFields returns the card's custom fields. func (c *Card) CustomFields(boardCustomFields []*CustomField) map[string]interface{} { @@ -99,14 +100,16 @@ func (c *Card) CustomFields(boardCustomFields []*CustomField) map[string]interfa if cfm == nil { cfm = &(map[string]interface{}{}) - // bcfOptionNames[CustomField ID] = Custom Field Name - bcfOptionNames := map[string]string{} + // bcfNames[CustomFieldItem ID] = Custom Field Name + bcfNames := map[string]string{} // bcfOptionsMap[CustomField ID][ID of the option] = Value of the option bcfOptionsMap := map[string]map[string]interface{}{} for _, bcf := range boardCustomFields { - bcfOptionNames[bcf.ID] = bcf.Name + bcfNames[bcf.ID] = bcf.Name + + //Options for Dropbox field for _, cf := range bcf.Options { // create 2nd level map when not available yet map2, ok := bcfOptionsMap[cf.IDCustomField] @@ -120,20 +123,23 @@ func (c *Card) CustomFields(boardCustomFields []*CustomField) map[string]interfa } for _, cf := range c.CustomFieldItems { - name := bcfOptionNames[cf.IDCustomField] + if name, ok := bcfNames[cf.IDCustomField]; ok { + if cf.Value.Get() != nil { + (*cfm)[name] = cf.Value.Get() + } else { // Dropbox + // create 2nd level map when not available yet + map2, ok := bcfOptionsMap[cf.IDCustomField] + if !ok { + continue + } + value, ok := map2[cf.IDValue] - // create 2nd level map when not available yet - map2, ok := bcfOptionsMap[cf.IDCustomField] - if !ok { - continue - } - value, ok := map2[cf.IDValue] - - if ok { - (*cfm)[name] = value + if ok { + (*cfm)[name] = value + } + } } } - c.customFieldMap = cfm } return *cfm } diff --git a/vendor/github.com/adlio/trello/client.go b/vendor/github.com/adlio/trello/client.go index b7acc718..42068717 100644 --- a/vendor/github.com/adlio/trello/client.go +++ b/vendor/github.com/adlio/trello/client.go @@ -6,7 +6,6 @@ package trello import ( - "bytes" "context" "encoding/json" "fmt" @@ -95,22 +94,7 @@ func (c *Client) Get(path string, args Arguments, target interface{}) error { } req = req.WithContext(c.ctx) - resp, err := c.Client.Do(req) - if err != nil { - return errors.Wrapf(err, "HTTP request failure on %s", url) - } - defer resp.Body.Close() - if resp.StatusCode != 200 { - return makeHTTPClientError(url, resp) - } - - decoder := json.NewDecoder(resp.Body) - err = decoder.Decode(target) - if err != nil { - return errors.Wrapf(err, "JSON decode failed on %s", url) - } - - return nil + return c.do(req, url, target) } // Put takes a path, Arguments, and a target interface (e.g. Board or Card). @@ -141,22 +125,7 @@ func (c *Client) Put(path string, args Arguments, target interface{}) error { return errors.Wrapf(err, "Invalid PUT request %s", url) } - resp, err := c.Client.Do(req) - if err != nil { - return errors.Wrapf(err, "HTTP request failure on %s", url) - } - defer resp.Body.Close() - if resp.StatusCode != 200 { - return makeHTTPClientError(url, resp) - } - - decoder := json.NewDecoder(resp.Body) - err = decoder.Decode(target) - if err != nil { - return errors.Wrapf(err, "JSON decode failed on %s", url) - } - - return nil + return c.do(req, url, target) } // Post takes a path, Arguments, and a target interface (e.g. Board or Card). @@ -187,26 +156,7 @@ func (c *Client) Post(path string, args Arguments, target interface{}) error { return errors.Wrapf(err, "Invalid POST request %s", url) } req.Header.Set("Content-Type", "application/x-www-form-urlencoded") - - resp, err := c.Client.Do(req) - if err != nil { - return errors.Wrapf(err, "HTTP request failure on %s", url) - } - - defer resp.Body.Close() - - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - return errors.Wrapf(err, "HTTP Read error on response for %s", url) - } - - decoder := json.NewDecoder(bytes.NewBuffer(b)) - err = decoder.Decode(target) - if err != nil { - return errors.Wrapf(err, "JSON decode failed on %s:\n%s", url, string(b)) - } - - return nil + return c.do(req, url, target) } // Delete takes a path, Arguments, and a target interface (e.g. Board or Card). @@ -236,24 +186,7 @@ func (c *Client) Delete(path string, args Arguments, target interface{}) error { return errors.Wrapf(err, "Invalid DELETE request %s", url) } - resp, err := c.Client.Do(req) - if err != nil { - return errors.Wrapf(err, "HTTP request failure on %s", url) - } - defer resp.Body.Close() - - b, err := ioutil.ReadAll(resp.Body) - if err != nil { - return errors.Wrapf(err, "HTTP Read error on response for %s", url) - } - - decoder := json.NewDecoder(bytes.NewBuffer(b)) - err = decoder.Decode(target) - if err != nil { - return errors.Wrapf(err, "JSON decode failed on %s:\n%s", url, string(b)) - } - - return nil + return c.do(req, url, target) } func (c *Client) log(format string, args ...interface{}) { @@ -261,3 +194,24 @@ func (c *Client) log(format string, args ...interface{}) { c.Logger.Debugf(format, args...) } } + +func (c *Client) do(req *http.Request, url string, target interface{}) error { + resp, err := c.Client.Do(req) + if err != nil { + return errors.Wrapf(err, "HTTP request failure on %s", url) + } + defer resp.Body.Close() + if resp.StatusCode < 200 || resp.StatusCode > 299 { + return makeHTTPClientError(url, resp) + } + + b, err := ioutil.ReadAll(resp.Body) + if err != nil { + return errors.Wrapf(err, "HTTP Read error on response for %s", url) + } + err = json.Unmarshal(b, target) + if err != nil { + return errors.Wrapf(err, "JSON decode failed on %s:\n%s", url, string(b)) + } + return nil +} diff --git a/vendor/github.com/adlio/trello/custom-fields.go b/vendor/github.com/adlio/trello/custom-fields.go index 30fc5e68..e4971ffe 100644 --- a/vendor/github.com/adlio/trello/custom-fields.go +++ b/vendor/github.com/adlio/trello/custom-fields.go @@ -1,14 +1,108 @@ package trello -import "fmt" +import ( + "database/sql/driver" + "encoding/json" + "fmt" + "strconv" + "time" +) // CustomFieldItem represents the custom field items of Trello a trello card. type CustomFieldItem struct { - ID string `json:"id"` - IDValue string `json:"idValue"` - IDCustomField string `json:"idCustomField"` - IDModel string `json:"idModel"` - IDModelType string `json:"modelType,omitempty"` + ID string `json:"id,omitempty"` + Value CustomFieldValue `json:"value,omitempty"` + IDValue string `json:"idValue,omitempty"` + IDCustomField string `json:"idCustomField,omitempty"` + IDModel string `json:"idModel,omitempty"` + IDModelType string `json:"modelType,omitempty"` +} +type CustomFieldValue struct { + val interface{} +} +type cfval struct { + Text string `json:"text,omitempty"` + Number string `json:"number,omitempty"` + Date string `json:"date,omitempty"` + Checked string `json:"checked,omitempty"` +} + +func NewCustomFieldValue(val interface{}) CustomFieldValue { + return CustomFieldValue{val: val} +} + +const timeFmt = "2006-01-02T15:04:05Z" + +func (v CustomFieldValue) Get() interface{} { + return v.val +} +func (v CustomFieldValue) String() string { + return fmt.Sprintf("%s", v.val) +} +func (v CustomFieldValue) MarshalJSON() ([]byte, error) { + val := v.val + + switchVal: + switch v := val.(type) { + case driver.Valuer: + var err error + val, err = v.Value() + if err != nil { + return nil, err + } + goto switchVal + case string: + return json.Marshal(cfval{Text: v}) + case int, int64: + return json.Marshal(cfval{Number: fmt.Sprintf("%d", v)}) + case float64: + return json.Marshal(cfval{Number: fmt.Sprintf("%f", v)}) + case bool: + if v { + return json.Marshal(cfval{Checked: "true"}) + } else { + return json.Marshal(cfval{Checked: "false"}) + } + case time.Time: + return json.Marshal(cfval{Date: v.Format(timeFmt)}) + default: + return nil, fmt.Errorf("unsupported type") + } +} +func (v *CustomFieldValue) UnmarshalJSON(b []byte) error { + cfval := cfval{} + err := json.Unmarshal(b, &cfval) + if err != nil { + return err + } + if cfval.Text != "" { + v.val = cfval.Text + } + if cfval.Date != "" { + v.val, err = time.Parse(timeFmt, cfval.Date) + if err != nil { + return err + } + } + if cfval.Checked != "" { + v.val = cfval.Checked == "true" + } + if cfval.Number != "" { + v.val, err = strconv.Atoi(cfval.Number) + if err != nil { + v.val, err = strconv.ParseFloat(cfval.Number, 64) + if err != nil { + v.val, err = strconv.ParseFloat(cfval.Number, 32) + if err != nil { + v.val, err = strconv.ParseInt(cfval.Number, 10, 64) + if err != nil { + return fmt.Errorf("cannot convert %s to number", cfval.Number) + } + } + } + } + } + return nil } // CustomField represents Trello's custom fields: "extra bits of structured data diff --git a/vendor/github.com/adlio/trello/list.go b/vendor/github.com/adlio/trello/list.go index fd39f209..70d950c1 100644 --- a/vendor/github.com/adlio/trello/list.go +++ b/vendor/github.com/adlio/trello/list.go @@ -13,14 +13,15 @@ import ( // List represents Trello lists. // https://developers.trello.com/reference/#list-object type List struct { - client *Client - ID string `json:"id"` - Name string `json:"name"` - IDBoard string `json:"idBoard,omitempty"` - Closed bool `json:"closed"` - Pos float32 `json:"pos,omitempty"` - Board *Board `json:"board,omitempty"` - Cards []*Card `json:"cards,omitempty"` + client *Client + ID string `json:"id"` + Name string `json:"name"` + IDBoard string `json:"idBoard,omitempty"` + Closed bool `json:"closed"` + Pos float32 `json:"pos,omitempty"` + Subscribed bool `json:"subscribed"` + Board *Board `json:"board,omitempty"` + Cards []*Card `json:"cards,omitempty"` } // CreatedAt returns the time.Time from the list's id. @@ -55,7 +56,6 @@ func (b *Board) GetLists(args Arguments) (lists []*List, err error) { return } - // CreateList creates a list. // Attribute currently supported as extra argument: pos. // Attributes currently known to be unsupported: idListSource. @@ -64,12 +64,12 @@ func (b *Board) GetLists(args Arguments) (lists []*List, err error) { func (c *Client) CreateList(onBoard *Board, name string, extraArgs Arguments) (list *List, err error) { path := "lists" args := Arguments{ - "name": name, - "pos": "top", + "name": name, + "pos": "top", "idBoard": onBoard.ID, } - if pos, ok := extraArgs["pos"]; ok{ + if pos, ok := extraArgs["pos"]; ok { args["pos"] = pos } @@ -88,4 +88,11 @@ func (c *Client) CreateList(onBoard *Board, name string, extraArgs Arguments) (l // API Docs: https://developers.trello.com/reference/#lists-1 func (b *Board) CreateList(name string, extraArgs Arguments) (list *List, err error) { return b.client.CreateList(b, name, extraArgs) -} \ No newline at end of file +} + +// Update UPDATEs the list's attributes. +// API Docs: https://developers.trello.com/reference/#listsid-1 +func (l *List) Update(args Arguments) error { + path := fmt.Sprintf("lists/%s", l.ID) + return l.client.Put(path, args, l) +} diff --git a/vendor/github.com/adlio/trello/webhook.go b/vendor/github.com/adlio/trello/webhook.go index 8b25ac86..9f32743b 100644 --- a/vendor/github.com/adlio/trello/webhook.go +++ b/vendor/github.com/adlio/trello/webhook.go @@ -61,7 +61,7 @@ func (c *Client) CreateWebhook(webhook *Webhook) error { return err } -// DeleteWebhook takes a webhook and deletes it +// Delete takes a webhook and deletes it func (w *Webhook) Delete(args Arguments) error { path := fmt.Sprintf("webhooks/%s", w.ID) return w.client.Delete(path, Arguments{}, w) diff --git a/vendor/github.com/alecthomas/chroma/.golangci.yml b/vendor/github.com/alecthomas/chroma/.golangci.yml index e03397e0..e47053f0 100644 --- a/vendor/github.com/alecthomas/chroma/.golangci.yml +++ b/vendor/github.com/alecthomas/chroma/.golangci.yml @@ -14,6 +14,10 @@ linters: - lll - gocyclo - dupl + - gochecknoglobals + - funlen + - godox + - wsl linters-settings: govet: @@ -42,3 +46,6 @@ issues: - 'Potential file inclusion via variable' - 'should have comment or be unexported' - 'comment on exported var .* should be of the form' + - 'at least one file in a package should have a package comment' + - 'string literal contains the Unicode' + - 'methods on the same type should have the same receiver name' diff --git a/vendor/github.com/alecthomas/chroma/.travis.yml b/vendor/github.com/alecthomas/chroma/.travis.yml index b9eaabc8..75dfcc27 100644 --- a/vendor/github.com/alecthomas/chroma/.travis.yml +++ b/vendor/github.com/alecthomas/chroma/.travis.yml @@ -2,9 +2,9 @@ sudo: false language: go script: - go test -v ./... - - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | bash -s v1.10.2 + - curl -sfL https://install.goreleaser.com/github.com/golangci/golangci-lint.sh | bash -s v1.20.0 - ./bin/golangci-lint run - git clean -fdx . after_success: - go get github.com/goreleaser/goreleaser && goreleaser + curl -sL https://git.io/goreleaser | bash && goreleaser diff --git a/vendor/github.com/alecthomas/chroma/README.md b/vendor/github.com/alecthomas/chroma/README.md index 5466bbc8..ac51f499 100644 --- a/vendor/github.com/alecthomas/chroma/README.md +++ b/vendor/github.com/alecthomas/chroma/README.md @@ -8,57 +8,68 @@ highlighted HTML, ANSI-coloured text, etc. Chroma is based heavily on [Pygments](http://pygments.org/), and includes translators for Pygments lexers and styles. + ## Table of Contents - + -1. [Supported languages](#supported-languages) -1. [Using the library](#using-the-library) +1. [Table of Contents](#table-of-contents) +2. [Supported languages](#supported-languages) +3. [Try it](#try-it) +4. [Using the library](#using-the-library) 1. [Quick start](#quick-start) - 1. [Identifying the language](#identifying-the-language) - 1. [Formatting the output](#formatting-the-output) - 1. [The HTML formatter](#the-html-formatter) -1. [More detail](#more-detail) + 2. [Identifying the language](#identifying-the-language) + 3. [Formatting the output](#formatting-the-output) + 4. [The HTML formatter](#the-html-formatter) +5. [More detail](#more-detail) 1. [Lexers](#lexers) - 1. [Formatters](#formatters) - 1. [Styles](#styles) -1. [Command-line interface](#command-line-interface) -1. [What's missing compared to Pygments?](#whats-missing-compared-to-pygments) + 2. [Formatters](#formatters) + 3. [Styles](#styles) +6. [Command-line interface](#command-line-interface) +7. [What's missing compared to Pygments?](#whats-missing-compared-to-pygments) - + + ## Supported languages Prefix | Language :----: | -------- -A | ABNF, ActionScript, ActionScript 3, Ada, Angular2, ANTLR, ApacheConf, APL, AppleScript, Arduino, Awk +A | ABAP, ABNF, ActionScript, ActionScript 3, Ada, Angular2, ANTLR, ApacheConf, APL, AppleScript, Arduino, Awk B | Ballerina, Base Makefile, Bash, Batchfile, BlitzBasic, BNF, Brainfuck -C | C, C#, C++, Cassandra CQL, CFEngine3, cfstatement/ColdFusion, CMake, COBOL, CSS, Cap'n Proto, Ceylon, ChaiScript, Cheetah, Clojure, CoffeeScript, Common Lisp, Coq, Crystal, Cython -D | Dart, Diff, Django/Jinja, Docker, DTD +C | C, C#, C++, Cap'n Proto, Cassandra CQL, Ceylon, CFEngine3, cfstatement, ChaiScript, Cheetah, Clojure, CMake, COBOL, CoffeeScript, Common Lisp, Coq, Crystal, CSS, Cython +D | D, Dart, Diff, Django/Jinja, Docker, DTD E | EBNF, Elixir, Elm, EmacsLisp, Erlang F | Factor, Fish, Forth, Fortran, FSharp -G | GAS, GDScript, GLSL, Genshi, Genshi HTML, Genshi Text, Gnuplot, Go, Go HTML Template, Go Text Template, GraphQL, Groovy -H | Handlebars, Haskell, Haxe, Hexdump, HTML, HTTP, Hy +G | GAS, GDScript, Genshi, Genshi HTML, Genshi Text, GLSL, Gnuplot, Go, Go HTML Template, Go Text Template, GraphQL, Groovy +H | Handlebars, Haskell, Haxe, HCL, Hexdump, HTML, HTTP, Hy I | Idris, INI, Io -J | Java, JavaScript, JSON, Jsx, Julia, Jungle +J | J, Java, JavaScript, JSON, Julia, Jungle K | Kotlin L | Lighttpd configuration file, LLVM, Lua -M | Mako, Markdown, Mason, Mathematica, MiniZinc, Modula-2, MonkeyC, MorrowindScript, Myghty, MySQL +M | Mako, markdown, Mason, Mathematica, Matlab, MiniZinc, Modula-2, MonkeyC, MorrowindScript, Myghty, MySQL N | NASM, Newspeak, Nginx configuration file, Nim, Nix O | Objective-C, OCaml, Octave, OpenSCAD, Org Mode -P | PacmanConf, Perl, PHP, Pig, PkgConfig, Plaintext, PL/pgSQL, PostgreSQL SQL dialect, PostScript, POVRay, PowerShell, Prolog, Protocol Buffer, Puppet, Python, Python 3 +P | PacmanConf, Perl, PHP, Pig, PkgConfig, PL/pgSQL, plaintext, PostgreSQL SQL dialect, PostScript, POVRay, PowerShell, Prolog, Protocol Buffer, Puppet, Python, Python 3 Q | QBasic -R | R, Racket, Ragel, reg, reStructuredText, Rexx, Ruby, Rust -S | Sass, Scala, Scheme, Scilab, SCSS, Smalltalk, Smarty, Snobol, Solidity, SPARQL, SQL, SquidConf, Swift, systemd, Systemverilog -T | TASM, Tcl, Tcsh, Termcap, Terminfo, Terraform, TeX, Thrift, TOML, TradingView, Transact-SQL, Turtle, Twig, TypeScript, TypoScript, TypoScriptCssData, TypoScriptHtmlData -V | verilog, VHDL, VimL +R | R, Racket, Ragel, react, reg, reStructuredText, Rexx, Ruby, Rust +S | Sass, Scala, Scheme, Scilab, SCSS, Smalltalk, Smarty, Snobol, Solidity, SPARQL, SQL, SquidConf, Swift, SYSTEMD, systemverilog +T | TASM, Tcl, Tcsh, Termcap, Terminfo, Terraform, TeX, Thrift, TOML, TradingView, Transact-SQL, Turing, Turtle, Twig, TypeScript, TypoScript, TypoScriptCssData, TypoScriptHtmlData +V | VB.net, verilog, VHDL, VimL, vue W | WDTE X | XML, Xorg Y | YAML + _I will attempt to keep this section up to date, but an authoritative list can be displayed with `chroma --list`._ + +## Try it + +Try out various languages and styles on the [Chroma Playground](https://swapoff.org/chroma/playground/). + + ## Using the library Chroma, like Pygments, has the concepts of @@ -79,6 +90,7 @@ In all cases, if a lexer, formatter or style can not be determined, `nil` will be returned. In this situation you may want to default to the `Fallback` value in each respective package, which provides sane defaults. + ### Quick start A convenience function exists that can be used to simply format some source @@ -88,6 +100,7 @@ text, without any effort: err := quick.Highlight(os.Stdout, someSourceCode, "go", "html", "monokai") ``` + ### Identifying the language To highlight code, you'll first have to identify what language the code is @@ -127,6 +140,7 @@ token types into a single token: lexer = chroma.Coalesce(lexer) ``` + ### Formatting the output Once a language is identified you will need to pick a formatter and a style (theme). @@ -155,6 +169,7 @@ And finally, format the tokens from the iterator: err := formatter.Format(w, style, iterator) ``` + ### The HTML formatter By default the `html` registered formatter generates standalone HTML with @@ -178,8 +193,10 @@ formatter := html.New(html.WithClasses()) err := formatter.WriteCSS(w, style) ``` + ## More detail + ### Lexers See the [Pygments documentation](http://pygments.org/docs/lexerdevelopment/) @@ -200,6 +217,7 @@ python3 ~/Projects/chroma/_tools/pygments2chroma.py \ See notes in [pygments-lexers.go](https://github.com/alecthomas/chroma/blob/master/pygments-lexers.txt) for a list of lexers, and notes on some of the issues importing them. + ### Formatters Chroma supports HTML output, as well as terminal output in 8 colour, 256 colour, and true-colour. @@ -207,13 +225,14 @@ Chroma supports HTML output, as well as terminal output in 8 colour, 256 colour, A `noop` formatter is included that outputs the token text only, and a `tokens` formatter outputs raw tokens. The latter is useful for debugging lexers. + ### Styles Chroma styles use the [same syntax](http://pygments.org/docs/styles/) as Pygments. All Pygments styles have been converted to Chroma using the `_tools/style.py` script. -When you work with one of [Chroma's styles](https://github.com/alecthomas/chroma/tree/master/styles), know that the `chroma.Background` token type provides the default style for tokens. It does so by defining a foreground color and background color. +When you work with one of [Chroma's styles](https://github.com/alecthomas/chroma/tree/master/styles), know that the `chroma.Background` token type provides the default style for tokens. It does so by defining a foreground color and background color. For example, this gives each token name not defined in the style a default color of `#f8f8f8` and uses `#000000` for the highlighted code block's background: @@ -225,6 +244,7 @@ Also, token types in a style file are hierarchical. For instance, when `CommentS For a quick overview of the available styles and how they look, check out the [Chroma Style Gallery](https://xyproto.github.io/splash/docs/). + ## Command-line interface A command-line interface to Chroma is included. It can be installed with: @@ -233,6 +253,7 @@ A command-line interface to Chroma is included. It can be installed with: go get -u github.com/alecthomas/chroma/cmd/chroma ``` + ## What's missing compared to Pygments? - Quite a few lexers, for various reasons (pull-requests welcome): diff --git a/vendor/github.com/alecthomas/chroma/delegate.go b/vendor/github.com/alecthomas/chroma/delegate.go index 021aeef5..5cef01bd 100644 --- a/vendor/github.com/alecthomas/chroma/delegate.go +++ b/vendor/github.com/alecthomas/chroma/delegate.go @@ -34,7 +34,7 @@ type insertion struct { tokens []Token } -func (d *delegatingLexer) Tokenise(options *TokeniseOptions, text string) (Iterator, error) { +func (d *delegatingLexer) Tokenise(options *TokeniseOptions, text string) (Iterator, error) { // nolint: gocognit tokens, err := Tokenise(Coalesce(d.language), options, text) if err != nil { return nil, err diff --git a/vendor/github.com/alecthomas/chroma/formatters/api.go b/vendor/github.com/alecthomas/chroma/formatters/api.go index 03e4babc..6da0a24c 100644 --- a/vendor/github.com/alecthomas/chroma/formatters/api.go +++ b/vendor/github.com/alecthomas/chroma/formatters/api.go @@ -6,6 +6,7 @@ import ( "github.com/alecthomas/chroma" "github.com/alecthomas/chroma/formatters/html" + "github.com/alecthomas/chroma/formatters/svg" ) var ( @@ -19,7 +20,8 @@ var ( return nil })) // Default HTML formatter outputs self-contained HTML. - htmlFull = Register("html", html.New(html.Standalone(), html.WithClasses())) // nolint + htmlFull = Register("html", html.New(html.Standalone(true), html.WithClasses(true))) // nolint + SVG = Register("svg", svg.New(svg.EmbedFont("Liberation Mono", svg.FontLiberationMono, svg.WOFF))) ) // Fallback formatter. diff --git a/vendor/github.com/alecthomas/chroma/formatters/html/html.go b/vendor/github.com/alecthomas/chroma/formatters/html/html.go index 93b33b16..4a307b2d 100644 --- a/vendor/github.com/alecthomas/chroma/formatters/html/html.go +++ b/vendor/github.com/alecthomas/chroma/formatters/html/html.go @@ -14,32 +14,47 @@ import ( type Option func(f *Formatter) // Standalone configures the HTML formatter for generating a standalone HTML document. -func Standalone() Option { return func(f *Formatter) { f.standalone = true } } +func Standalone(b bool) Option { return func(f *Formatter) { f.standalone = b } } // ClassPrefix sets the CSS class prefix. func ClassPrefix(prefix string) Option { return func(f *Formatter) { f.prefix = prefix } } // WithClasses emits HTML using CSS classes, rather than inline styles. -func WithClasses() Option { return func(f *Formatter) { f.Classes = true } } +func WithClasses(b bool) Option { return func(f *Formatter) { f.Classes = b } } // TabWidth sets the number of characters for a tab. Defaults to 8. func TabWidth(width int) Option { return func(f *Formatter) { f.tabWidth = width } } -// PreventSurroundingPre prevents the surrounding pre tags around the generated code -func PreventSurroundingPre() Option { return func(f *Formatter) { f.preventSurroundingPre = true } } +// PreventSurroundingPre prevents the surrounding pre tags around the generated code. +func PreventSurroundingPre(b bool) Option { + return func(f *Formatter) { + if b { + f.preWrapper = nopPreWrapper + } else { + f.preWrapper = defaultPreWrapper + } + } +} + +// WithPreWrapper allows control of the surrounding pre tags. +func WithPreWrapper(wrapper PreWrapper) Option { + return func(f *Formatter) { + f.preWrapper = wrapper + } +} // WithLineNumbers formats output with line numbers. -func WithLineNumbers() Option { +func WithLineNumbers(b bool) Option { return func(f *Formatter) { - f.lineNumbers = true + f.lineNumbers = b } } // LineNumbersInTable will, when combined with WithLineNumbers, separate the line numbers // and code in table td's, which make them copy-and-paste friendly. -func LineNumbersInTable() Option { +func LineNumbersInTable(b bool) Option { return func(f *Formatter) { - f.lineNumbersInTable = true + f.lineNumbersInTable = b } } @@ -64,6 +79,7 @@ func BaseLineNumber(n int) Option { func New(options ...Option) *Formatter { f := &Formatter{ baseLineNumber: 1, + preWrapper: defaultPreWrapper, } for _, option := range options { option(f) @@ -71,17 +87,57 @@ func New(options ...Option) *Formatter { return f } +// PreWrapper defines the operations supported in WithPreWrapper. +type PreWrapper interface { + // Start is called to write a start
 element.
+	// The code flag tells whether this block surrounds
+	// highlighted code. This will be false when surrounding
+	// line numbers.
+	Start(code bool, styleAttr string) string
+
+	// End is called to write the end 
element. + End(code bool) string +} + +type preWrapper struct { + start func(code bool, styleAttr string) string + end func(code bool) string +} + +func (p preWrapper) Start(code bool, styleAttr string) string { + return p.start(code, styleAttr) +} + +func (p preWrapper) End(code bool) string { + return p.end(code) +} + +var ( + nopPreWrapper = preWrapper{ + start: func(code bool, styleAttr string) string { return "" }, + end: func(code bool) string { return "" }, + } + defaultPreWrapper = preWrapper{ + start: func(code bool, styleAttr string) string { + return fmt.Sprintf("", styleAttr) + }, + end: func(code bool) string { + return "" + }, + } +) + // Formatter that generates HTML. type Formatter struct { - standalone bool - prefix string - Classes bool // Exported field to detect when classes are being used - preventSurroundingPre bool - tabWidth int - lineNumbers bool - lineNumbersInTable bool - highlightRanges highlightRanges - baseLineNumber int + standalone bool + prefix string + Classes bool // Exported field to detect when classes are being used + preWrapper PreWrapper + tabWidth int + lineNumbers bool + lineNumbersInTable bool + highlightRanges highlightRanges + baseLineNumber int } type highlightRanges [][2]int @@ -91,11 +147,6 @@ func (h highlightRanges) Swap(i, j int) { h[i], h[j] = h[j], h[i] } func (h highlightRanges) Less(i, j int) bool { return h[i][0] < h[j][0] } func (f *Formatter) Format(w io.Writer, style *chroma.Style, iterator chroma.Iterator) (err error) { - defer func() { - if perr := recover(); perr != nil { - err = perr.(error) - } - }() return f.writeHTML(w, style, iterator.Tokens()) } @@ -134,9 +185,7 @@ func (f *Formatter) writeHTML(w io.Writer, style *chroma.Style, tokens []chroma. fmt.Fprintf(w, "\n", f.styleAttr(css, chroma.Background)) fmt.Fprintf(w, "", f.styleAttr(css, chroma.LineTable)) fmt.Fprintf(w, "\n", f.styleAttr(css, chroma.LineTableTD)) - if !f.preventSurroundingPre { - fmt.Fprintf(w, "", f.styleAttr(css, chroma.Background)) - } + fmt.Fprintf(w, f.preWrapper.Start(false, f.styleAttr(css, chroma.Background))) for index := range lines { line := f.baseLineNumber + index highlight, next := f.shouldHighlight(highlightIndex, line) @@ -153,16 +202,13 @@ func (f *Formatter) writeHTML(w io.Writer, style *chroma.Style, tokens []chroma. fmt.Fprintf(w, "") } } - if !f.preventSurroundingPre { - fmt.Fprint(w, "") - } + fmt.Fprint(w, f.preWrapper.End(false)) fmt.Fprint(w, "\n") - fmt.Fprintf(w, "\n", f.styleAttr(css, chroma.LineTableTD)) + fmt.Fprintf(w, "\n", f.styleAttr(css, chroma.LineTableTD, "width:100%")) } - if !f.preventSurroundingPre { - fmt.Fprintf(w, "", f.styleAttr(css, chroma.Background)) - } + fmt.Fprintf(w, f.preWrapper.Start(true, f.styleAttr(css, chroma.Background))) + highlightIndex = 0 for index, tokens := range lines { // 1-based line number. @@ -192,9 +238,7 @@ func (f *Formatter) writeHTML(w io.Writer, style *chroma.Style, tokens []chroma. } } - if !f.preventSurroundingPre { - fmt.Fprint(w, "") - } + fmt.Fprintf(w, f.preWrapper.End(true)) if wrapInTable { fmt.Fprint(w, "\n") @@ -240,7 +284,7 @@ func (f *Formatter) class(t chroma.TokenType) string { return "" } -func (f *Formatter) styleAttr(styles map[chroma.TokenType]string, tt chroma.TokenType) string { +func (f *Formatter) styleAttr(styles map[chroma.TokenType]string, tt chroma.TokenType, extraCSS ...string) string { if f.Classes { cls := f.class(tt) if cls == "" { @@ -257,7 +301,9 @@ func (f *Formatter) styleAttr(styles map[chroma.TokenType]string, tt chroma.Toke } } } - return fmt.Sprintf(` style="%s"`, styles[tt]) + css := []string{styles[tt]} + css = append(css, extraCSS...) + return fmt.Sprintf(` style="%s"`, strings.Join(css, ";")) } func (f *Formatter) tabWidthStyle() string { diff --git a/vendor/github.com/alecthomas/chroma/formatters/svg/font_liberation_mono.go b/vendor/github.com/alecthomas/chroma/formatters/svg/font_liberation_mono.go new file mode 100644 index 00000000..70d692ec --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/formatters/svg/font_liberation_mono.go @@ -0,0 +1,51 @@ +// Digitized data copyright (c) 2010 Google Corporation +// with Reserved Font Arimo, Tinos and Cousine. +// Copyright (c) 2012 Red Hat, Inc. +// with Reserved Font Name Liberation. +// +// This Font Software is licensed under the SIL Open Font License, Version 1.1. +// This license is copied below, and is also available with a FAQ at: http://scripts.sil.org/OFL +// +// ----------------------------------------------------------- +// SIL OPEN FONT LICENSE Version 1.1 - 26 February 2007 +// ----------------------------------------------------------- +// +// PREAMBLE +// The goals of the Open Font License (OFL) are to stimulate worldwide development of collaborative font projects, to support the font creation efforts of academic and linguistic communities, and to provide a free and open framework in which fonts may be shared and improved in partnership with others. +// +// The OFL allows the licensed fonts to be used, studied, modified and redistributed freely as long as they are not sold by themselves. The fonts, including any derivative works, can be bundled, embedded, redistributed and/or sold with any software provided that any reserved names are not used by derivative works. The fonts and derivatives, however, cannot be released under any other type of license. The requirement for fonts to remain under this license does not apply to any document created using the fonts or their derivatives. +// +// DEFINITIONS +// "Font Software" refers to the set of files released by the Copyright Holder(s) under this license and clearly marked as such. This may include source files, build scripts and documentation. +// +// "Reserved Font Name" refers to any names specified as such after the copyright statement(s). +// +// "Original Version" refers to the collection of Font Software components as distributed by the Copyright Holder(s). +// +// "Modified Version" refers to any derivative made by adding to, deleting, or substituting -- in part or in whole -- any of the components of the Original Version, by changing formats or by porting the Font Software to a new environment. +// +// "Author" refers to any designer, engineer, programmer, technical writer or other person who contributed to the Font Software. +// +// PERMISSION & CONDITIONS +// Permission is hereby granted, free of charge, to any person obtaining a copy of the Font Software, to use, study, copy, merge, embed, modify, redistribute, and sell modified and unmodified copies of the Font Software, subject to the following conditions: +// +// 1) Neither the Font Software nor any of its individual components, in Original or Modified Versions, may be sold by itself. +// +// 2) Original or Modified Versions of the Font Software may be bundled, redistributed and/or sold with any software, provided that each copy contains the above copyright notice and this license. These can be included either as stand-alone text files, human-readable headers or in the appropriate machine-readable metadata fields within text or binary files as long as those fields can be easily viewed by the user. +// +// 3) No Modified Version of the Font Software may use the Reserved Font Name(s) unless explicit written permission is granted by the corresponding Copyright Holder. This restriction only applies to the primary font name as presented to the users. +// +// 4) The name(s) of the Copyright Holder(s) or the Author(s) of the Font Software shall not be used to promote, endorse or advertise any Modified Version, except to acknowledge the contribution(s) of the Copyright Holder(s) and the Author(s) or with their explicit written permission. +// +// 5) The Font Software, modified or unmodified, in part or in whole, must be distributed entirely under this license, and must not be distributed under any other license. The requirement for fonts to remain under this license does not apply to any document created using the Font Software. +// +// TERMINATION +// This license becomes null and void if any of the above conditions are not met. +// +// DISCLAIMER +// THE FONT SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO ANY WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT OF COPYRIGHT, PATENT, TRADEMARK, OR OTHER RIGHT. IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, INCLUDING ANY GENERAL, SPECIAL, INDIRECT, INCIDENTAL, OR CONSEQUENTIAL DAMAGES, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF THE USE OR INABILITY TO USE THE FONT SOFTWARE OR FROM OTHER DEALINGS IN THE FONT SOFTWARE. + +package svg + +// Liberation Mono as base64 encoded woff (SIL Open Font License)[https://en.wikipedia.org/wiki/Liberation_fonts] +var FontLiberationMono = `d09GRgABAAAAAqtYABIAAAAEycAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAABGRlRNAAKrPAAAABwAAAAcdooU5UdERUYAAp6sAAAAcAAAAIZxBHoIR1BPUwACoNwAAApfAAAzLnW/WuJHU1VCAAKfHAAAAb4AAALi0BntuE9TLzIAAAIQAAAAYAAAAGAAbrqGY21hcAAADmgAAARSAAAGPmw6RjVjdnQgAAAbpAAAAZ8AAAKuZwZtV2ZwZ20AABK8AAAEqQAAB7R+YbYRZ2FzcAACnpwAAAAQAAAAEAAYAAlnbHlmAAA0mAACOjQAA8hUF/4NBGhlYWQAAAGUAAAANgAAADYELjhMaGhlYQAAAcwAAAAhAAAAJAjCBstobXR4AAACcAAAC/UAACV4+gaVVWxvY2EAAB1EAAAXVAAAJXwSZmZ8bWF4cAAAAfAAAAAgAAAAIA3VBMBuYW1lAAJuzAAABTkAAAumb4o3f3Bvc3QAAnQIAAAqlAAAW+Bx9Ia5cHJlcAAAF2gAAAQ8AAAFesjzjI8AAQAAAAIAABUZ4O5fDzz1Ah8IAAAAAADIQ3qnAAAAANiiczX8Jf2ZBfEH2QAAAAgAAAABAAAAAHjaY2BkYGBb+XcmAwNr5B/VX1WsHxmAIsiAMw4AmuUGmAAAAAABAAAJXgEiAEgAWwAGAAIAEAAvAFwAAAO5AxEAAwABAAMEzQGQAAUAAAWaBTMAAAEdBZoFMwAAA2EAZgISCAUCBwQJAgIFAgQE4AAK/0AAeP8AAAABAAAAADFBU0MAQAAg/iME5/5+AAAGqQJnYAABv9/3AAAEOgVFAAAAIAAOeNqlWglwVdUZvuc1tBiVzYBCEJSGarG4UMMmU9lk0QhWBAybVGoEpGkfJNIqiokELVQibQVEFptQi4hKiTjEWrApWNbijB1gKkyhTq3aCAiU0Zq82+8/5zvJn+t7SRjfzDf/uffs//nPv92Xtj+YH+CXtt8j9rW0/aY9yr2BwXx/Dd6dA8YBd+D5M6AAZWk7CjiF59nAPODXwNPAY8D9pMuBNUAJ8JRrb6a6MeowBfgO5ysD4qSCKvW8B9jE8idAEct5EToayAGWAOkcN4sYiflXgs4BbeXWFX6B8i+53gqgGFjENQstBSpJC4FqtL8QdJpqX8G2p4HfAdvY5xagPfcoPP0V8D54fQnbzarnvZ2vL/l1I9usxVyyn67AX4H55P8o986ufTjfoa/pxb087dra85kLejnoP4EHgEygLSB7eLb+/L8EEzmLMnUOGpmK/1Gs5p6WRJDFPkvI92TIIG9LIiiN4BF1DlGIfOXzLDQGKxpwviiNc4xUtIznksmzL+P6mqJxrjsVLePaYkA2eVzaDHovcJh3pJDjVBNyXxY6amVXnv+unnuzvoy8jNIWpBU81+IkVM6rM/ucJt2rnkdT5lPRHN4bofeR7qKMVJ4HDXjnsni+vPf27kWokXvSH/foqNprGtAPGK/2lsk2/XjWxbxLoucmo+4Y6Mc8Q+HVDPJ1jzqHhdSVY9F+r+KlnwN3N/gW56lkvx8CL1JP/IP8yVB8kj2/5vZgywHf+31eCgxTuvhh4KfA89SfmCd2EdY6263B6qFcopcqB6o8Rt0RL3t+D809o5Ik981wb3GOp+9DdRJ5g44MFlPW9Zp9v8lKZ72dZJ6+1A3y/h5VX+bsQ919nU1e6b3OUevQ7U9zj4+ovUblW/i/Tt3zMspoLuf3Z6fXU9LIvfPUy/tB4EmueZhDGIJ+m7yaxvKrwAbgu7xnV9ImpHPOnyldIjxdwDVtYLvuwA28D143LFb2c5HS2ddxvkXUaQvJB6/DiznWNyjPlcrmwv8I9rOP4DjrphPYT5jg/JUcqy/lQ8pbFU47mM6R93I+oYOJ8cx/z/MaSR6UK3s+FLiJ5yR4SJ1TifId8rimh7iWLRwP6zYXRHjUi+hCPoNnYTXLw9T9ebneRpshwEAAZ2L2ATIuZNnI3n8EejH9N6w5FlOAnjEngN4OVpeJrD3oYDIdYteCfh94w/lt9vkuYBvxhUPdeBUK0rYn/UrxTyrJY/gi4Qd4xh00VwCyjz5AJ66nIAnmED04biblu4iyu8v5lwIZO/w38BHmhi42zzWEtX3Q1ea2IKitCYLEM8CWIKgZAvoJ3r0EeiQIwhdAPwIuRbkv6HzXLtwN5PL5CNs+p3AWmAiMBm4GpqDNE3C1v+fGDHOA2wHMn5Cx2gb2V/NfN5/MFT4L3Mq2f3T9E6uBSrcGP29ipVrzbj7/Bs8vg2LMxAfoX+76h0NBy0C7A8vRZiOeK9CoHeg6vFsFinHCNzjfxSgPB7I57gpgLXDS7a22A2gBxz/CcQscEh+CYswAewoH4Xk79zUmNRJbgTdR3uHWlTgMQMoTu4DjwGXk6XiUXwRex/ifA4XAKaV7FjtZNe85ubL3BPXhgXq/1pdD8amfUbGH2PGLWB6p/Fpvx9NV3PEE68r5PIs6XvRwS9IbqCf28LmIerCC85bz3UbqxZ+wfivbLGe7auqkVcAkYDv32oE+9ia+92P2ok9wN8f174tJs1m+3u098TB5IO+upj+YF/F3q5zOCs9Rn11NOzqWejif+qmMOmwC/Zd0+sh+vHzyrrfy0wtV/TJlG+OKz7fRJ4uTetse8NzitLV7VKwodcNJ17N9BvkYqDGO0W/z4w1RdetpX6Lxpo9VczimP/PH6E+IPR/H8Waw/Xi+u5HtfuH2aW1BB9oBQ7vgbaD46V/nvFuUHdExz2DaiCnc90q2n0TbPxPYxzh9GO2YtzvZnH8p7WCpinU7Uq6yuQ4fM8n8I2if2hM307dI5/j+Wfb1TT5fS34t47rac51F7DdG0a6E1A8gH69S88bpR+U7vWZ1x1qH2nehT6GPah5QsiR+/R183sh4+CzQh/t9hTz1se8QnsN67t3TNJVXGMDxttA/Evm/ixgTuT85yk+7JUKncLyWlJ2VinL9Ys+s7iK1Mu7Xut7ZQCunF1KutrPvdjVWkeOnjU1S+d/ej7mfdLry1zVfbld+T6WiqfzT8ZS/DMpQlPo1HqM8zqDc9mHckkW/2tN8rkP28gOei/Rrw7XLeltznHHqHDpQH01yuraOZ3kcz8aPQWDWA7BhBrIUywDdDPwZOADcxPJOYBPLgq6wRZNA48CfOIZvx3qzm+U463eq/jJuKeaDz2H6AeMc7PM6gm3lnX0/l2X4i2aE1MHv6ejrxfap8ijUP0UeSQ7pVD1/Y5BpI/bicXfe8hxM5V1Zyvet2K47dcMwxj6Fzt8MbmWOairrr3KyVge5YwdcG8ld1dkPOZff0m7s5z0UudtM27eLtnFrvY23OimbcUhnxj2PE3sZq/djPFFO/XMZqffjxXd/E/gUEF90Iuv2cIx0ygbahZ+jvg31xBH6sodoSxCzx6CrTDuUTzq/3PLsKAEbZi5xeVObozns+ob/cX6wzSn2dPZYqEVX4k5CfOkeLs8XPAqKfRjwy/Qn7cJ+r7k6yzdp19qt11xJH7uLW5NpyfEkbhjq2plupBn1beQcwyreIdyPELF0iBgs3EEb/inPah718TruX2RCxl/tEAyiXuxBHwf60oynTRA+lNNebHI8lrVYvVZE2Srk+N6GjqOsvUNAdk2ti4+sfitxsmB50p/50U6MZ14hejJ+Oux4YfmBsoHuNqKHjjNHNJ/rkPtyBu8GKZ5L7IK1mS0uP27jmoFEa8ZiZxmLSftrYKugMxILYKtK6Mu+DfxN0Xsdwh97fzqSD0iWo9N5yUXNpM3JV1axfTQ/GaU/p5/pn6P5SZ/HiVKdk4zkKC0tolxEqc/rpKJN5UuS8fF0ClrQjPxlsjxmMtrcHJn3ozz1ec2mqPcnNB2cOgdq59rGvoOdjFmZX9ZIblzowCbqm0Obkr2ZtA+p6qMyluqsRzIWakommqLnm4v2VOeik9GiJsB8TyJsiDDDwerTJAiHO5+y9q2GqMvXpYD0Cwey/buqb7mDveeNoEH/t5L0L06O8CUAOj6RRTzpYO13I0gc4fjw6WpXKN8gBRrM061+nkSuQx3fX1XxeoXaY7GKpcvV2F/1HM/nXDRKHM5r31mN7LuRtTfAGfoKZxiXtE2+7sQ51Peqp/b+9nAITzYiS4zlE7Cf4dxIn6gcrCb8M7/5Jv4AnHB8Cz92sL5dMv5c7+bx1OZuztBO4RceBK4ADsEm5/A77AYHyYtYSE5UvnVDH5nJwBLmkjcT4j++7mC/qRdyPMkJtvNg3oq52+AF0AlAvrOL1nfeJ/lN1acN0db1N/cBhj5kF/o+XemzxYlujImn0V/vSR85ULn9iYz7clTM25H9fYwVb5EbLMEe+N3C+pgdGL+nkY/3MI+x28mJ5GntuBfQh+/H3Db0lXnwy9SWZzA/N4MxXKHjg/3OPcrllm1uZZXzKW1Ozv7PAOsrYKxSwH2hHOviZEHOTcoCX9Y0CjPT1QkV6Lrzfd8cRO9dLC/ybq77Xmzz/9OZR2hNXrTmt+Q5vBfTKYPdHaxMZRIiIwPoZ+cxrha6oEWulZ9OEoeBlxKLrXBnatbwXNvzXuczF1+mbGA1bfA6ys1U5a/w25rp6O6ruZO5b8kBnxCobzOfeeD98wIX+9k8f7qLTW3cyhxMLB3x7uX0Iycw7vX5BB3XTmVuaT5lu6WibRQiMbN5lDEhdK9ZGomXW6k42cfISeJju95R7GdzbkFQI98BakFr3H90bC67Bel7rp0d+3/87rwTz3LPakDl/kMvJCQGLAU9SBwgFZ5WAdhD+C/PY76r4rcN+cZwkD5VUzatCV+gcdsdNPHjGtZQntZgXfuwxrtBjwLvcN2yt0N8d4jfDuSbwlhgHtv8RaGK9YJZ/PZQoUHfc4S6Y9CN4YfME3R038Hsd83reJ7+TD1EBqCPgx3A+wLRPf8H1ZqAPAAAAHja5dT7U1ZFGAfw73sOr+dEvspVkHzZPQf3pICIigiEpHIJK5QSMzURbzWaZnQzHTUtSjJSHLyDDmSFERUgApqXbExnzIwGS/Ey5p55z5pZUVlT885wOonDL03TH9Azs7vz/LA7z35mngeAjJ41CC5nR0CSk7lu5QEBkYBLchIFElZLyfJS+Xl5tbxeLpNr5DPuULfXfdJ93X3Teyq6Mnp39J8knHhJNskj08h0MpPMIqtIMzlOOshF8hO5SbqpQoNoONWpQRNoIk2iaTSdZtAsWkiX0pfoZrqfHqVdmlsL1SI0XTO0BG2SVqAVaiXaFm2vLul99P56iB6uR+lEH6rH6bn6XH1BjBQTFKMxMIn1ZUEsjEWyQWwwi2dJLJ0tZmtYCStlZayC1bB61sQOskPsODvNvmSdzDLSjXHGBKPImGc8biw2lsYviV+WEFGr1Zb5JX+yP92f4R/vz/JP7o6xbceEolpKkZ+TV8gljsEGeY/c7o5yb3K3u7u88HY7BtUEJJJQkkvybxvMJmtICzlBviGXyS/kd8egLw2hEY5BrGMwkqb2GixyDMppda/BgNsGedoUbaZjUN5rEOwYDNSjbxsU6fNvGdB/McjvNShn1ayu1+CUY3DeMUjrNVhgLHQMiuKLHYOI2lK/y+/1pzgG4/yZ/pxuatu2aX9qH7MP2wfsZnuf3WQ32g12nT3GHm7HXiPihrguvhOmuCquiMviorggOsV5cU58Lc6KDvGVaBdnxBfiM3FMfCKOikPigGgTrWKfaBKNol5UiFKxXCwUhWKqYCJYBAjJ+sP6zfrRardOWyesGmurVWLFWUMsahHLa0VZEVY/y+P72XfB1+kb60v0aWamOcFMNZPNUWaiOcw0TGJGmsG8m3/Pr3Ef5/wK7+Cf8xP8KD/CW3kTb+B7eRWfyHN4Nh/CDc54DNcujbiUcGHjnPI5sZ4WT5Wn0rPTs8Oz3bMt8GRPj/zPo48U+Pfhwj80XM6c6AnpP97ouSkjAG70ceaLijsQiDvRFx70Q38EIRghCEUYwjEAEYjEQEThLmcqeREN4nSiBh0xGAwGA3djCIYiFnGIxzAkYDgSMQIjMQpJGI1kjEEKUpGGe5COscjAvRiH8ZiATGQhGzm4D7mYiPvxAB5EHiZhMvLxEB7GFBRgKh7BNDyK6ZiBmXgMs1CI2SjCHKf+17AOr+MNVGA7dmMP3sLbeBfvoBbv4X3UoR4f4CN8iAY0Yh/2oxktaEMrDuFjHMYR5QqewXwswELlKl5EDZ7Gk2oUXsAiNQ2l2KmOxrPqWDUDT2CZOkxNVIfLxWoKFmOlPAN7cRBrMQ9PqUmuAjVVTcASrFI45uJlvIptrjBXuNKhnFUuKpeUc8p5HFBX4pgrTelSA5Ubyg9qq9qmfIvlSqdyWbmGEpThFbyJ9diIcmzCBmzBVueHm1GFXajEr9I6aReKpR3STqkSK6TdUpVU+heLM5/fAAB42nVVz1PbRhTeFQYMGCJTyjDVIatu7MJgl3SStkApbG3J2HXTYgwzK+hBIiZjeuKUQ6ad8a2MSP+XJ3IxOeXaQ/+HHNpbOSbX9L2VTSAz1Qhr3/d+7vfeLmr78CDQ+3vt3dbOTz8++qH5faO+XfO9auU7tbX57cY362urX3/15Rf3Vz4vlxY/KxbuyU/duwtzefvOzPTU5ER2fGw0M2JxVhLAQx9GCiJfi6Qvo3q5JPyFrlcu+bIWgogE4CdTlPW6gWQEIhRQxE90Aw5BoeWTDyxVaqmuLbktNtgGpZAC/vKk6PODlsb1H54MBFyZ9SOzzhSNMI2C66KHqYqqFT7UnnZjP8QaeTI1WZXV48lyiSWTU7icwhUsytOEL25ys7AW/fXEYtlpSos79aMO7LS07zmuG5RLDZiRnlGxqgkJY1UYNyHFCZXOzkVSehU/79vsKFzOdWQn+lnDSIS+8Ygfx79DfhmWpAdLz/5ewJ0fQ0l6PixT1ObudZ7m+5QcRgu2FPEbhtuRV//eRqIBMlaw3zBaglUFvqtdepwach3HNSlqcRhH/Xe9IylsGSe5XHzqI91sR2OI/ruX5w7Ungdgh12+Hgy2XtttwketQw1WoSa6ESL4bkl31XHz1zY7/6dmSAuSgwy7LtFw3lfsCAXotXQqC3bkXDC1shyAFZLm1VDz8T5pekPNtXsosbfNto4hU2h0pI+Mn0fQO8Lp+oUaI22Yeeu4Mp7Ni7WVwNgKrKrROREwWkSS0OumA84NucS2EWbepp8rBxMU87NiTWIYiuNLPxy8T7sLGEAg0fXldBD2NCgPFyoadMxP7q+gRxRiw04800xYkacwJyvX3aWy/JO2Ni4DN5irAgsfD7xgxTfnSvhx6KUlUCzZ0pfswbvXyUPhvHjAHrLAI+P5Kk5Z0Y915wncDZ0OnrsnQjsuqAA7HEh9HNDYIUNLrx0zHIGZlT3dbMtm60CvDgpJFRQuU/A/CCO1k4bBAYRsISu05YwEaGgjIGq4kJUN/IXxQhb/bCTcoDS4lQ2hucOG1lgGLAn/2BvYkXwr6CiNU7U+jDZGIsap1h03cNOnXLJQLQaJ0SNLpNaHKrymUJHF+azWDURcLtDQCy2PZSC7AtSOpr0RPYblARmG80Gv9m5JN8hCmpiL6qFAZEJt2blJLmwb+Vqsf6BuDNUizspmO6bgchCQYeUNYDTCajXvmLuADrTEu1fYeKTNgY4Tpegwd9cpiGx0YtnWG8Ya75PfnGeUa5Y1eXOvUi7h1VZJJD9rJYqftQ/0pc2YONvTFxa3qmElSO6hTl8KxpRBLUIJJEGQQJF2Ucgae+dSMdYz2owBjPy4z5nBskOMs8d9K8XsNFHRJFLMQk0m1aihdQaxbIr1DGaehBFlanJUZdWEylnTlpNwgi4QeckZm+DsRY5PcydBr10D93kvmVBOatFDC5VWeLb/PvX+gX6RY+hmfjFRhR4cl4UuNhv/rfiiQ4Pya9CNw4AOG5vH1uDLgctNbJPcxELGcjApjyswJSuEbxG+leJjhI/jiPJ5ju497P0OcJqAQ+3ikRSf/OnE9hV1KsBLJbb/Kf8HKfchKQAAAHjaPVTdTyNVFL9nBhZZ2L3lq3QFvPNCg1ZpKYsx2tJbdO8ioAx0xyxggBgS3yzJdJ9pkHUxUloFWU1IwNfdJR0ghME0pcofsPwBXVsR9cENoyY+mnqmgDf5nd855875mntnwm6IEID3iAajF/wB3CGNhIGGzJCHSTe8j/4hZHs/SIIQQA7g828iv4W2zT1wcyfOSLgTbhIHQiqjE3e6ST/4iUbiKAFx7u3COB96KUpAnHu96EUmCspphEQISqWsVUPnDhDNhNd2gja9uktKbDZcB+9gAhu9mOBtTNCH3Hdhh9Du5R9r5F/4R+1gf4sO9pd4hf0peljybOMsfSZHraQlHVqwaQGzpqyoJZPn/Ll09Q9RYr+futlvp0H26+lLjJ5C2y8ngtET4CfCyX4uCnZYfFosFGVe7H5dFIWLZaCR9EI91m3gtUFZKwSfaT8F8xoJ14MTO7LRhOOlUQKO1URUhIQvAW2o4xG5xJ5BXlPyaj6eN/IVNA/HTd1s6ih6NHckH/4IP6huNpsFJevL5rLybDaelWiGZSRvJpSJZtKZQqbyYMvNFNNnquasGTcrzVKOt5oNLwvHPij76n5839iviO8ZexLdDe1au7IJ17jnUT+LGylDMoyccWzI3nQoLW1uGVtSbut4S/I+CT2RNh5D7tHxIyl8DSjxw3Wcg6B0IBSEjFM4eBOo69Prs+vyt2tu9o1wM99D/lDCHnbXnK3C7qV67Xqd+G41wDbD1XCLBPCO3b5gAbd4xwz7uqXE6Gp69XBV5qttXYKvOltQ1FJBV7wroZW5FWulkn4PtSQKtVyRvkq42ZeREiukwJcClvKmpGhqLiWRpCOpJGW7qJJ0tQpl2bcsDSemEtGE7FsCusSWvEsyX3I0CMch1OAUNcSHkEs5qNlpVsSBrXDV0Si+mHezzwcCbPFBkD1YCLDPBkps4z44FpQF34Ls+xTm5oHPV9cKHc8nipfrE8SL4NJudLu0qm5Zu4InO417U4iDUhGqdphblBXOGlrF5Hg/+1B0sQnkceQGf71WCbJW4Zfxpr+w1xJgVIYDuAGunR7GTaTmDmHCVd6OCUfVFmaNlEYkPtLzhuAj7R3iqQqFIRgSbWxQ9DPVhBb+EQzgebyLjfUjbiPSAgrCElJcQDM0aU5/k1YHVHP4qSbhlwb4fbW2zDBGQ3SKztEKSr10mEZpkhZoiVaF0GdROUrwJwGbTqgEE1LbdyIez6BZVRodNKrVCQMWjfaILfnIuHFl0SDa+MTdbYDlsfuJBOlrGzT8kbvGdNvYoDGDCreVOCqOtm0n6RvTY3rsnud8wYWqE48nFkMuG+UdBPFcLrAN8OixmH7hwQi0Yp57ZenR9ctA+1lUCJbB9HqM2EExjw46sQmj7KIYDTFSDtNRXJbETJO6h0zqZXMSQzCDft7L/71N6ued6pcVy8v1H5x2ib942q2SvUucQRDGf7vvu+JHiCmMpYKFTVqrFHavhZwiprA48A6xOBGMQkI05usSgt9oJIhyghYenAqCh6JJFAPXRLQTIeA/kKCEoMEm576O5wkeImkyA7PPzsw+M8OO2TW7vDQe9wlnbI64DynhGfhHFzf/yA9dYttkm/iPkn95rLDJArN8E/Q+G+rnFXG+5qRvsc0iw2wQY4SqW2k/Cc+LDPpI6PbqKsFjupmTuu+E7wvNalA5hHlClHWp3eAuuykb4FAlSakCetUDPSE9THBgvrv7NwjHSdAudk1s7MKhjxnX1XTouOMxIBOGdUDcKaldz5wK0swb2qQLBEVyuCqdWvroFfT0esS8TS9T5P+RjgcYlU7a6CJIYzac1I7YEadcplliNeMbunqbN+906g2dfzbFB9E60VZaVZQZEjZip4kpT3mM2VP/J8+Np+u44/8yk+kTOgjQQg0//vWjslXF6TL/WP/lrltKod2TX8uKE+TeWYVsU7f/24btI8kpdktN3CRNih5CeVE3Qom7k9m4PftaZjyQvfjM7DkU4YO8AHjajdd33I512D/w73VdKqtSCSG7ImQWyczeI4SIjMyMsiqVShnJjWRkl+w9b3veNhHKjOy9V+bz9nv9/nr+enp1vK7r/J7HcXzGcZyX8w7h//1X4X/FKHE6hGjyEGJNQkhUO4THOovJITyeWLQK4YkUwvkTQ8RGcTuExAXF5RCSqEniOun5EJJ1DCF5duH6SflPiaddP91d7A0hRVGxLIRn0osdITzn+rndIaQcGMLzVcSqEFLhlMpn6nZCTZoyYn4IL8B7Qf+0KYX8dD7T+UwvPz28F/HK4CwDrAwHQ8iIaybXmXqK4yFkVp9ZfWa9s8DPAi9LrxCyys/mOtuREF7qE8LLhQWOr4wLIbv67M5yJBLycuD8quucrnPqm4u2XFtDyF0yhNd49Zp7efiYh395cwke5oObD5f8vMjvfgG4BfQpAK+ge6/DeP16CG84K6RnIZ9vZhI9Qiii91vxIRRtKCYIPhRTV0x+cRgl8C5BT8npgsZSzko9+nT/bXzf9r20WhaGMnDLwC+jZ1k4ZWcLvcqZbTn8y6ktB6M83PKPPs2lAp0VcKxgByoMFzyuwOuKtFW0M5XSCP5XglWJ1krmVZn+ynpVqSHgVIFTBU5VOqsiUlWPas6qOasutzrs6jCr01Yd35o8ram2ptqadNXUsxZva8mrZSdqwall794RtemvTVdt+LVxrs27OrTW6R9CXbl17XZdeHVxfhfnd+uF4P9QL6+wt/XsTz3+1bO79fGrbx/rq6tPa3119fnYIJvApwE+DfBpYLfesx/v8bEhHQ3paERHI7WN+NRIbaN1Qs/39Xyf5vf58T5+7+PXGH5jXBqbS2PzaKxnYxqb0NgElw/0aEpXU7qa8qWp+01hNoPRzG42w7uZumb2ornZNYfXAnYLvFvY5xbyW5jdh+byIV8+vBdCSxpa6tfSdUv+tcSjpfNW+rfWozVvW3s2WuvVGofWvG2DQxu629qBtri31RNEaMe7dri34107Oj+C1/5R4NiBhg7ud2ByBxw74NjBnnTkQ0c+dITREUZHGB1hdILRyXknmjs576Tfx64/du8Tz8An8D/h+yd8/oTPnXHtrHdn8+2sR2fz6WIHu+DfRe8untkutHXFs6u97dpc4NlVblfz6AavG1+6yevOq0/d/9RsPjOPz+zf57z9XM8e5vsF/l/g9CVvvzTrr1z3pK2n2q9x/MY8vuHLt7B70dcLxncM+o6n3+P+Pe29ed7bbPvwva8Z9OV9X+d97VY/un7Q7wd8+7v/o5ofaRyAV5zfioGuB7o/kBeDYA6GMRjHn5z/pMcQOD/T+DOuQ2kaap7D5A3HbTgNI3z/xflImkfqOwreaN9Hm9MYeGNwGcOTsb6PpW2cGC/nVxi/6fubvAm8+12PiTyeqOckGibhNgnHSfImeV4nm8lkHkzm/2Q9J9M2hf9T8JxiVlP0n2J+U+icgsdUvabiPtXZNLXT1E7j23S8Z/Brhnsz7NMM+DPxmWkGM+XOhDVL7SzzmGX/ZuE7W+1suufQMZe2ubjOVTcP5jxc5uGyAJeFuC5UvwjeIjWL4C3izyI7HW+/4+mNt4Pxfi/izTpez8W8X2w/FvvtXmwvF/sNWWJPlsBeYv+WmPcSnizlyVKeLMVnqVksxWUZLsvoWQZnmfplzpe7v0K/Fa5XurcSp1XwV/NlDX1rcVhrrms9L+voXAd/HT3reLCOpgTcEzwPCa4T+JPAy/Vq1uu53pw2+L5RzUbcN9O02ecWvbfC3iZ/u57bYf5Byw5ad9irnfj9qX6XXd6F826fe3DbA+8vfP/2fa9nei9++2jc7/5+dQfs9EE7cMhv9SF6/zGzw+4fsaNH1P7r3lFeHdPz2KNPMzuu1wm8Tuh7koaTOJ/C+ZT80/qdUX+G9rNmcM7v3Dk+neP5edgX7NYFc7no7BIPLuN0mf4rcK/CvKrnVXtyjZ7r8K7jdMOcbqi5qe9Ne3DL9S29buNwG8Z/sO/w6w5v7tq7u3Lu6X+fT/f1emB3H9rhh3Ie9g+RkEYMF/dCJNInRKJlxPkQie0IkUQNxekQeax7iHhnijw+W6wKkSfUJW4uOodIkrxislCTdHqIJGsXIslzhciTKULkKb28I0VSyHumSYg82zNEnusYIimrCH2e1yeVvFTqU7ufWl4afNIMDJEXEgnXaYOYECLp9Eq3TuwWx0MkfXYBKz1O6XF/Uc8XD4ZIBmcZegi9vS9FMuKSUZ+M8DJeDpFM2QTumfTMpFdmujLrnRm3zDRngZulhhgljoRIVvnepSJZ5WdzL1ttAe8lfF/C4+UKQu7LzrxbRbLLyb4xRHLomUNuDjy8X0VeTSnqCdpedT8n3Tn1yEl7Lppz4ZSLllzXQyR3YQEvN/zXSgr98+CZR30e9XnUG18kr7y8tOadHyL59MuHSz468tGVH35+XudXW0BtgYKCDwX2hkhB9wrqX/B2iLxO3+uthJ5vyHnDDrzhe6Hkgg+FhoitIWJ1I4WLCniF4RVW+6Zr73ORN5eFSBH6iuBapJdQX4T3b6UXrt9yXRSmd71IUb2K4VqML8XkFDef4jgX51EJ9SXMr4R9LEF7STMtyfuS6krSVIq3pZyVUltK/tu+v82z0nahNK2l7V9p+1qGT2XoLkt3WTlleVZWfTkcy7kuT0t5vleAW0GfivhUwbWKeVRxXjWTwNs7XaSaHtV4Uk1edfXV9aqhRw2+1IBVk66afK2JYy1z9C4XqYXHOzTUNo/aeNRxXsd1XVrr2pl3+V2P7/X0qA+7Pu71PT8N6GiAQwP9GsB/j/8N1TZ03lDfhmob4dDIXjVS+755eQeLeAeLNOZdE/2bqG+iXxPampjLBzh8wA/vX5EPeNnUzjR11tRZU/ebmof3sEgz95u538xz0ozW5p795jCbm28LPFro28Jufkjbh2bTEo+WMFvKaUlbS89mSzvRSm1rmtvQ18autZXfzm63w/0jc2vP+/Y0tze3Drzr4H5HWjrS0Mk+dTKnj+V5T4p84nnqbC6dnXVx1tV37zuRbu5140E3Grup7wanOx2f4vAZrp/R8hkOn7n3Of49xBcwv9DvS15+iedXcr6iuyceX5vx1zR9Y87fqu+lfy87/p05f4f39/r3lteH1315189M+sH6gc/91fY3qx+dD3A+QP8BPB7w6FrPONhxuMfhE4fPQL4M1GuQXoPUDYoXNA2mbTDsn/D8ia9D/K4OefTpbIi8ITz6meah/Bvq+1D4Q81jmH7D9B+m/3D74D0pMlzecL91I+SOoPUX30ea00g5o3AbBXOU3R5F1yg7PBrWaFijYY0259FqxtA1hp4x+I+RM5YXY9WM03uc6/Fm+qvc33j1G++9V0Um0Pc7X3/3DE3EY6LcSfpOxnEyzpPt1hQYU/SZqnbqo08cprk/DfdpaqZ5vqaZ03T3p/N3uvsznM/QcyYs70yRWbydpXY2vDly5vqtmmt35tI4j755OMyHM1+P+e7P12++ugW+L9RjIb4LaVxkVotwXMSPeDmL4SymbYk9WKqHd53IMrqWq1uh7wq/8Sv5vso8Vjtb4xlaq1cC/xLs6Hr4G9Rs9GxspGOTWW5yvclztZlfW3i41fU2XLfb9z/sxw4+79B7Bz079fvTzP6E/ae+u9Tvwm8XzD18/Msc//Z9r977+LUP5n6zP4DPAc/dQTt00PVBPA/Z33/wOezeEWf/8v8ojcf4chzmcX1OeH5O6nOS5lM0n+bHaXVn8DvDr7N0nYV5js/nxQWcL9JyifZL5nIZp8v6XTbXK3Rdweeqe9f0vwb3ut/r6/reoOOG+d00t5v634R9yy7elvuf35k7au/QeUfNHffvwrjn7B7v79u/B/bwgRk9xOvhxhANNcTeEI0MD1HvK9FobdFTzBbHQzSWRmQXhUUrMURMEPPF6RBN5H6iKqKHUJPoSIg+NlCMEzvEvRB9PK9oItQ+vi5En+geoomziXqij1gmzodokvSigtAryXShV9KUwllSNUl3h2gyvZI1F3olxzf55RB9EtZTeD91O0Sfxi1FJiEvBf7P4PlsrxB9zv2UKcTWEH1e/1TwU9GfWi/vStHUctIkFv1D9IWGol2IpnXtfSmaVo+0eKeFn1bPdPikOxii6fFNL//F5KKo0OtFOjLAzyAnwyjBgwx0ZMQn4/UQ9b4UzRQfopn55l0pmhlOZvwz05EFpywFBcwsML0zRbPinFW/rOqzwsoqL9uqEH1J3ktyXoLnvSn6MpyX6X9F7iswXoGdXb/sfM9OW3azyY5zDlxzyM9hxjnofzUIs30V5qv05XSeE89cZpgLfm6+5Taj3Hq/xpfX3MuTS+iZx1le3uXlST54+XDIr1d+e1HAbAu4LkhfQZxf1/cN2G/gU8hMC00WPC0Eo5AdKUxPYfreTCTwesvOFZVflMdF4Rejv5idKA6vuP4l8CpBZwkYJfUsaa4l6SvJj1LOS/l8216Vdl4G1zLulcWtLB+8t0TLuS4Po7yz8vIq2ImK5lFR34rqK8KpBLsyrpVhVDGHKrytQk8VuVVx814TreazGj7VzaIGnjX5WZOOWmprwX5Hz3fs7jv41Pb81IZfB0YdM6xLU1278C6sd/laj4f1eFWfzw30acCX99Q1NJtG7r9Pf2PcmtidJvh/oLapOXnXiDaD1dxcW6hrIf9Ds/8Qp5Z4t+wYoq1obcXz1mbX2mcbXNrwvy0t7fBpx4OPaGsvr73z9n4T2sPuoF8HHnTgQUdaOuLUCY9O+H+s/ydm1Vl0cdYVx274f+q5+ZQn3hmin9Pbw35/QeOXfmu+VPeV35qear/G7WuefiP/G7nfOu+Fz3f0f+9eb89Ubxz62KW+sPvJ6+f6B89+fx7/iPePrgfoH4f3wJIhOojuwTgPtlc/2echuP3Mj6F0D5Xr3/focPMf4XqEnF/gjeTfKJij9RtN9xjfx/BiDC1jeTdW/Vjn4+zKOPrHyxuv7684/krnb/An4DfB99/NZ6KdmAh7kplMhjXZczKFv1Ptx1QcptnXaa6n4zBdjn+PozNhznI9C9Zsnszm9xz655jvHLOeS9dcXOY6n0frPM/TPHOar/983vp3OTrfvfk4LMBrAa4L4CyAuQDXhbxb6GwhLxeqXQhzoXz/dkcXwVtkdxbpv8gMFuEU7zmMlx/vLN5ZvLnF671Y78VyF/NtsZktwXsJT5fQs4S2pXov1Xup3sv0WOb7MrXL+LfcXJbjvtweLOf5cruxQs4Kz/4K91e6v9L9le6vdH8lTStxX2mvVtGxSv4qeavlrZa3mpbVzld7Dlb7DVrD9zV6rTGDNfit4eUavNY8umdua3m4lqdraVpr9us8R+t8XycvQc8EtQn8TsA3gZb1nuH1tK7HZb2c9XxZj8sGfm1wvkHtBt5swHGD843yN9qDjfI38mYjjE2enU32cpPnbZPcTXI32avNsDc73+x8M8zNNGyWv4WGLXhs4esWvy9b9NnifKud28rnrfZqG8+2+e3YRv82fm/jyzY5281mO33b8drOu+1msJ3uP+j+w578wZM/zOMP+7QDzg65O+DvwGuHXdpB8058dzrfycOd8HbSvFOPP+3mnzj9CX+X/F082mUfdtOxmxe79d6Nx25e73G2B94e3PZ4zvfI+4tnf8H6y2/cX3j9TcPf9utvz9nfuP6t7147upcne/m319leXu21n/vMeh+t+/ixj0/78Nyv336e7Df//Wa8n6cH6Dxg5w/gd0DtAbUH5R3E7yBPDjo/6Pyg80P0HJJ7yG/JIWeHaPyHp//Q/Y+8f3A8jM9hHA87OyzvMI8Om/MROEdgH8HniPkcwf2I+n+d/+v8X+f/0v2v86N0HnV+1PlRuo7y/yi8o/ge0/+Y/sf4cswOHHPvmP32Thk97vw43ONwvV9Gj+N8AucTOJ9wdkKPEzBPmtdJ5yft3UnzOem34KS5nbSvJ/lyklen7OUpz9QpvE7x75Sz03id5s1pOKfdO43DafM6bYan7dIZfc/w7Yy5en+NnjHXs+bqPTZ61vlZPM7Scxbvs3iftQ9ncT+H+zk9z5nrOTM8x4Pzzs7bqfNmcN68zjs/j8d5Hp+3Gxc8exf0vqD3BX0v6HmB5gs0X6TtojPvytGLzi/CugjrIqyLPLxEwyX8L9F2Sc9LtF12dpnfl2FdhnXZ+WVYl2FdgXMF/yt0XaHrCl1XnV21r1fpv2r2V51f5e9VPlzF4Zrn6podvGY3r9FwTc9r+l3j/3X8rttN7+bR62Z+XT/v6NEbcm/w4IZ9v6HXTRpv8uWm+dzU/yaet/S8Zca39LtF0y14t+Xdxv+2+tt038bptvu3PYe3cfnPLv1H73/4/8eL//h7R80dNXfU3FFzR80dNXf0vKPnXffv4nkXz7t8ugv/rt+Ae+Zyz2/NPTX31NxTc0/NPTX31dzX876e992/z/v77t3H+4HdeGCeD+h7YBcfmNUDz8VDvykP8XvIy4fOHx4MsZBNDAmxSFHRSvQU08XeEIsGkUbkFRVEE9EnxGLOY91DLFEu0VD0F/HieIg9llJUET2EPo+tE3Aery22htgTvcR8ITdxCgE3cTsxSrifJJGAlwRWEhhJBorJIebvjFhS3JLql/RyiCXDK1lJodbfGrFksJK5lwxWsushljy9qCem//+g50lcn1wWYk+pfSq7KCxofmq42BhiT/Pi6eZigsAvhesU9KY4HWLP1BCwntkdYs/i8Sys5zIJup6j/7kdIZaSHyl9f15+Kvip9E6lPpXr1PxLDSM1fmloSQPzBZ8v0PjCbIFzWhj+lomlwysdD9PxIF1noUc6/qSH/6K6DLzNyLtMfMrs098ksaw4Z8P5ZZxePhJir/Axe2LhPAeOr54PsZw8yG12ueW9hlNe5/nU5qMln3v5b4dYgXshVtC91+W/gVchmIXpehOHN50VSS5cF8GrCC/fgvEWX/0dECvKl6L0FTPTYngW53Fxe1FCj5Jm4f0/VspZKfMo9ei7fm/r9bbepeWUNucy+pehr6w9KafG3wGx8vqVXxViFcqIcQI/fwvEKvpe0Twq0VqJv5V4X8kOVeZJZd5VhlOZniq8rEJLVVyr8rgqj/1dEKsGp5r+1XlQnU813K9BSw09auJVE4ea5lLLTtQyu3fUvkNzbR7XxrUOzXVorquurl51+f4uHfVc16O/Pn/r61EfXn2eNzDvBng30qs5zm3sYRvXbfD2rh9ry5u2atqqaaumLZ3t1LQz+4/MuoM97wDDe36so89OsD7Gxzt+rLP6Lvp0tXPdzLgb7d31786H7uo/xfVTWj5z/TmvPud9D/Vf8OoLM/rSPL/iRU/fv9b/a/2/6Rhi3+L5rXvf4u/dP9bLjnwH83vPXm+1veH1dt2HR33w6OusLw/7mk1fO9WPj/141M/z8QPfftDrB7Psz//+8vrL60/nj+79aN4DnPt7ITaAnjjY/m6IxXke4nCOcz8OXpxnJs7OxPE4zhzicB6obqC8ge4PxGcQHoNcD8JrkNkP8psxmLeDeTGYlp/0+onHQ3g1xG/MEFx/pulnGn/2fajvQ/k5FI9hcoapHQZvmNrhvBwub7h5DIc13NkI+CNcj+DhL343fqHzF36MxGMkn0fiMJL/o+COsrOj1Y/hy1h1Y/kxjv7xcsfjPB7H8XJ/5c+vdvE3e/ebnAl2YQLOv+Pzuz6/6zmRRxPlT+LPJF5MljNZ7ylypnhupvBqipop9E/VeyrMqXhNgzXNczGNj9NonC5/uh7TeTGd/hn4zIA/g+YZ+M6UPxPmTLOZaV6z8v4fwq7N9izM1mOO3nPwmGN/5nrW5sGdj/t8XBbgu4BvC81xke/xuMR7Bhab/WJ76G+Y2BKclvJ0mbNlOCy328vlr+DtCv6vlLNS71U8WIWfvz9iq/Vabe/WmNcautbwdC3Na3mwVu4639fhsY7+BPoScEyw8wnuJ/B9vV4b9NnA5421/wfAjkaUeNqMfQdglEX2+JSvbO81m2yyqUCAQJYkBIEsSgkgEEDKAiEBAQFFmoCASu+9ifQiIiD9IkVFsIOCXe9+clZsdzY8u2S//N/Mty0h5/2BTZZkvjdv3rx5bd57iwiagxCdR75HFMnIHzJISKaIarQilhAquFJwxWrDpaXWoDXYulXQGrDSgDUwh5J5CiKIfB+xkQmKAyFECIUvl8TOHE6zkJ3KMhEEjRZj+CbuGCrAgLKCfKsNlXoKGExrkMPEWTRIi4JOcmKj58WXn8er6Ok/n7l0CTGY2El70VPiZQ4zEDLJEqESww0hiSBUFgwWFCahx0BxcCtXN/lEca5q+gntReZE5hFYIkHFCAkrxC7Ih9LRidB4TVqqU3BorQaD1mY26QWd3e5wpftlQXILGHkFjyhKDkkXoClu6tF5MgIawWA0HAunYWMqslgtx8Jep3WOcY1xl5H2MVYZSR8r7mOtsv5gpdZQema50Wq0im471YmoIFgWtJWWFhTkV06unAzrzrcitvjod74AN3zn67C5S/mLvyssVL/D2mjAGaBZdvbKKgrCK2APUvYKws8Ddrr3NiwoXwy+d6Cy6Y5777j06W0/Yjl872B89+B7B78TCXXB42+jnZQX7lHG4kfY6x7c4R71nTL2HuUF3AHYAN1aN1V4SHwRZaPmqA06EBrjySikgsHZFLZQbGHTajQ5tlRfCx+yoaLi9GbOZlPDrY1NjVPDGU2bOqXUVI/TFcrIK3eFbO5yl8spFRokw9Qw0lq0IW2Ftlorsm+7tce117WiViutFbEoUsnDd7LSCq/JjCSesmBBfj7QB/iktIBTib2iOx1km82+2DjV3GzjHZLszCrKpiV+7LbmtSRFbYpLgKfgf3JLnGf1U+xgvzFh3Ib9vyMWHrr+yVxlSNdDKbuX+g/s6H71rblPvdriqGvuhMNbh7WsPV4wZMZD88m+klHL1m7ED+w9p92zx4TDOQ89KON/aZqOWDp80+Py/PnyuoOB8ffIysBm5cNmkpalvYLpeIc4OtLs1oGlWUpT7TSEgFXrfhZeF/sCdU0oBeWg1mhoqBhhs9Q8i1CaJWHBkJuW5jQYgoW+pqfCGb7TQzMK4LtX6zkVFrSnhwo2+C4TCQGdysry8/ORh31VzxAwiMotwegRzcLBnAyrQ8rKzAUq4Da5WZmS0+EKFhaLjf/4w3V034ba3di3ftWq9StxelmPXrfeenu324jmph+J3TXK8cePHj74+EHl+IwJ42fdN2niTzf9BFaaX/etsEfsxVd7Cxofuq1Y09yYa8/2paba/dRb6G7ZRmfUGNp36FKItYVYj7wWb4aXmmlLnbuNz+svpFrRYmnaN2yhgVKxtG8YiS5gEpU5mAxxl1YNrxxeWQlEcMd4gi1fzMzN42u05LTEsNBgocvpMGHZ5S4ucUuyHwcLS5xSbPnujoTCeJUOQqvuqwq3PP/KVZydkX92//pjfTb9beG6wTnrmk/PH9GkXU4rZVv17eGJHfaMbNOjZunflt8fetDQ9ZZlF09iw+b2W7os3bt2ds9po3t+tfPUJ/nfflYctCxxCd279h3Z794pnct61r722vcjXpm6tATkGsa/gmB6n8s1d0hLCRFEJqFghVHJqMoycjgqwvgzA5VBdDY8Y0SZIbNOrxcoSEXZZNYhwQeMERepqii02NxZucRqsZUEJUKshy48e+HxfS88e+EQsSnfKZ2//RY/jV3Yik9f/1a5jcOvAPjTYvD1Oh0VBBkhBp82Bp/IWcU2q4XkBV02Ou2xCxdePHDgxQsv7CUO5Wul27c/4nPYiA343I/XldsZfPQ7qaXviq/BKbgz1MpkNOqIjpgtRKeD7TdQraCZZlhkIBpJaxDkOfo1eqLXG8VJ8lx5rUzlM3UXTmkN5bJs5FTKrwSBWlAJnF8ZY30uEZiAsKn0y3GLblmP80pySkQg5S6saaF8eXbGw9tnnFO+boH1hqXCvrsWdv+zHJM6VP5798V346Ycz/tQjTBI2In0yBHSEoNRFI6Exb+hMn7gALA1yxooCsBsASc5tkEZjA9swAdItXIHPrweH1buWA+0pMom8iTOh/3NCFkowqAqBRGj7UMFvG0oUs9uTGnZAzD+INYql+ChhyPj2V70xm/Sh8gkeN4bMiDKnn0qXIAxRgWV6sPwYFHAiXuTVvjN3bvZM9eBha7yOd0hHShj4Ck2GSrIj/EUQxpf/wbnK+/BOqfAGQ1zHkwNGTBoZwKPUC9G0c2O4ufGQTyFFp2sfcMhfvJnBtPLFD0Az/YRhwCN3KBP7wi1TPEabDbJgCSUmmb2YLMn3UOMnpDZm+4lTur1Uq3WPDWslalzaph6gZhIPcdgC8BBTrkyHPRibE6mCDmHZWUyBg4U2mjsfbDQlgNyXejzx08//fw9qvvju9Or9u5ft2H3ro3K4G/Io8pRZRu+E9+BK/EQ5VFlP87EtA4pV5Vryh/YtPOPP2DdG4E048EOMKG2oTSjQcI6bIAjaLbI0tSwLFOdZMAIg9bysD3n2igYpaE7JmRh/yUhq6gwu4SxwQ58Okf5ZvFGLLfZj0eso5He922cf+eN29dxfloL87UHWqWi9qG0FISMplTZYXKk+Y1Gq1U3NWyVcQpKSZ6Pfy1IqLvonB1xSUeQaUx0yXkdMRdtkgzCLeBc2/qNk7tWLp87ZZXxjOP759/7/pHNr+8KkHemTfhw9ZxnBk28/8HJ1kOvXDg+9Yv7923rvp7jNRf2sCfg1QxND3XKy4bta57m98uSOzub7WN+8zyb1WadGjaDiKU2Gw2kpQUCgGdAptqp4RAcS8K+XIfTKbMt5dobJbAvZTvL97gRxW0r5Vo7KzM7r8QVKCwuAr2cj4uChY2sENS40LP2s/frkPupbGxeum3o9hFjRg5c02/RghkbDE86fnv+3W92Ltt8Gk956vLzz1j/fGhmz7tKtpeO7TZ+xqyJpiPPP/34jOOpgvUkMPhdsBejYe91IOW6hvIMolEiGi2hWMQmMxIMwtSwRjQb0g0FhokGwWDAeknCTO1ycRNMMkPccUnI5QGG904tDtCDNZEpZPYrzyhrFQP+GZcpz+GylXRW7dLV9LZIzwTdu6A0NDjUwuux250Oh0Y2upj5ne7wTg07HD6fZWrY5xOcTs/UsFMSgEs0GoHTOOngqITOr8cn7B+jrAmDEgTSBhlpOT3BdARDkSlEoef0a9te+k/GqdJvVx3Yv6L7Q2XHC2ggsiht2tHLN/AzK96eevhR51sH1j2ws2UJ+cc6ZdCQb5h22gx4lwO/uFAWWDCFVr9fMuj1bmCV7BwH8EWVAyOHxUF01OGA424CzjFgKwX7WqaBxKkPxtmCH/3K/GTusAajbAGHHQUz7DKgTpycE2S2DBOO6uryn979VsGa67is/+Giv2051Prk1Atfn96yoMfCnnsemrMZP/uugsO4Ax6GH1A+TT+s/PvG0KrvXl+7+7YZPR+5fIDz/07ghRawD1rUPOQES0zWg+uDdHoka2Sgt0TYvifZnTHFgqxZFpsdVIDQQsl75pf/RNLpGuGpyODI91gmIzCceooWAa26Aq18KBcVgv1T6nG20OUZU52ZRmMLyZkHRAu2QVaLlZhpOiUW0aPT5TTLAXM6J4darelMKtBWN4lK9TQFq1TDJ7HrDc5ULjd/mf3DKOfH0UNE40Zfhj3J/hO6/vHVZ3U7Z09aOvHVBcsu37N80vxtHy2ZM3vZ8gewkLV91dJtm9dvWItnnXn/7afmPekUfEcnjdw9OLxz9OSjLsF5Av8ycfKUeyfOUubeP2/FlCWrljNeWQXrL4vySlWorSxJaTaD2w1uQ3aOOWNq2GA2p5t3mY+ZfzDXmSUdNZup0wk85OSyhSl9Ehcq9VVFMKE746YIivG6rYTxPbP+gxmJ1YJMEcqUX39+7JX8w8Vnth4hTZ6/79wXNz7AH764e878hx+ee/uS3uS8sl9ZsmKb7zh2/zpkAqq78u5virDn0tEVa451mc19Ua5fhXbcF80L2SUqgpLVakRh21DRHFO1Kq5x55ZpXKpq3W+43qVmrn0ZvGplE7VF4bUKpRCMJVkQJUEC/1bYPlQjbhuKEbzMKGbt81VHuZABZZbD9W+URdx4UCHfWKyaENyO2Qp2zCFgtVtCGQIC/0GSNRgJAhHLpInSHIlKIZuzXKJmAvYJSDfVqupQEAwmqX97EQa55ryPXqvdT4eQW67gvVuV9cq6LWwN6D48WBhEv+VrGBi6RYATgEGgCuKRsFmYKKwRdgnHBDGFCiGbqxzc6iPhVrgCV+NJWKiAL3PxcfwmFs2qYcPVR0G+Kh6SEAAzB14MgzR6jQ7euFFBGzeiBmssDaXH1iiJhFCzgAVchiaiOYAcWyfbncpCWGbDFZYUaXERW+EQWOG1rVvwRHzvVmX4Fba+4SAjWgMfp6EA6hIKaAIBrd+P3B4rKOvMLK3W5/en7xjqd7t9PkdV2CdENXhBcpwjvmtR6QYK2wTGc0dS0pHEdF1xdrBQwMyyad28/7B7uzXFx0iLPlV339Zk19IlB01nUrD+jY8xiqx5gf67+5QRt1b0GFjSdWJlt949BpRMmLb+IcNL7z134y4WNSGoufKF8BjYde1Rd7Qm1M/jc3fwUbFFy84mk9iSFmWgvCJU1KNnWld91/fDMtXbQu+H3W6tE+ucNrM+XV+ln6ifoxf1yAZ2UQu9zaZvQVuXlma9Fy5FrZu9F24dZ3PwwmCpBdwTswaHMw5iAY1kmRl3Tt0xtyErswMuyeL6qaiNjekjd7AkSOGkwvktYr+XiJNZeuCw8VGkyGID8rhsYlQDWOB3NuGxx1auIVLm7N7jZ4x4/K5uQ11ixn13Nmnd+84PajZ+/sDXrw4/Orrb1H/MeOzG4q3Y/8zOfz2kjOx6S9n4TlN6TC8lPynvK7t2aPyD7754dg/2P9Z/yGZFfLvzYNzsD2zDA/6uzPpDeU1Z3XXwoDuHPI8nfI/9+Okfn1SefGb8hEU/LVS+eha34/wPf4TLoENksCf6h5rpCQXbURJBWYNrBg6U2SRjoidVYdCUQzS4pwYDd1IB5GBZIZiVlZXR8EYsIlYY5RSwgLkRHKABCg69FpsxvBN0yyNXlr2Ilf/Dv0S2G7psxm8cwQ8p88Uufz4tPJn3rhLGP6v2+V7Aay7gZURO5EcVoSZ6n4khZQejwoUElJ6ht6fYU6rCdrsgiraqMCDlqwoLtkbUTULccg2oahkhK2ANsHgCuNTgTeeDPGJKBb6DMSfMVb7/WWmCt+Prax94/LTy/ebNH3+Km/c9ebwW6449hh+ouSh2Uc7O2ue1ncTX7h6qVCvzptyvZM7kZ3oy6I7pXHeMDpVZLRZJlj3IYHB7kMliImZtupYYRRMcN6vVJCCplRSSKJIqpN3ScekT6bokGagkabW0Kqy1x84jsOhkbjzFVGfyiYwyGwlkgEYOgNHRkikR3O6J46P3le7apJxU/lC+IB7cf86BnB13PfEYOaj8oPywbF0nZSUej/uTE8qJTpMXKCwgujdqX2qQFTUJOUyCFohts4tGTmFTPQonPEALagp0y0DUwglZaBNGK1eUz5TVuAR3x7dd+OcPM/e++zo5rjypbAPCnVZqsObHGz9hHacXm3MkzKlHg0LFolaLqE4nIwqOq6YqnC4WiMQMX8rEKnGOeEz8WJTTqQiuIRaqwpgibVUY2Rr6Y5Pzo3GVeNjXGYi+9tLNkSZke2QU2MxdtitDtirB7aosfh7w6MDtqdtDBVgUJQ2RqE7P5jHjPrgKg4YqA+FKDRSHnE3LMRZlGVWBCBJt3NJSeQ6mn5KYnmk6NjHY2E48j+yLDDtPZwsHFdvOyDWYP8YvzBf1Ap+b3D6LqNc5dUhEKT7NmbrrIa/RWu5xV4U9HqLRwD7o9RqBAMcTe8wejc2M6pmijM9zwJgCnkAB1RKVgD2AU5j7L/T64l9/Kt9iDdbiIVOfqHjz4B48oPP6lspV/PGiLXgq7oGH4oHKk22/qlW+inzULANX7I7uVTO+V6CTZUoFDUJ6QW8wyiAjKmS8Wz7OLB9tQkaUFqi7UZoU44N9AIKwYDxYF3dHfj1/nujOk4mRdWKXyKuk+M+n+X68CnNhPldpKFWC/ZaBF7Vag1HQyMAZso3qkR52nya7nXHbJap8oxsP/m7gVVqivIjb117C7ZUXgfY3ftq+XTCqe3+87lv6AcxlAUvGY7LJPBJgtZmB482U6qqYX21Pcl/iWjFmseaVsNCcF8NM9IO3n33ictbTtmnht5RL+Be8762vTl5Inz4Xe6k2ymuMjq/xtZWHcjVarQ44Wc/oqRcMRpyht5YTWYeny4uBmliTRE01XpRMUJCzKlGxzInKpC39RvE+ClRt/6miIV3IQweVfCBtFdkTebH2Nzb/dzD/7TC/iNJDJjADRUkGDGjiLEUnYGeHnZ7vzpPdYpcbg7bDs/PgWeb/eQB3lwshj0a2W4xGk8nuoSleQa8328/UXQgZTNZyu0bjMlNTnBUAcTXM5U4YwCpDtCkD65Fm0dw8O1uF3eUuw3bgjoOUhtL3Ldtv6y3s/u6ssyCl+dlP6aglt456fYDSA59q+YvyTu12kCnuopNDVuJ/c9ZJ4lMj6hzKlQVBRHq9QTSYzPqVGM/CeBxYbBJdoMHTNHgMKDXEjjDTZ5Vl7EuwIcNil5OhhXOLGMt2jvxuOfQRsdgOC+MP96vdCJRZvXY+rWazEzQGzvMYHltyMhlq4bzkcmuBl7QCtVeFqb1RGaoe1WAhiFHQTDxWJIxRfvv9D+VPLER+w5pLyqvKxZ1bHt0IAvyYshGPwYNwXzDDH1MOEWfkG+U/cJ49/N6Jr7+K85cdtQmlGJBFkmQkOx2iBSQ5iDaNuSqsoVKy4Epac9QD52KrUJDbBGDtoBarZny4TvnqPL78PaYXlDO/KpueoCcefPHeiCJ2ee95JfLder5+5UFhMtd/Gei2UDY1mZDPqnEjZLLSQKbDWxV2CCY/kMFk10vV4So91iPVSwrGqBINiUddBQuJxb3ZQcslN1PppdNNF48uaV854OEXyq5+eTO1PlL2NH9oinGx6+CrLnwnDjVCNpVmW6I2R1WoCBmNWmwwUJPWBudSK7hdBmIDKdfHhs22MttE23nbDzbRQG02JIpWrh9VPq+nhlCw3lFNMFQWpy2PD4Fj25TbHfScsv778/izf/389A689nflTeU69qzZQsoiz4ldnqvZdDkl8gS98rHSbC7j8T7AZ2OBzs1Rj1ATScx0paUaEEp1iUKLlpkGL/VmVIfT0rwCBRUZAvuCSJIqwyqT1EZp0mFU913IyqBcmLGYFskDi5vfQrCLqKwMp8NP3H5BGKv89IdS0uNs6vENux7rNH5R5z3L+jX76dq7nzR/xrP2QeWLoqEzu6yYVdU5D0858zoekzNv2gNTug5um2VtduuAe3sceXrj8cCk0e+179k6w5ZV0L7fvWw9t0dtPhnlhmwyyHsCnhgSRIHRFtuSghn1IlcBJ3npWaWL0EY4eGOQcHA716mrgTZMl1tRTsiqlcxwAm12CwhYQ+L4BesdP8ZbXhy08pACnHKhw+e1P189P23rnvnP4n8rv/z0DcZ0Qu2Ry7v2vUu7sjnAehGe57G4wpCXgtksEa2O6PQGLaEDJNxZwhLCUbESn4xbbYXAAGAVY3apg4Pk0suKfAmH0ouaNMcdL4ldamcNfG7TfLoY5ojZ5240NNRaIxutFnBCHQ7BqBVcbp1W6/Z4hQJLH0uVhVosRpeWOozZRmzUgHkka/jcbH2gM6IBwPiS3aVJ4bZAlg7nmTCIXyZ4O4LgddncPhykf77Zo1d+WusZb75zboLFmpE/61iXPq2zxp7DDpxx4cFXlf6A7LkFf19eg89FlI/+iYfQ21T5mw14H+TyJxQKUAlpBQH8CKCORhRkjaAxGpCWSgLWCDam+soYfu7SJL0adbpAv2qZQsvi/4JkDO51RemF/3lFWa6suIL/qfS6QjsTHHkgUkY6RF4gz5GF8fkPcDu2YyjAptRI4E4TotNKNIQqUDWiZYy8WBZU1uLkqQzG2MtWWmiN8xhDIEhefEZJvYKn4/uukPLIGVJOIpEd5E4A0h3mWsDtxqJQiqAhWgpKW6eXo5xLQL2ApWpraKWUxqjfFLx3xsY4ICy48TItjLjp87Wv0xFrhJTtK258xu+2tiqD6DnwiWWmUcDAEhHSaLHwSxjWIP4SRr4kjRI/Hartg7eSLGUdnqgMkqet+GPPCk6fqXA+hsTuTghGFFNBBHfQW//uRAQmpftq3zhJi2KXJxibAJfWMVwEkPiyzCI+v4QBKfxfcGH2F7ywCfBYB/gMWiFVrfhdxWURfkroCvSTUOuQRxRAMRPwh6gka5h/ii2YYIGxSGVysgQ/R8AchJ0jehh8iqcewbNeww/gp2hW7Yd0Re00eLbuRl228FbdQlinM6SlIhiU6GmgGcg+zBGTge6i8P4/q6s53+L1wgnaTqwBu8gT0jNUwBFZORRtQGXxSyicUxR0O8mzyrsvXRNOfJn2gwN0B4uJLxV6o0xUgEaF2rUwe1Nsmry8jIwUM23V2takb9hmM6SavRO9H3t/8NZ5RT31elNTXRXhVIshqwJI1xfUssbg4pkE+YlrCNAi7CYi4VBE5XROTB1GIxGWnJJYLMbG1ArIsZzCjrgDi9U4HS6hV0qgc7dRQyWp04n5O3fjl78df9/0sbpnWuKZFy81i3xQvbHfs9Mf6BKeKE+yjJs0c/zhh3GlKNyyYOodg604++kTSsuKvtKwrf3CAml1Z79+o5ie/xus+VbgAycKsJuoVNFkMrrY7WuWw1sRtjosRqRz0nRYHOV337CmsrL64c9oQCUvC7RgFpO6VoccrB/7LBZufe3cz0OITI5KNYIw9Ce85KnZCzYtXbh5yUySqXyufHmm1VhD8UHhOyXcadjFyOVPLl396K1X31Ll0HzAsS3sSwoaG/IbkSxJdgdy+FIn2TGyW+zV9kn2ufYLdklLuc2a4fOX2+0ej6Ui7HFRXUU4XZ4jr5GpHIJfgAtgUe9uE9vDvL3JyV4XuBzMOlHVZWwJJW4TrBLNx+TnU9+mXrDMnb5zw4Yd96y2Pmuc8eLMX+oQ8cPJyDy20TR03ItXP7oyfoKhekcYZ6i23PK6LwUv0NkF3NUulOaW0pDJZJbMWdl2pwlpMirCeo2FplSAJxSjs0rsOKVVjuGhZeYButzBPEZqd1ZLED2OxB0LHd5678xXn8VLZz7ampAa6bAgRT6dsXj9yiWbltx/dFwVdmEPKR44cjN+9Ib9YLH5vnx8z0evvfPl3198HfDkdwZAawdQu0+oOViiRkn22u2ykfpSPQhI6tFZLM6KsMWioxXhj6UfJDIXlKSkc3GrpLJ+5KaBWeKKB9Si96hWJwZuDxB8656Vd21L2dn8m0e/Vf745pv/KDmLt4ukPBX/dur1cK8WDyzEudiG9Thd+Uz52IPfPrYFlzPeWM79mMvgxwRDKS4mdojRm6KzVoSZZheFirBLNGMnKkvK24htdNz4iBpHTrbbJpyGwRrpXAMGu/Tcp+WPN/OfLhg7vjX+hh6uvYMeXu29ctioWScaWo6t1K3me7tGGSz4hZ5wggpQ31C+QGkTa6Zbq023prdq7TM7cirCbofF1BxwMjmRXBHOEFoJRBCYkC1MMpqDST5bUpJDzC+1FmUlKAfb36a4JCiBjJBi9yhsUEdM7jpwOfWMdfKw30nro/e/fPrFy5Mfb0E1whPSu4GHFyybFbxnxIB5XZXBy+d5e/bFtzx/13hMgSd8WD9uhH+NofhQ7cvXvqBvPPfh+Y83H6uoOq2ewbNATca/DvCt3QKx2x06vUPvdDl0TtlcERZkC0KcyPVsMi4d7DGB4AV7WUXVmnX2SS0d9288/MlxUx/YVSNeVmbdsvyKsiBSQE4vXfjktsgqRlcex7oMOtmI2ofS9QYDZnsqggOo6x/WIw2QUmNGAoVdps64aq6nttRTEw0eFAXyWI7fv/ADtc3wfuU5/NPFi6tXr6b+1W9fuKCe02mgFzvDnBZYaXEo1epwIGSQDE6Xzdo/bENmU0XYbKZamDCmIev5gFzfqrGEItUGjU5KO3/yRp99LR6ePXe5Mo70vHgx9em3U6wrMxfOoC+ps2P0bXS9etQhlIZ1Wh6a0WrV2AwLJchYYwb1B8IaPJSyWJ5C8sWlGq9NDiKsV9YvrKnBV99RuuPX8U8jlYni5doRxKgURDYjEbw2JAyDOc2wYiu4PrDcHNGZAx5aHlf2LrfLnefOK6K3Ya+yenIbF1U+xu9hj7P0LsuLG8TVgqOrf7HQfvWNQAuXXVv13er7VH65E+COAjmSh7qEMl15eQhp09P9Zo1G69c2aZol2GHPUlxmu8VgTtfyBcGKgg3C9knB3kCcc6xt8kB1B/l1rFv9xn+q/prYW3cK9TkobZJI5tjegwfZSZOJA6aPOdC60629yNGtsy/si+yh/c81m9NqTGX1qPFDDr8FLAc/P3AAWA7w/hvjc8DbgwpCbiugizxajzcF+AAQdgC22ij1GyDaEEPwsII878tKR3EWlw5hQgkd9+ORQzEWZ3iIzUv7XHn6+UgB8B7Tc91hbpbPAlaZmsni8WrhfGktFGQuUw03xxwSWSn1NG73G999/Vvk65+/P7dsy7a1a9fuWk38yg+we9mgptywm/9Wvvz7u/945+2r7zM7QBkk3CpUwMxZzA7ws6V74ORl5zh9YAc4YeUaHwnASSd/ZQcEwAxwxUmg7lJ9tG5V7v91gCg8KR3DIJ4Ltz348vNPzVqwefHiTYtmkczIq2c0OxUwNg4VC8E7PeOqAONrnz139aP3Xn5V1aOAZ4rQg+vRopAvzemmBoPeqc/KtoEONdlceh8CLUqBncsKOZZJSKoES5KdWdaSmExNTkYk1nlbWxNZPCY9KZCinQ+8+ix5b+nGxTNnLdiwQugRrvLPMRR/fqMYnz5w92jsxU5SHPnk3Vcuf/zh5Q8YD/0HeMgJ++hETUMOkyTJstPlNtntpF/YbtGbJSfPoEzmH8Aqzju5eUHG1yRY6Back0btebnG532iiUYsrF5YNXYMfdj+n6cVgZy7/fU7l0+aNK7Iqp63x4F3skEH5aLeoWaylG5P8RrAEbBLQl6TdIOLutLAtEiZlEL0NCXFZWFmEZhCrlg0NJEPcXMsIR4ZzQADIy87ltGoGkdAsHTsJ0L2v15//e+BXfYHN2PTyNHK76tvf/fS8bdT9urvn/FL/2EzHl3TDxdtPTZvRfrAPk+E+ng79ZjYf8P+RXMc5T02ty93pTfpPU1dx7N11+kf4h1Au+KQT9RqicNhdrmtBuBBFzjEYICImFJ2HR0ssDam0u1FQbt6VcC2UrWvi6zPHmp3Pz6uVAwYsfjRg/v37gU9jlOUL1dH7utze+aylss2kl1RPQd0TBfaAemi5x97PNoUn9XphPPvdBmdGhCVjZ5/HI86cKOMxIx6K54w8qF5Dz8ZFQAdH5158jGhXaTf9pnHd5OptUdUGTCp8sRlErV3uwD/LAEcdCzqFw1JUKIjBr2WmONBCWeDoETcneJRiXRchsHffe09pc+r2GBtk5WHHZdg2lDRmWnTyfN8HifMc4avdUioJUY2s4lKot5G9VT2eDWyV/alUJNJL3u9Ho1stumn6RfpiV4EjPjcQTUkEUuQrn/ZmhSWoHkyD0rYnMUldhabaNORwBv65+U1pXkHXjt9sjKQZ1/y3PwMt8ZgoKOP47+/uiLyb8B1j/J7x93F+IAyaNw9/iFVA72kiuPN7sMnAN56ZhWwuLuMBXAu9ZIoEkrZPYZOwIJGNFNVVgfd9ZK/AD9VYKvhCP6P7lPOK+eex7uUqa/g5rjZJWUq3oefUTqT5sSkDMWPRX6OvM3mvhXkzzKY24FKQz6b1kRMOotVr9NZnS6TVitadGYkVsTd52B9wpSqG4QzVeOA7RB2uUvgqwnj7B6FuS37rGhlU5pdwJqhclNc/KzSNnxeGaRfIk2f11ooiDz0if9earvx8jfPcjpsADo0B1x4zEKmWEOAMXR6iQpgmQtmLDNbEzn/a8wiGAtZODeQg5E59PbIQPLGMpq7YlntBysA/jVYaw7YBlloYKjQkuXya/T+LK9IaXYOsIdG/iVs1hRo1mje0PygEa1Uo7FkWay/hMESzKwXQYgGUuMXufEMRsyOB8iUoo4YvhcHA04uBNVEIeb93oKdNHX+vvXz5q/buxBr3xtaMfeuMfMqhr6nDDq4GFfdfb+4TJw1Flcv279i8N3K/pGbvMSz4S7lsfFhwJ/YlUHkLI+PuEJanosK9mMii1jNXyH2/SyowsMYTI6C/fcvvuYhoSKtx0cz7GB9ZlBRzM7R+lJ9qbBoX4Fvje+Y7w3fDz7JSn0+O7LbfgnbGwZOGl+2W5VRTFBE86Os7Ma6KOrvu50mtnIp6/H3hvadO2bM3Iph72Htoj2MBPvmK4NWhMfjoWM2eoj34RF4yLghK/YvU3aPmwl0mDle2bPkAFvDPaSpUE3zYOfbhjLsssuNLEfCMgq5U8tRSGsoR/qQXa9n2THRqD0wRorHciU/vzCe1lvoVqP1agofj0kUFeOpYxZtGJQ9f0r7qQO6rOs+b/Bt93WaSPNaBh3DNjXLbZ7SomnBmjuAjHV1KPrHIgH1eV2O8iu5FM0zahGyg/dDWcQJIfDLpR1DZTM9g02Je4zksFPQnmV3ZhURHy/NIUdqu4udL11iMae6F4Su4p0oHc0KdbMD+2m1RsHtclEhzSgYMwIWMATS3XPca9zU7bZbZF0GxYhaaDWdROfSC1TSUkp1OtApFp1FpzFbsVWDCgoq1SqZ+JU9txwKKuuZEdbExb3q0bLKj1xS1MaWqPhQzQkye/IG6ynn+3vmvvnF11fm7ricdta6YNb2PQewcdI4w+ozphdeMGP719ex13bmjPHgStPQey6de/kS28e2wLIbxCGg0+8N3ZKLkMOeSX3phnRKNXZNXhO/Tq+bGvbBJhqoXk8tFvfUMM991FKHwyILmTRzajg3l3q4ko9WtNRLe2yQSZqIMkhZgaKOpAPOKgomK3uJucYBdtvBbqCFDYVnatcM6pbz1FP/d2XL5cyjrmm9Z93PKnnK+5PBt5Tqr1/f2rz35H6rVv/z+VdnTigtC0198B+rV8xd07yoiNtyO9GnQoEwFY5MHhoRCqaiTBMyNWlq83icWtFALCl2tzuFiILsdKYfD1ucrZzE7ITFOnWCIMs5x4Gno9sUjCVxooTpYmU/T07halOSV+KGxbhL3LLL6ZDdMivSyJPzSnJLkuInp3qPGnvnlJXLpowYW13Rb9SY0VOWrZkwbsyY3lv3TZuy/7Gp0/aRw8unjLprdL+KEeOqpy2B9+NG964YN27MlJVT9u+dft9jj8PetYG9e0TsAnbqkFCB3WYDT1mLBBfVGK0aykL+st6grw4LBmq2mKvDDmQxwF+N00Y10Ug28GC0OMsa3ye11Mim5ugA77HdiCYmFAVK4KVGuWtxJ2UenqPMO6kswA8SeB9SRr+Cx+EJr5DHVy9bW8cSwpetJjsjm8k47veCrCwFWXmUn8/ckBUOJ2J1cyISERZ8PB1fRSk5Nq2mFYIE3b+f7KO62l9vbKL62l/Y3u6qu0NoDnK0DeqEloe6lzlv8dzSvKBtka6wsHm639+8yJbj8dgESm3Nbbfe1tZUUNbU6SjILiDGAmwWCpzI58vsG0bp1elgsaan+5DcNywILMZQyAzWgiSDlWfTqAZH8oVv4m+0pE2Va4mgHpxScFF48pAz6fqfZ4HncSu3hH8FzyCPpfzC+I6Y3H/kPd8e07wJD85rP3H+hu0DZ4yaNPqrt9+6mrnHsWb5godD03a9cGj2uOqJ7+BPVxyfMO+WifNmLBEvg6Xbp2+4W6uubdKz+k/ve+fDnlbzhm48uGhFeuWQ6gFte7fNa7F9UnijP2PxwBXbal8rH9tUGn9H6+7FATJarUHsI7xAHxBn8/0pDmWAUJX5/mCE1w4VwCRFVegYOg/bFXL5o2mGDW/aQDIFWPzj/x6NvPOY8MIZ+MPztNJRrnCEx9CaoCK0MzS6FTJKdrtsM9oCTb0Bb3EJkizSXGmttFsSEX9DWXqTTkcvhS2uS2G73VKlw2Zdum6Obo3uB12dTjpuuWAhyGKxTLLMtQhaCgLWkpaT0/xiOAelBS+G095M0pMsgY9JWiZrWc1dXPLGrttiplth/SBiLhdO0Q0VHUTIysxmMpjlMdpkdhnPsvjYPTNePX18p+qsqW22jD9w9uSB/xs4JWVE6O5JNH218vuJE8ofa1Zj7fHjWLt6mFL71ear01Hdv/6FCbmx5UiPflnT77722qsfvRW4reue3deUswefwF0/+wx3feKQ8vTnuAXutk754qLynnKKRSQZ779OVtCI+Ah4qC3RyBCIaX0WShWaNbMhW0ErZ25G7udhmg8vakpNyTiDXSGbWYddVBcyWct1OpNJ/jxsOoNjdhsPT5ex2yyVNDcFCO1twJIsapNUrpBwfaJOSImagMwuEvDrNSfP19wxTL/Jdnz9lv3p+V5PYZutkpC/fszMZRv6de0y9dat86fTMdNmEyH/VOdeuvH3L16kfNiuvWa4cXev8JQHQz06TygOCvySkNXtrgJb4zDPNbsj1BRpNFQQJKy1Wg1GsxGDerXZ9YRIOozNkoQMFNEfhmrR98w7h8VEM32DsUhWrKIhKXaHizAranAGYm/oYeUo7ncSvtwRmagcxxUnlBO47yo8oQxPTVdWKuvSkt7Ga6nIf+BsNAnZsUAFSTYj0CMI/LEjYfo3zomWl/ktTTRhJocHv+jLtUfptRp8eH3k+bq6WD0U2DQs2CnEz40ZpaJmKIgeDHVxa5r6/bmtMjICac2a5ecGcjUWIE2borRA0/RW6RfDmQUXwyjTkknMgfQAKOpAq8zMVgEqGAz2i2EDElIuhoWkkxFPba1Utz5404mI5SOwg/EX/C/SpFQFO1VzJQuLhSN/yf/KR6/smYODqzePHfDhrqq+h05V3EH++OsTMA1XKMdp2UMTx8y2K3tJRZdy5Z0BdXV1N8T/CG9J/WwyuhUh6XUu07rRDLooWr8VZPktyCZJHi91HgsjiplxptWaj4W1QlICZb0LyViZQawwIxq+oYsOTp9+8PH77398wl09e941rnuPsUKHGfsPTJt2YP+M28eO79Fj/DieNw6bOEh4AeY3o7GhEjBGJUoFs94g6AUL8O+RsEEgprAsmswyNsvpcpU8UT4mn5fB6pdFdrtwJKwVz9Rd+JvdVS6CyFXjEZyTJufzNPJGUq+TKvdYRnmieo8llpMDyjS8Yh1erkxfFxm8jtdu4bYkSDeKq4DLOocyjSZTCvLJDuRI88MBM1JewPV52PoRK+D6PIw+rF/AleDqeAAs77/XcLlxO5I+954Rg7v16DxYs8i476EF64ZXLxzlwa8REryry9yet05p37Fn986aexbMmdRzcefKYYV3MxwLSR7dAjjmoIdC3TLTTSYRebxeSbSlp7M0yNy8TJPRZPw8XGWaaCIGU6qJaE0mmspK9Ao81Eg9ntRU5+fh1I+o5vNwiF0o0Y+TCi+SblGjht5f1XNl8DqMoja8lqu4sVIuumXbauWzjKW2fbvPdSitGNajW+c7pCXGHXPmbxw4ZOh46rtv7jXj0o3LJpR3at+layfDhPtnjOx5L5jW4xreL4MmlmSRrBwq1rtfLioJOkW8/tpLyrvCCccPaV8yk0uZIbQHH8jHciGtOqPRBH6Jx+RJTXObzSafZK8Ia6nkQvy2Sg2x1jdpWNACTJIs9c5YzWbj2aBq0IluJBph/Of95mYIwqlTWLPg+JOSfm/K1VC7/D7KCvGFyAPKC8+BxVd77HwzJhfnKM8IbcFGNYNFYRYliegI1mGLVTCbzGew5XRYlrGJSpi1DuDX1zdVIVmz+F/1EAac9PTClxYdeP6lI6Sb8NofP0rmP36kz549dPD8LOYT4ut4H7lK3rBJmiD3tWconfE1eGdHZaGAxWo1m0yCFk47cjithvVha8hoKbdaZTORV4XJJi4VC1QtGJUBSfUMATWmwvdaLgmyhPBryvelgcLsDR3K802d7s4bPlxRnhJGSgObNCOnRtH+aq5AGpytbeJ8ZEJFoVSjAUs6OPO8DPNzXob5T1aGmXyq6pVhqkkRoGKLwCRhxXc4C2u9OwffuSkw81sSvJuMLOw0oXtZJPVuJm8+A7vg32AX6MEraBEyWnl83+3Rmj8Pa0Hf11AHGAVgDzQS5G8o6dRYI/33ladOvfb66XMvb7p/yo/TJ0+bI9hOv/n+iVNvXjq3ebFybeX6RWzeu0FH3x7V0QND+eBwg1kvU4x1BovZpDVZuJa2guq2yLKBUmSWkPQ/tXS8oILryyxWvxLEQIDoG/LnSdxPAZ3Sr/adGvbuJO6zKg1PxPelK6vKlA3xt2q8wAey+IrYxZKnua78ipAlV76OkFXW/IQfiZwCve2mxOGhpMKJQ06YpdqCLSgDeMhaWcT/VYJPWcb8SoBlBVjHo7C+VWFdZ7B+xIcjNXBmjcTuaQgBHubP6jkefeHZ/9QF1Ge9CTwyQjZKmjE8CnCoABegUAxAfH6g9xblY+EeoZTX65SHWLGOJhDwWGGrkSczS6MJ+AIZO4YGzLGCnTO8uorLuLL/WrJT0oZJbVISNBE1G4RbwRJT+diZVbSl8Yod5Zc3Pq5DZPILfbpPGXFbH7Vgp2ufpIIdYculS2q8RrgsPW7LZVlXVhndVvco+gk5a4hJzCVn6h6tMdsEOQfnFyH4Fx9/ID5+OqpEPyN7SM8fqDRZE6NRI+PJEviBOt4M45HD1Oj4HfHxO+LjGXzkyWl0fGUcH1Z99hlyh4yUPUAJslnUJ9gj9Z6pjj4jkW10AHKFDJRkUUpoDKXEvrLb5ye4vHSi+aHbdUazA1sJiEsqmTQGg9NsNlIQ6S4Hrgpr9FXhdE2BhrAQaZmmSjNHc0zzsUZOpw6NQ2MWrLIgV4UFama5jGYbiqXNIu6oRv2hWMGdrTRRYFkafTHvn2bhRE1EwJolERogi5UTqw/gL8k25RjuppzFsyJXuwu95uNUvF0ZJXZ5ROn3sFLwiHDSotQqGzgdJiudWa0L0CGX024WHgnr1Z/CPp/boJKZj+M1HnwPm0R55CzsibMGG8RcfKZuR43RgnRJPNJw/HQ0VN1D/kCZwZwY3Rj8KI8AfCOH/3mNzdAI/Mo4/PHIAXvuPUUYfAJP/F5jMalPqLsOz/B6BD5H8+gajiWv4ThbA06ao+H46eiupDXcBWvA9dbQYHyCz/kiEKygsfGVcfhxvo0uAsEKcDLfAh/6ovU97IJvWKiN1+4xmzWCHTySFJ9JkqWqsKeMGaws6+m8/IMsGqgsg2Z1V4F9IZhvqrBirBZs6FpyDuM1QVlFQVYXhAOsKMjKq4MCsdqgJUvU6iAlTfl477uv//OHmTiglgiRAZvIUOW0Ela6gVGhw5oflU7RPWsm7YT1to6f6184fUyMPp4c0VCPPjwPn9OzMLpfh/h+EReXS4dq3CkSStqvhuOno5FRucEeGOnyJkY3Bj9JLrmZnEl1NTp+R3x8Qi4x+CijRaPjK+P4jEc0JpdcTC6RFI/6RHx/MdqBPhVaClNBF2WHzIJOpyFI0iCNwSjjk8jb4MIP/H8tLtFitxbLWrwDj1R2j8XD8fBxyl5cPUbZpWzHPfBIXH2XsgtXjVP2KbvH4RHKDhb3aVv3gbBenAT2lw9lonCo0JXu9gupDptZ1AgoVdY5rEiHsrLdfle6EPAaA1VhUWMzC9RiFKi3Kqxmoqv3XO7SaPQ14WtEe0hFyyJ4nJUn/fP4K22Th1mtNHa4cW5WBq+R+GDutOGrqrAQ+b+59w1fWX3Jr6A+jzy6MbLeT1CvLcpFtWJi+fZO546CndUXVy/e3unpQ8rH+6ZE+i3HHqzbfx85vEClO88d5/vaNso3u9RzbuPnfHeN3VWPbxqOn44GRs8te2CgzdlgXxuMTzrnds7HtkbHV8bhJ51zGz/nLkd9PoBneP4zn6N9FKfR0Tm0MMdorUHQJOZIqhcxgn1ZHEq16yRw6pAMdodorw7rbNVhUSfqpGjFiHrL0TCDg1eMOMGvcPKakVicoOq+qw8rX50/j40/YHJh375flS2Pk5q5r0xUxC7ffHR58abIhW1Izdm/JqwRL8PpHhgqkNINzW2ePFseSs8wgLFVGDQ099Bsmu2rCGejDCfLo6qWJklzJQr+nivu75XV46VEJnm8UqsARyO1udFAbcyd5RkUar8lmbdpcPuxsObZA09MIu22dhk2st+oYUNLi9sVLZ6wcUXNN18/++nkbs1unRGuwnmPHG69L5Bd1ee2cR1KHurXYVSLVncU9qrcvbeWCvTal3uWLh9d1j6zWZeK9g/zveG5wmIN7E1nZjug21YjJpVaWZlUmlTTuo2Z1Nv/huOn90JcarAHCloFE6NvHkuWfI+Q9zRpDUMzioF536wpbsUfqGwI/2D8mR2/I5QZMnH4rdrhjHbY0g4e/aCmXTf10crow/FnZ8dxGw+mtz+ko+xhSjLawHNv17QpjE4ZZdDYc5I+Puc2mJNLtiB7zlbcKiU9iaMpcsD4M0JvHmVuj5aFehgyW5cC2Vq3tuWlpqU1tUmy3A64pUPHYm+GtyJciirCztZ9w6XOUqc5OzPDnDoxlehpamqGhTY3N68IG7RmnntqVlknel0SveZSC5gZi/+Xtm3BWL4cdkZrb5lbfVMmNgsbsGsjm9UpJsKohOettsTkcbGmZ9iyvPOvM5dlttk0Yt483OPxUHmP2+QD9m2rjncbsGf/wVqxtDRUXTyrT9+WZGe/SorHaQfj36zKquHlLerQvbNm3btvJ8/UXjKx71Dr5lUrVihfKP/0XO43Krx5MEvWHkV6Hd36xA5G8/lgq7UVegPNu0Zttb6qrRZI9yFHwlZTe38wHipX+fME508f58+TNanpRns9/mw4fvpElT/ZAxN9/sTom8eSJbI6NhXGygFfI2Nnx+GO10R5xMd4RJOepo6O22dqzieD/ZOK9znGi3qss+biaj2u0AMzHqzRmyjmTBzn4YbPTR/LceLP3aEz0mSbrsFYskTHzwrWszksuMKCW1lgml9rLLroNA3nmR2fZ3xThApC6YRNRPBaE55rwpNMuNqEK0wYYCKTQdKqMCor44eHoAeBLr3Ff6AUsLnnhHoIssEsmCSTZPUQn88a8HiseU2MQprQQqDEYDNkGqhZMMhmQRCNyF8RZkUVFkRYNYSItE5nNktOMhmNWt6YLFjvWoVXmqq96irrp1bG9HOhOzdPBPXMMs9y3DKyOnlSYYMWfWTUsuEDlii1JR9MWPRWxRCsKXkH97zx69e//05SV23fsW7tuj2b6Du3vDBr6r3DB3XLvnXKPcOUd5SApNxQfsLkp58VxXThyNHzz548BnTkeZZcXvVV5ZVO3S8v7IE2q5XBnbRfPC+S71c/lSee4rzs4bz8dI03tYGubTh++miVP9kDoz2+enq/wViux9lYwIMgv6eRsQfjY3egBFyUWdDI2NlxHJi+53zvYXyPUlPqaXuK7kMfC4OEafx+T48GhIr0RMOasYiSaDRotEfDgsY0FIvAUEfDZozVWvZj+AdchyXgbjHeHw7F488NvEf1ApD3a2OXgNYDkafptchTB+izp08re9evV+acPq32bbgXcK8EOc3sQtY5p6hRuzA7J93ldwvegDFQodqFRla+ZqEguWPaXE0ttP5/WodFcetQVq3D4hxuHWZKQqVS+/vlOb1uv+NOjH9/b1Z574oR5wIK7bX2wJbIikwc6blp3zbiV64rH909qHPV6u+wBWeM6td5yLLfNlRFLlS994/1w0go/HeVP3iOH9/zwSo/7WX8hFOszDLcXuPze+r7IA3HTx+i8ip74I6UtMTom8dyfgLYPg77z5qMlEZhz47DZnzCPNgUK/dg/6zxp6pPJNmFPAeNzzFMxeduFR8nTHK306Ozxmcg6CzL6+U55RmoYyg9TUpJ8SGbzxbITAVv0eVwgAnmcBnMZloRNlvqXR0k1Z6otmGSLMA8sdeayPdlOf50aSyRN/I1T+yNpvrWCCQzmsNLeqkpvdE8X3kaq/dJrGl2fE3jRaRax05GCNHrVlcV1xNq7GZ4PD60HBGsT8SHzA3jSaqN0z9uqyy/mmSv/VzTOmqrNIgnHYzD3xLzU1X4Vm+j8BM225bvEvadHLwlAZ3BVqqFj8Uucdjb8UXYH/0pYmOV+AkdPlcZwOrRojDZuMnwC9NZROqeryktJdxmZPEb1quE+wm5UT9hYdRPAB8WT3enGOSb5GNbjmtXlX/GqPzDmBR0fdSMUHFVYR+MwQZ+dkT9dQ/AltLcfw07Jk9xKpPrAV8jsMfEYW9FfrQ1jrfV7W0U9uU47K2OBN5+X9pf4r0UWaN4M9jUm/4/8F5am4AtpmXVg837q3DYeSrsumsAG7jJxmMSL9c4UoSERqIove5L4Q04gyy3vikaFHI1zc7OzcvL90h+ZDZbJEuzfIczt+kZbAjZw7m5ZqQFiWrUWqjvpnIwVaTWy0RrWBqmFgc1XhuGi+xBJyWbWy8acej0M4+NXBirEFM6Vo6buGzRlLuqyWd9XnqClYllYT024qb1C8X+783rl8599CZeH8DZOconidj9aOBnCa2P17o9DOv1o2ZoVChPduXQlBTkSzeZfPnNwRt19w3ziz9ipx6PJQVZmlSE7RZWumfSGsotZn1mRVjWuwRnrKAon39Vezk2DFS51dRrvtSsetVxRayyK+gEnZdEAcHOlisml8gp7+LmNQtqj05fsmHFos2LZwqHa4N8uUAEM7aQfCDBjgU7diyIVP39hdevvvH8a/HY4/B4rHI5soH8iccRf6kx1o9VqnZw/7jNvJwk7GucWt9mVmEfjMNWZU8c9uc1ZncjsBP2+BYhAVvw5zYCe0wc9laAvTUB+4sag6kR2G/HYW8lUhw29aXVhw3yaiSXa02i8qqnKq8wyCunU6eLyqtFMK4rl2sqzO0dVammfF+TnS1HA86N0GFpQzqYHH9Jh6V/JPk8f9akZTXweXjPHg6/WTyGo8oIH5NtGSli/fg0r/Pj8Huosu03lc7MMZeKW1lTG8ifZNhbQA6osFMAtjYt53/A3vJbQn9IwVsagT0mDnsrWGNb47CtKamNwr4ch701CbbcqrA+bCXM+hhFYUuab1TvUkxJiwKNwZNQDJ7m+zoVXiHAMwbr00GN9zI65DegcTQeLujqxbB4naF0ELSMHyRlS15p6E/zeHxulyvFp9fpfA6anqGWHMrIoXP6PavDbv/KcIqb9RB6vTA/nndfr9w6foXy3woSsTMrL0vOKioJ1i9NJL+Pu0q+HqvsE7soL6k1ineT2byA65J41rFihYO1ZGRd2IRXxS5gM/MuDw7B4KZmM7IYZL1F7/G6TVVhl85mt1WHZWqvcOPd7uNu4ra77diit4mx7gksXpHozd9YU1V7NIkv6OQJPez6vYjZ9HtZ96Xdu89Hfj2/m46L/CrMexH+bKy1s45M9LuNyuqPPmLxuaJoHWcqGhZqqiFut8dsMoGN6Unze0xOMcWX0jcMHijS6+2gfPT4E/11PdFHG1/rzbzIM583g2I3B7F4S6KZWZzEPDP1ZjKz24SzT7ImkclEXrhQvLxjwUKVvL3IFk7eJwQWzI3fkeyM36nsgHX8Er+Dwa6sBncqqo9+MO7f71BtcB23wb+tcQRoY3cww+Pw47akCt9oaBR+/zj85Zok+D/V6HX0r++EtsRjxQw+AmneGPxEfGKLIxHLQEZnvVjGqyBLMZe5zVVZagRZehocRGsM62jcAsaN5jLgdnVcWzaOkFy7iSaPU3EdE8dV1Q9xWhhMybjCPnBceQ1K85BLLc/V6/5LYW5S6laiIje5GletxeVyYCTIuEVwnlgJzy0hP6F2m2ww2Ch1ue12s5m1c7PrWNs4HaW2uJ0Qa2KY6BoHZz0rJ1qHa41n+Y48f57sHFul/IivvPrMgbM5TznuYu0Ll6xZTrXba6ve+eLIS+nzprEcv39Ea2CYX+5CKag81AQEDyHUnZLi0llgdl+qEY6K0ecR3a2EaoHMFbBAY2VicJqj4ZjkTwiIIcY+cUQMWpPrhdmPvvtbjeMifqsmXjHsuCi0u/GyaLhw4e0bh2J1w2IOr1mGPTsOtGrKZWyLqIy9P3o+2N3FFre1QXxkGqzJw/hL8wOr0CBL7orev4Lsf43zUsu47Ofa+1iNwSzo43r5Wxin8lLv+uPOJY2L1TNH67QS9cwgWrQCjRc0i+ZoPXMwXs+cyOH/X+XM349U7hPaRb4kKbycGXDjPdE4LQpUX6hup2ozSNxmGFsjaZGQ5B8vZvXPoG+0sF/dQtkGo9Gs04kqI1stZsPKsFkT4vxMby40T/FYXs+v16zupnJzlgZGPomy+Mf4vSssIwz4XGi6utpxPe0rjjPQ83ZO9wKVnrooPd9JYMvyp/Qwbhine5/6dP+5Jh7hjNMgDk/WfIObi48jW0iHNRT/HAdZxmyxD3iNyWULwHyDjf0O7wOojr9hEB9n8KUE4LJGYYN82B65g1kIYyRNDFWOK4y7O44rjMO7YZz1BAaoD9foDAmhg/ln4tzO763KwVvQ6wXWnt6spVgnyAIxa1geBTVTDdEQJFLeLjB6gc0VJjgF7ENqgslVoEGrnFcCG5LjFlnju2m3nj6Pszsou8hu/GqHmdXk48jCzTPPKvfyPlOLozXwVtQn1ExEgsYoUK3WZtdRIxL0vL4GfCG9RbaA2WFBrHMhOCjJci0ea432P1LTmMExKeHzM26Q83hOMfnk047Kpyo/fBDCKcoRItP75k3eFzm6ejX+bvakXaRgdT27qXXUp5+VdE8+y2RtcE+uxlNrovFUNn4ZSkRUl3lTExHV+FlvxvextcpLn0Z56ZOaOGwOF8Z5ua3eVx33RXTc5zVxmOhmfMFWl5LwlSyuv8RX4rZ9DFvkC9SL/4owdr7YFXi07zjOz0oz8QDynMI+isG4OBO5EMMlmsfF6vhBJg4Qh4DHfVsoU5Yko9/pBNXocmXn+AMBa3U4IHipy9awK2SirteWaIQbLbKP14fcXOgfyLAKA/aeGLag44L8ri379LjvgVWnYhX/47EH3038yjvKjbLwqPZ5z3yK9yxbcHpL7TyhKlr/ryxQcQa5zHoPsE48fr/DyD7uyOGlmVluX0XY7TNaLKxUzaIxi/EK8kSnvVhF5c0NCJh6yStyq4iTpfV7Edw/s1dhxy5tx9EXGnQkqD24eaV2hVQ+lmYuXZicyzA8nvuQiLnx3Ae3q9E4fP94vDzm87J4OfZ6GsnbOBiHnYi3cdjewF/H+Pn4eCzel/VXOSFkJ24B9lciB6Mq1XvT3TuD3z8Onz0TqhfBn+L3NcjbIMhRd0N4SewJvks6mhnqYTG400STzeY22O1ukWYETFawWkx9TFUmWmZiidBrTLtMx0wfm2Sz6byJGFixtcNpd9irwoQ4bCkGvaEqrNHoaXIBXzRFTM3amVK/xQ6/IA9IsU8scSeSw3IKS6y56s/JiNKmdd9+h1G7IGmpTGG9vPDpyC3lqbkdHt20VcT98DA8HHeWHlHKH1ZKH1kpCQGpDinXle9YYiaLZ6UCbWp4P6YcsBInhm7RO31NEfL5vAHWJ7mZ1+Jt0bIp8GrTpkZ7rt/uB+512i00y5hVEdZrjYmmQcZo06DEzW0wvr4GfXDj5kCsAIi1nJJiES83uBlWZ456MFlr7tj17MVBfTv1Ni0v+/JU3/6ndxw4tPfpPgOO4rLI3X2GDh1waHg/fHv5QIo7ayrwb+de4fexp0/jALayDhknTkSe8+RdffPNq0r/t8iSI9ue2BGXdVs4rxZFZW15Eq9aXF7BWI9XeT8IzksD1HhrWJV1LpB1t7i8elQvhhJm/SujsEHeRqIR35dq4nDZuNdgnJPL5QGqjleuR60B5e2aGMybcSVL675TY5Vq/tSpGo8/ge3NuJKlDu7buLhv8xuM1tc/h7x/JYdfHKVFzPZsAXJ/fotWYv3xvE8Fhz9QpcVAlRZ5MMHAvGb1zm0D2GDXClHYLQG2Kdjir2GTJWYVdhOAbW6RVx+20pn13YzjPQvfrkY60lrHwKowYVy20DMKk40bGB2XHwOYRIcDcVyXxn08RgddQdH/wHWpmKCD2LT+XeLtsNdzOU+UqDxxLaqDP6vR6AUpzhPPKmHWOwPGDVLHiRxTk8uLTLHYDe/PyWlakhRTYzNrmC+qs0ThxfAcXXcdZBqzDwc9rtqH78MvuB1H2tbEIRcl9/40o66hLK3RKBGTCYuiTpIsVmQwgjAD85+1UdRqRaPab7vhJ+tF7wZjHd6tapiDZyDyHqHXrz97/braJ1QZvCmykdyzCR/YHu3HfBFwpeIdKA31CzVP84KvaDNpfNjksEj+9FSH01ERJharpSKcZrVKXqfb7TTrJZBIrlgPbmuwAT7cZ4uaciycEe8owkujGV7RXiP03URvkQMHDkS7jZAlC69F+4v8uhDnqC1HlKuJfLCd8fyxREyD+Ww4tWkDfafeEx6M3yvuwEl3ljdqsls3uFdU4Q+Pw0/ENDh8u61R+P3j8JmuToLvS2kU/sE4/Li+5vCRM61R+Il70S0oCf6fNWk5/wM+yy7biVqeJNjJLgo8Dk/5Wiee5MQWJ8yGnSSRc1eErCzXAt7E5uU5Suq826L3q2mx+9XYjWyS7mdz90yaeyduC2tL5OqN9zhvshfYPH3j62PPdETRG0x+lTs+I+3meZQBrL9tdB6JbL+Fn9cO7tjmMLgwpq3QLg53Ow6o8gdlZhqNCfmTuK9sp8rKulrV7/Vyv7e2xu/RJtvUvPcLx3eIKitrk+6pa4Eqsrfefqi5iAdjuYgJ+LoofLM2kY148x11DL6qRyI1PmfSLXUCfmU813E8nIdofqSW50ca9Sr8JPrxnq0cpw5R3TMmyoMMqTE6I67Pg7xfCsepUtU9AxJxtaE6I0rGX4U9JgYb/FxjNA7GYJt0hkZhX47BJlsjCdiCztAI7ANx2EuRLqorGGydwfbXeJOlOAFbNtgSsBHGa6P9EC0oLWSC/2usNtHAWpPyqrL8eIFrIJonGWt6yDoeJnU7FPonuhxy27ZdtE9oGmqKxoRaZjtkSlOJ30zMzfK9TlteRdhhc8lpKK1vWDCD/UvsFLx4wnJDdMZo+NhoITx8HGzQgaKxzoc8QlaUHEW21msympWcjdBuTg1urbyhNhaNNxqdQ3vPWrhp6aKHl8wUSzdsWLCOdRZ9O9FslP49Muaj1/754duXeN8lWvdhVH95wANrioaFWrrsfruA8vwao9EveMH6aJbvykvLS6sK5+nz9IIlV7SI1WELFfzJOfXxEo76n1zS4BOy2GeX8E//lNXiuejHmMRTbqM1uhnqx5is7HWrbZt122rcFl9f8+Djp587efyR/cce67t58+wHcXP2WSbCic7dWre1dmq/aLNydtajKbaT0/mnmZB32UebxO3Wjeyelj6Hknu/snvpbiGXCflFi8XoAU7PznGBy2l3WYyWM1gXMoSNWOekgXpdYNU76eQUEVtpw1awvA3XXzWDJR9F3o/2g43tVf1+sLuU33lD2MRGEdgHvg6e59wmlKKz2yXBBD91e3S2qrBOJ2ioYE/sSLTzbnILOHCJA9a8opyg2hk/l32ODOC1se7LyE87cU5bfOt/UN2FffuU93Bw33a87PTb9PRjgYuRVy9fmDlVaTJJ9fdKo/TzgPRqF/Kni1aryegFtHJy3alwINwWCyNb5n9tnttY91yO1V/SbC7Gwb+gGa2qCZyNttGNUQ2jQYDrMN7Pv30oDZw0qwXpLXq3xypZJZOWfZCNyc4/rUZo0JehAeX4RyOx9sQZ/BNJ1Cbz/4+07wCPqkrfv+e26XPvnd5rZiaQRjIJIbQMvUMS6lBMUERARLog0ovUoPQSpCtFmoZiRRRZURDBsq64a1t727WsheTyP+fcOy1Bd3/P/+EJEgxzv+/cc752vu99DdT6fY/ftSN0YD4YSNrET8XfxCc27myz/87jh8mDMJeiF0/pBAY0DhCPiJvA9E4PrQQCitdgXs7ksQG4epWxFoRO8Ho9Hiur0ClCYbOjOm7mBC/HelmvmuMCMHOm1VA+tbGZfGX8+WSumMY3kCRvwoQ6RVYJK8IcxjA2MrtOgcSuU/HDbold5+n7V9zfunNeTo+OTUh2zj0pkeyMV618hNth6NHvS4lsJ4lPLDIUzIaHxrw2gjEYBMGj9hLecIQxUB6DxxCkgvA8BS1KHTpOqriSwnCOvNSvd76pQs20wXDEVtyJnK5Ac2TiozMUy6YVFGfldC79Q4TiynnLtZv4Hv2uNQMqbt7LgW3infhe00V0iHmhJbTTJnjW3B4NNIC8rToum0B7mglsOsSYRjCUMnntQHOuoR9kM/emzDhk7phgHEo3bxnUQ+gcQhlz8DwU9HExn0LQEbQgqAiVxYqZOii1Qs3DrWNAo1EKqim7VBqzAwLTyIpKMOf+QBaCzUB/YMuImz+Azo0tqE2NP356k3ihbh+Iim/v2wdWPH0JbKv7/ZmrTzwwGbw7LRPrGdmFHjHezrNeQq+HJw3uazPPoS0gxHmgDEigz65mXT6Z3tBQVtQM+BnfZv0X6OfGd8h/sI9TCgn9edmmJujP9E7U1cPOawkmfnjxzc/eefl1JPsiGLchDFID4SE6xgJ2HSqOEhTJ6hivj7eg+iPFMjBrYlwkFJw0p7xes1okzwBU+pbQdG4BUCr2AtUNv5KKMf8Yf88QGal067p1tdvXkR6R8IjXlzwcPzZsxJsHUnCl1/72yrXX0Jm7W37nGvTGlTShYUlSQ2gQUTLiRiFUKNFUUQRoxiyV04TiNyrD2qOvuynQOIasa8ymNteBy9vAo3USFw1J3AXP+J3QfgrQW3aLBaH9Mmt0JhOjYWx2rbk6rhW0gpJSQv+jNFIc3HRN7WgzxkgjPM7IiCLGmBI/6Q8ogM/o94Dtff+2nVSLv/z6q3iDKjGJr18YA8pA0NT4sGYnPWnGfdCMIt6Y28HQCnDxUMM08NYX30h2aBSUcQETh3ZoUCzPTZmVnF4fCAbtrJJiwhHW6rA6auIBK8dZAxSh0UBZNTThgwtkbIo4kohcmrCaZ6FRG/hbVjo2uj9qThJ6WlmarPlO/PrkGvELwP7tpV97Hig5OmfJVnB7jx6vvnBiC1Dct32o+Ivp6qmlZwxdPtn7et0TnRZPmX3Xextmz528FPD9nt2FriDgHkS8HwZiSCxKCqiEwHGC0UQD5AUG0NU0xdHl9L00paVoROJF00qeJ6ApohC3lpLI4KdNUHmVlaXmGqXABNXFMVBEktZr7eIOVcFo1rgEu9fotVtMdcIO5gl8T/QVlCuPQYiK/WIRA2fUq7RKpc6o0+tJi1XLC3xlXEUIgKcEgdA5CWZanFAkQ5AmrWvyVJMMSmXFxF4c8Cv8VNAYLI2WdgTUmgGV2a37DuprcoJ8u3j1x/ofG5w33FlPMnHrcmOH6hWLbxTRry/esm2+zD/G5LKo23F4rMDNqG02qzXAIzBnKpKth1ZQrwxlQRtoU4ZsIURCBh2skia9KQqydAckeaW0AojkhpJMZE296R/Skj0zHTnUNr4eHQ9XXkHsZJ1Xt85kJ7sz6VFllrJIELGUoTPHwPX+C+Z/cROdY35Wa6ZUBs5GUZyK0igRO4fG4zWrCDW06U64jaX3Lq1rM+JHCW2yGGFuqkAUWBESSERG9sLTDeOmL+3XXaQugm1g00WR6jlgmdvZrq0rPzs7Xxy6fOqY2iX0vIZS6uKNxYvX3jl1eUOL6tmzq1sUlhTjszcenr0xGDeySyxo4LVa6Ce9gQCto7JCPs5gNisr4mZeD3RmAtl7ueSUuMTJqOLjoybhQsrXTHJAmEB2wnAfPNVrzJx27bt3G3LwoILqv272lOL2HUsOmvpt3wjiGyce3dy4iLkkzru/8Njjz4nbt0ybtZ58ujEqzpfvZtE9MovuZtM42oxETSxKQNGBCibzSkGnM5kVGJ6ORkhex3nKSPG8hlDiiwmNAXoGY3PqtibQgmnswAkqN1TUky5FcWEPU7pduSKRul25gmndxLFrREddHfhsDdiWxrU2nDARvWMhI1ADSjAYCMLEUxRtoi1mYDTyJEULkgWgCRSLRKWzh1c2ExnOICfBuLMguZPNCdo1/+GzW1Z37lxUNg+Rr/FkB3LaE2I5XbR2K7ffsEGcSJ5sPNnIEumY7SaiZywLyYUlQrKZaJPZkhCLU+qq4oj31nwrsf4XqXDjA5aq84J0NHd6nyRV42YZ0z39PrtvLMwrEYofTevQjTal0Wrg7tNqFTy+ywa3vMuW+7oy3x4C4sx8b+gy++pV6Sr7449RcwOVt6bxu9pa0rCGFGolnzQVylIFZTFCm9lSpTYgwARWo+VouEwkSfB6NWMyGzigpY1GHQ9YjVrHU2q8SnA5kOG0JhGp0S2/IC8SUADEM6cHIAjQ8Egkai2l8neB889faWHjWoofPwPOdTud/2yvE6130Dfa3+hEdpk8Nn984zzq1ee7zux2eX2ZJN9geG5nw73vJ7rG/GoVaTQaDCqfw+FUOQNBr8FhUFFWPaOvjvugPTISCYh6dFNVnjGHLVlIJiAPEArRNDhoCyIVxP3YEZbyLu/om9Fvy8q95RW9Ou/p0HPjHtVKZUfTY31HvH2dOthw1/aVix6kTjaMWPcgcFJ7b+yZde+ybVjWm69Be9gSY0qWxOw8Tav0hMlk1putNhPgKAU8kwoBs5fhhCIDDjFFgCfdBmOvl86Et3xBj6LcNtNkPrzj/RsM6zZq9uih60ux4kn9APiO2sBS41J3wsxwA0tvIRK8eZ8xC3H/Zs9YyM7qBMFMsITXh2kYVRpjTVyjoSQwAppyZRDpSQSYNv5CTiYbS4pXz2dsXQI3n9mksCiaE+ypfgV9Z1YNe2lP4FYse3EwTLxSPvWxCW9Nmn+kKdcezOEYCmO2+5GvcSG5LVDuQBBKy3H6qjjHqewYiN+bBsSfkrupxAlU/qTErCIDpCyBzw/WdKse9lLNbTQOfm8B0/9gl4WPTZj6ZGluKxT+IrR+JG+ROAzz8/EwY+sSC1gYmAs59Tqdk6FcboFXq0kNrTRiHw8zMz1y8hcSEku9sJkw76HUVWooiq5cIpj03gT/opSyLl3/8dc/XJ07BdyRU/9ofU6PmQ+umdcx3Kcar2tXcE+P2G8MG1XmiJ/daBSv+6B8YYyT3R/aIIRaFjSr9BTlIATBoaLcHiep1xs4XmOACRDP2irirAX+WHn5nwmIsKbSciAoJJCXspQKU9efLNta+e0P4NOqjVHQtmXj0kfWrNoYawOKxaFMecPBSC660yVb5Xg7/W5gpl55/52/Wqh8k5zfjsdnyoPQ1TQ8r3CyrMIKIzevz8lUx516p15hdCiNypq4kVKkGOyaRfUpzsUcJGx6cS+NfnH8fX9/+OzZRDlvqkTCWLcvScKYlugm2BjT57hQ/bULyj+yrCqV2kOoiZY5Tj9qD+H1pqq4HqhdZARmZ+R/rdP5kxhiyNV4geRrbs3YMOdghKFPrlvbOhJq034uXbR93oUXn561NMXacNtwNM7F9nt4s1L5qGmD+MNdo9GY198vSMwNJLFHPEfvx3eDVqJPLAzttgaVkGk0AKOhNTa7njSR0IDBLWtSmBQ0Q2EXfiEJU0A0cZaywVVhDkaEVoCh3VQgwcJ4UVz01dmzIPjlT8/uArvEBomHcd0m8Rz5qTic6bb1XP361x2NDD1NomKEvmAMtF2z4JnKJqpiLfUcRwSzsqArMrdo6VaHDUSQD5I6KhgMh2HOFDbCLWzQ1sQNdBp2UwqmrixTWlRYQFzrVEmx35eEotODNCgnmAFmjYlW797dbf4d7cRPxZ/yThd8+7ePvh986tiRRb0P71x/2FnfWyz7RfwJ3FM5/7beYd5X1Lf922/7H9/yzJHRD90eDne8ree0ObPmhcRtF7A+B6E+AboPEYH5YA7Ux0n4AwG1iTBlt3CqQwa/PxTyVMRDFkI/WU9qKKxQRdzAp8EtJltqy5ri7aVpFAxgjXwCVgiY0xFaD+YMXrau08T+OT9f9z7iuHYcbI3v+3VcTe2CpWvM2/1vvn7tU+DqeMeAWERwt2iXv26dZd4S8frg+wd3cAworxxeNTCwfOEW5GcmwnO6G9euB+Hz8IE4lNrIvI1rLANjep1CYbAThNdgCIUtrmegVYcx9s0XYiqVrqfFQnFU4Ayw1cehJVefAeon4pwrUXqTvU5OU87h4taZSKrQVaagVOV6ywf33rZsSbu2rYu7dVqwhuvgHDSuX/tWhe3bFbVqz1iG37llxe9vdO2je0S3dS3dqDHcNbiwffvCVu3bY54LKD/iufDBuIhHPBdeo8PB6r16f8ClhSLWx10WwYJKRbq44JKZLzDvxYVoE56jzJeSSX8h8LK3b90BNGfCaOzStU1R+9Yj+jYhxIDO8zNhl6Fzj7laiRkDIF4gfDcioNhDodWSPAAkaTBCR8MRNO7Hpsg045iAcE8338F0k4gIP1+VzOBmqq1E+9keWb7eHZatrkvjAnmP8BKdYlpOaTSSHo/N53fiZTHEnRZWUxVngQEvDoc5QSQAzvNN1kZal4yUtRlByLHVyzq3bpNf3qYJTcikLdv0B0y9+kxozhXSF9pkaU1yYxZeAQCn1RqMhJ7DJMHwi4Op0fmczFg6QRSSeLDU19CquH1R944LV0mtDb9/VdmXf0TYsJxpnehtqIXxSRaMq3AV1oTwuR2ERtC4oQeogZmvnqGdlIHSW1EdX84toxfSbj6SgUlHkAhHhOZ0qaA6PuyldQ+//e0nr58dv/zh6c9TN9z3DnxswtYX/GI/8ZefvwIkok99Y/uedxB9KpSrHtqY7+m28BQOijlBEEZNJpdCoTYFTaFwFuejK+I+i8utNp0B9pg27la71UqbmdMr0cuKlqeQ9tNrnuneNBVFpwnehF9l3JCZs1eerOo+7KU5y+XWxtiWSYe2IpaVHbNO7CSnidOD44Y/NmHjU4XiJqnDcdrwFN9K25tf0+vge0S5u59Ta1mPjbVRDrOf8meFPC5WhQYN7GqKMKRqZdKETtInyQg1RUUoBSCEYkMpizgdzKxs3kuKyUgJoreIWAxmniDH/ix+dHTvjNxXwCfLFj2+78ChxUvBJ6/kzth7VPzIDCMq43Og10RN3Ye3i78+/uEX37x/BChu/7BOc494+lnxG/G55J7AHNVOIi9mYymd1WqkYPRn5qvjZkSIokqJW55OZs+k5ScGXGVQRKQLVj0g49/9/ewD6yZt6DNgeNsiRZf+oFf5/JdNvzVSdzQcef7IdjAAeHfUqndoxS7il+KRv06W+G2ZPlAOI9E25uL0eh7xEWi1JrNOzfO0Vk9pDQQLZZFLouUyerFsHzBLq4zMjhFXEmytHQF9R/mkdoP6tSsotoiHZOZWXyvoovOiy7vlZzV+kqBwBdcH9E+eSebfePa0e4x3KZU6lcUCjavPqjKZ7Mhu8HETcCn1ekIlMbW4iFTIWZ66sY0mE03JfspcLdHWpXj0HYuqQLQtLbsXhVseqxEwawtfQXJ9gZC77N5FE6u69hwdFXsNlQhcGnIRf0v2G7E3KNWcWaMWdFxxY+S3z0oyJ7hnBWJkrFChZjUamD5wJKtlKY42GDmNXlMdVwuEUBOXgasJWm9ANC8IQTCRuqfVGNO6lwSDrAuqvSToXvzoqwT454DHwSDEVCvuAqPE9uJGavSNC2Cm+Cz5M6ivWyW2Wyrm1q0FH6VxzfyJjBVYxgosowbLaE5Q0fx/yLgfLAYmRE4jfgU84lTxffJKw10gJH5LjgfdV60QzywVH1u1AoyAMlrFIfQ0uI4uGGFmGwTWBRibSsW4SIFxe3Tm6rjOwDqhtWRZymBgoJlAd0NpokUzyp4JE6SSJKIJMwbYzgdJmoBwDgCrwU8Nv1HviwqgBro14o1HV15+qMOe8qeXHb/yxW+9yWfAd3W7Rasg/uu3x8WfN/Ras6TP2oVfXn75FfTeu0N5YUxDOIjesQgt2M2ESa3R2ExmgXG6HCYTqImbTGqLBSZwFkqvgKZdbUAOJf0ug2iWJwUDdBo6qA8aIyKETJEfUOW9vxNvvHJ66XMddg8Sv38FBsXvgAgAopJ6v+E38BOZ/8Gll95euqrPqX0w+yT/DQqc4NvddSJysAugr+uOuaLg2iqMwEpZtDodYbEaGYfTAs08adHCX7zNBiriNo5XV8R5V9PCcrQZI6gfJC8PpICRQBQqUFxa39gbrKjac2bPCiBknbA2/O29m8Q/z4qLqPHUEXHeQ8/t2Pdcg/aZ54mbf70CNHYw4bh0ljbDNR0H5cyGUWFuUGET9E6jNZsgrE7BpGBbtLTiNkCDzQY3arYt20aZqTAa6uHQwqbuajL3Z+oKhMU7oKQ4iaAtUyghColkNO8rpcdliz9eW/nX8YM3Hjw89aVzYExjLTVGnP7EqQErj68YXbx6OTB0vnP7ob4rRg6Y1D+nZWXb3h1WgZar7xOf1626r2piz5xAfqdWvaouYp3mwLNUCe2rH/N0+Sg35VCpoRux291uNU/BtM1P+GEmQhAuncteE3cZVKj7siauo5viyjY9dshlJU5eU6BsBcyq9KQCHUOorn8OOX7F8kVT1+jOmL596d2vJ2wUP/5p3jAr+VXDoOiLZ8VS8uf7FkycNHeKcPCVZ48sn7707IzJbdfNmPflBqzDLOirusG97iR6xMIK1iagYQzByDIutw36K5uNMllx57uJomBEkz6TkdERnna9aKLTOTvQRXKwBJeXi2i6m/ifr87+GngyuHHK+r1H91w/RU1pbOz6JQDghb/dePGwed6Mw5vWPQxerasTr36J5NsF5fPDfeNA8lnMGpSYqmjWDE+iBpowjcYAE4yKuMVisKhZBYutXHmqJ78Z3y2GS0mIZJaAx5M8etTEh3a+/BY1UnT0fvuLT66++FnoqGHLeKABw8eNActXrxaPPHb0xd2HtKOn4LVbCGUrZD6BmT+6eeThic3yWdVqH0+1zCECwUBl3KqLhIOcDu5sQdAlkXfOQ9+asY0TkkncJ1RT1hMyki9x/gilCMr6UmDw4B1L+rf85P2/fxfa6Xx0/dLlkb7T+syZX755y5M/U6dHD+yaawq36317bOdjS9d4h1YOqCksz/UZPQMXVk9bDEb0F4cuTtUu6AqY+zuI8pjOqmYYlidYwumirZJLpmlWh6Yo1TpewbGoFFQevcUFvcxywKCM32KOpuH+Cx1JunOt+Ffxk5MH1fSIz1+6/PTCObUPXf7wHnLaXvH7d8aJ7zCfjO998aevju279G7jj/2OvIftBamFAr6A5ztNp2WKMGhjLydw3BFOP6mtZy79XizxsEwlCGq4PA/qjekoglYQiDkd+gdUeb1clIba7ZcNB5i6/5H96CPwxwBiEXxOb1wTh/GmktZqBYCvWvB1Ck1oOJ6rjit5Av4idagIInEBNaECSjQmGyUuARkCWLrKXgRWHwW14lT0dVScDlaL02kWXBDbbhUvbRVrwK6toBjXc0moM3mR6WpgUVcV/IK5BP0Ou4ZQ4Y6PMDE7FrPrTWqVkqJYEgC/P+RlWNaXleV2e9V6OpKd5ffbOFt1PMBR3lDIrofOyqM3MEAFVo9QUbVxFUOU5yS6/LAGyT9k7suokD6mj9GqrNHSqFkRpHgSd4lYDIpEvwjwJ7jryPfGbSI3jDv86M8XL+6/f++5+GP3zqFtd0wj32t8HTwgXgZfivPBQna2ac4c01uNGnGveITptkT8ugGQv9z4EWjFYbW0s27ljY+IpP4vMVuT+s+IdUrX3+fL8kD9vcFgKOTB+ruzauJ+H/zi0CpwFFoAd8YCCGkLkKgZ5/x/6G5M0vaRp2Xdr2XqfgDUiK+AT8XtYCWzVFL85i0UX0LlrFrS8PYqpHfRzc/oy5hr2UvkECXE6lg/Hx/22Gz2hOoFBXlQ8/yi4qI8O8+0Li0qaFVQEW/F5UVzoxXxXLPbbAOGFhVxs4FHcz5qneWP1yCafvmZ3msvpJGapIoaqeUAcgk4HeMmXEJlQNwkV+c1eXXEEb7+3e6f+l2Pvl6S3MVsUTW07dq5TZtOnTuA15IrtUBeqRuvDS0HZmAnW7cbvBisvWF8Is82Bjzy8V/++vFbf/lLI5lcNJKIQ7t8H/RpDGba81KEhufNDEHDoEhZHTca9ToYslGAIqhUE0qybJNIxqL49JZKWW5QHlKPxPeANve17zGi31kwesf+e6uYbjeG1h2NLFuP5tO7v/uXbDSHFYd2dRbmnzHDuKxfzG7kLRqNnSB0ZoaHYZnVMnCElRAoSomsLBenXDw0MLxBr6uI67m0G4z0BDGdxDqNwxrIhCVRMz3r8tO3jxwyfOZc8U1w5cZHe0AdyD3pevaq5WHD0pnUy7U3LmBp0bi6NC9GQDnLsJxGwk0MjrXgNRojYbLbGYLyelzOirgLmGxWGxoTE/iBIwRCkhDL/QQUO1PUpr1Gt5QXcW4DDJWBFpUuQzIPHgFl/hw8c/JkY/uXGy+8+SaYkSb2tRdeuLGotpY+XkukvVsBY/hHVCTLKlCt2uH1Ym69oNsFzzllsFbHYfYDlJTCoMYeAFF3NHnJSecVooIw/UfeC0TDJMrBrUmZpVcPPv+NpdU7dgDAUvpdz7Upyi+u7LIZlD0MqJFe8aUysYzp2vCwA3QaAF7+/Vmzbrdx9Rq8Ja68Ia012hP34btfP+5HLEhKHnC7QwYDb1XQ4UgwMHBEkPF5K+I+DgmP2y1dagJdb8jiN9Ei+l8UyVj/oLz+GcqAr6V9M2P+B2DByZO3VMiNX0eKE50iBsr6oL3TkhgVywu4XG5TS7yDiJaMm87JDYTDcOuEeR9nckv7B/zp/omW39LkNNlDCR0yeccTfOP0fQllXgV3w/20o7RTjxG7Eeu4f/Kweye5MvT4/Sfy9IrF9XXSfO2x6jH1FxsLmnMiqPoApzzFijkRBOt/wZhb/gvGNyrE+EZ/q4+WcdSf4Y6kPl/C3uHMGvbWuCPK36TPp/DMhgbPbHxfrzPS5J9hp6fJj7HT7d7/MrO7PB1r0+n/MzzuNNkxvrbZqRD+dL5oeSbuojtov8V8kSIn8fnK38mx8H84YxxFopEZ+DuwmqVnSCMn6c9hJ0jP4cPEBEDwClUFDCVtt/zcG2mf65U+1+38w8+9lPm5xExi0R98bgMmBpQ+N4A/l7CZ/tfPRavzB5/b2Fxeu/d/lrfLzQ3y52IsLtQnQDpS80n4OVmZ601TpJkJw98Jo8wZkvEcCWO6Qtrz6DnffQt3Q8XNbwmR6BwT6LYxh6tn25jJBH/jDT3bouEwQaeH32m0PdtiCGv42WkA1vLHCwgfVZ6bbCqbiGXDs94C5g4xmZtxhzSRi9xGYLng/xSJjjGBKkFylSC5SpBcJUguDspVguQqkZC1kVQJ6G/00ekyYa4RPL+3XJ7fOyDP2qOzdcpmp/QZ+xljazNV8OcPoP2PJYE/TXWED4JJlyE7NSOE8cMuM8MJHzEh1sakcnpdNhvB6b0qPa2i/QHK4XTUxAmn1wPjWS/QUk4vx3mdFAsTleq4lmYt1XHWeAuSuvRBToSfIFUX0rqHzIn+QZ8x2TJYimH6cNfgggXJvkEwfJrcMLh2vngVFMCvD8CpRceSbYPiSbldsM/ti+7eJd2RjxWH0cPpPjBqLybujrXyeb35ykiIgzvYorSUtPb5XIQrAIMNJ8kUMhXxwkLCwGlyoKfQ8PYwET4D7E/GMftWUVqoKhNf3aLPI0moFkXUK2nYi8WtS6PQY0CFJfZkHNyV+kFxqme/IxhL3iRH//uls69emHIgj1TCl925j+vqud1/zTpZ8NT4WdZGLXmz58KKZXNnr66c3wMwfyFuAhYAoBg/2rNB0fpQw6Oj9j86e5pn0fDx5J4Zx0Y+e/7iU6OOpeHaHUjgw6XZToxr5w7+F+y55Z+k+ZUfoV9JIbol54hew5+fL3++TbK2Ek/LkXrOzGjSMHZwjxx7gNDAta2ItVADoJGggFQaWgODZU7HrR6hE2rjOpJUALVCTTMIPQo3gZ2Xb1bKM7kvU+wXaehAZDAiJwqZMEHi3H3iuC/I6+NxwxzTreELqVWO2f+9aeVKk+TLxMG4jwn7Mp4l67JknwX/vhees6+S/j5CpH4+gYXBR6T5WjTDGSBujYiR+Cx8RtFnhdEZRf8i7w9QMfBzisUh9EPsAT4MZrultUb/Q/kk8DDhBCb5KhgjVTH10AoNFBIz+/An3AL6CQnviTqRwHtKw1oxIGQYk0PBp2GVSvlvN5gHGmD+2zcWcVlgImFWExxNE2YH7XE7rFJDnI2hzE4nh/hkTLjb8o+y+7Q5pz9J4x/6s/SdPP7neXtTuQfHcjlaTTgsJqfZbjcRNO322C1WS03caqUZJD1DmRwOLLwxQ/jmhfVoelPXn+TiD/1hDn5L6ZN5JJXMvVHvWQ4xJta6ZVZ2i1DQZdLrOQvLcsFsOi83OxQOwSiXC7YIwCQ7YDaa9UDplSZI7M0mSG6RWwvpMIKh/0MeDa7+L+nzA/9j2py0T9uT9qkXOCXvSBhxgKlOz5/bJ2JmZ+nElMATU1lYnGadpBmIWXAfWFFXnAnm44ROB92hoLLZTZzUWyRYDJRg0FA1cU3yqly+iE6wq8I1ki4lU+3Wfp8d+LGl8QtR8q32PXrEton/EK+LV/buBYV7wcy1U6fVkssbR4jrwQTgaVzNdGt8lWyNeVng+RwP/a0eZuntYm6LimFYjmAJh5O1xCx0ddxiQJ5VpaXRcFKiSuSw8Zeb1T4JbOzwJBhqgESDu1RrwkCPf1nc+fHZM6B9/YQ3P3pJ/CleWwm2A+Nm6q6/iuPEF4eLv7Df7Rs2+rffwNDRh+5oONEeWMGYFG5TXQK3SdWTeFGy5UZsy7fV80Y2HR/kgjSLjLCYjBg7/QVsa+zY1uAaIp5DJ3ioK6ok7Y3FXG631+EgNKzFTBkUYY1GZWCsNkqgfXBxBIOgpCmFklLm5Xpdq+NePcNa2Oq41WJoURsXVKTBgEInk0rb02KwGGi9Plgb17+vVFD42Eaj6RM2cnOuzMKak8kfE5U6iFN/SGOPRM3EiE1NplikggpWAf8iTGH8Nms6t+ywoeC1F1c2Xl5xHlwdtfSeexd/btCHzKvBUw92noSw3YZ0alPapUtpm070M3eV3fgUdBGfo61ld8cn3St+2GJygXgCDDgMriDot69C+fmhcH4+rjtK8eRBIo9oS8SIvsS1WLxDx46xdlSoHZXdieiRHQgS2UGKbWNzCkVFrI3t198ZrYxzAW+gIEBZqEAMrlAgEApRlLd3LKdrbTwnZvf3zGm303nMCbOrmJPUEL0n9yYFqjdirFXperZD/xXs+L8xi4br6ezdrl1vJ5XfQZVvzq+IC3ozsinSchbAFSvAZCow0Ltt1Ci4vNIWxQuMp2wy5loTgxfRxJLjqVsFbQep5pdEB0ca2YpMuQ7fAUgQrcB1NzZ/Df2jJYBs2c7h79pjzAiW7XRi0SO7wIVvJkyfOU79bNYvha3QqxEfqdlQ9fzMB7rFx6JXMyr5ar4oHu5qL34o5ldUKibz4yfPnvD4JszAsnjaoGHClwWuYUXwhd0oGbmtCvGv3FFVNYa5w/Scu/5fyXeWjNEPJmJ0mK39nIatA5h6i51KPztSjF6fiNETPAJUBxijD+8QM0TSfhZzc+HP3iZ/9hgJ24AKwpTkzmC4Sf6LORvwZz8tffYY6bOz4GePyYqoiWbcjXVJ/Pk3SBfxE2E/RZE48z1z83S9xZie8cB/U41rDweSWPRvgA8xkgZFtpNSmVH1bUqk+kMTjP6jyedcg3mVxJVmx/UB4Zb1jaeTz7hGVmJbhB4Bn3C5vl00VeFI4kPXJfGh3yCzsB4kwnhH6B57600C0GTINA1jRB+QMaKRHj/JeoQlPdbWB306U8a/kZ5zNPmca+T9EpeYFdvIX+utHNA0w6F+OvmMazifRHqHUaUj7NGZMvSeius0dUnM1TfAj5l61EI9pFpNUqaFuFZzQMaIRbqTMrKJWUI2WVFv4GjyFtyHR5PPSb4PrAhh5W5ZD3o6+Yxr5GTJN5hxVeU/9WYdTTbDWatL4qy9QerlfeWX9tXB+kzUNPl99MJ6VDV5H8HE+/C5m/wb6TlHk89J7Ss/2ld++y3rTk8nn5F6H0H0PoLOJj8vYWbVJTGz3iBbZeqxHurB6DL1wLhZBxJ4XEk9SBg04PcxBf4bjbnZvtqK9SiR5ZoocRv6MTbXlXq/nWmOzfV08hnXyCVy3ORHqIl+u/T5TTB06pI4NolzTgK3tK9O1zusikxejbm4jnYgiTfzBhBlPUKSHuvrA167NuPfSM85mnxOal+50b5ym29Zq3s6+QzpfcB9FZKrdSG3XZuB1VWWjtVFfk5OkjBw+MLWmVhdZelYXamfY3NapWN19YU/l8LTSvs5RiswaXynz4tlaXha6c91eAEn/xzqbYB5XSGM7wLE0Fie2aLyadwakoO7lnCTFjqYhablfCqVWQN/kXaSqo6TdruhOm6n05uQUQiDQpKMe4NEExoPSrIIRHfHMiW5GdTtqPMEAYfQhQ1rwVBwW8vQcZjzjgVdV82ftqPj1sG/HFjy8j3tuscqwLjG78Sbj44GRS/3WpL94MNHJn33yL1TB00c8NDiEQfGj1jTs/0RqMs+mG/ydH8iTFTHzA5nlsav19NKwuT3E7STjmTrOaknOUujcejhL9pDMxKmAe3xWCviHv5/1SlkYmlZmQhLK0pQJ3kTonaoFX9GXCiKoCPomZdzl/jmtk/eX9x1zqypy0IHi9977tLbsbLSzp9sbHy59fZ+P+4o72svvs25oajytum9xk4cPNJf++DRwxW1JQWziTSM0gMJLPrm9fC0qkUKi/5ZPMtUGculjUaT3WYxO1xujVrtdthMjNfnsllsq0dYHLVxC6NB45IVcZpQwEU4LyVjybpFWgqWAIC+BTw6SJYwMlHowS9yCYPpKkoo6QXkaYySvoZ5SqpiAJxndID70EAUxKxapRLmwiqD0aSFb7AmrqfVFKHCIxXlTUopqM1WWno8SiE1vlPLpy4c/ESb+icO/+2ZQ+JQps8ja+/qd+NTpvvmw9c++/0kyrmz4F55Fc+8FhDtiAmxsizWHWhtMLTUBVpZrQEfS7fvEGjtppyUs6wi7nW6OGCKVsQNJhOlUuUh+j6eimSmrlL2XYaTsgtJzij5ni81h9yM6sTaWh6oQKCQKIzMpD2RtJPmfFflLRl3YseexycsySHJerJT+wWre87p/dSAnoMnzZ4oVsXvmTN+3P33jKD6l7UNd/T16FBcfvTuocAEbMAFHMNvnw3O3TDutD5438ApHZ/rev+MgzXvgcmfv3D1479deKlhQKtOblPFbWXS/kF3iNOYTUQE+qk7YsX5vIc1UVYqKyvitNJ8tppXR4tZkynH78+piTuc8Mvv8BM6IlITh1lrYU1cZ2x6mCRojeTgqCHVPoneomQLzOg/iBccTeuXSPyY5sRYBjptKegkH3n/9V9r5z28W/zqP43i94eWrFj46fsrFu+vXffIwytBpzO760498RioYjYxL+954ISVtpxZc+69d8+tetZEh+aOXrmZXkQPHBS/bf7sifOZhuUPrN6yaOEaSXcUy/VjrkHdi4nusVCONeRRU4WCQOlYp8eqKGmtc8BoKrsyThAKv8mUj1ioZGWLyqSGqrKmzYKS9KWZWobTtLRKlJ+JJKGkOB+QY+eurOzVa9Wc+ZMXbRFvfvGZuGXRvQvmrOrVq3LF3FWPbt+8eVuvVdSE5XMr5wWndD06ef5RH+29uPbtz79466G/wD8eXTD5aNcpwXmV8x5c/NiKHbv31A1d1R/17N4EdC2emYYZPUsRnFoNGIIxmQnWCNNXrbFZg+n5ZjSUha1K5RoLbreL4N3q70UVoZbchtfJgUs2CtsNPfo1fLmWdtStuvHx4nn9+gXQML3kd9bf1NDldNtbywCPl9GMZKiIU9z/VYb15EHUcts4BFxcv8y43dSjX+OiFVR41YqG9yZP6zEkUBgpb5+OOzc2GeMnuUjQ1Qmp4W4d419K3mFukyL8KI7wP6kvjDa5w9wjdk1xyvAIf3OmdL8E/z7JIcPLuJyJ2BDf5RQ1u2dyS/dMzgTab/o9E44R8b1eVeI+S0jc67U/RfvRdY4fJcoqo7GnH13p4O8MOn1PP4WYL+l0Vr/UFVPJLWS6mbpfwld3RCD/lvjDvXDshuVBeI+yPL0Jb8xIRWMqVc+ozCaY4B6ULpHSYuSxyRg59V5Q7qWx3jpGvpS8m91GpPET2Z3N8ZTT9Em7L8MJJOFy/4E+yfUlcVYrr2/RCcqdWFo3Wlr8HQ+X1i0pmBQgcUtWkoYZOCGBGSh/WgJHj9Bk8CMnMQmrEpiEiTsyDEoIrJm8ee+IQ6j/4D4KN9EpFtAKNoLQCwZWYD1ehN0EeJuWpii1ANTOirhO7ZLna/HAek4zInUhzT8h9yRkuKS7u7aTndCOSfNvB/uSnoe59Ps0m+Rqnp/x5BDm199WJD0MSSyH/vcyjNUiRBT5F16hUObbbMFIttsdUVLFJfkRG+XI8gf9Sn9hRdzv4qHjhXaWd+RUxh0OpYZTmiUI1oyuGuiA+QtCut9N62jNxD2XmyGa6Makq7YuNnjInTLgONlqXnzFnK7t5q6UdZ09EexK6koerZt9dE8Kg3zqiJOvNE6yLZ0taX+wZn7KuZLEwptfU68ygwi7hHbjs8BXqdNwDivDMeGIXTAIFXHSDYMLzqehSVJlMRk4rUUVrIirEtgbF6LSy8q0iUm816ZvLAn2akzXz9G18/wVUJ3nK5E6CeDXH6FWbX1d2xeXg7eS7+9gDdlFHrLriFQZNLxMurvoDs/GMhxH5cGMZFSsVZbSF422gDE3R5It8p1OqoWSblMmgMIcdF1pM+k1fEmEgaGTz0My+MYyHZcg2gxTJK3HxR8uybirRMGTIiqzOUo4dAocOqHJQRa/SnRL0BpaKqp039LpS+f0ujNAkrtIMnBnrznw+z1lFCN26dRj984eXcgfOvfcubt756Lb9gEKtEABU+eqKWC3WD2lqrP4mfhP8R1R3HdbEel59wp4Eux8669vvyOOFvtdltcBns9lGP++JdzRQ2K5AXsByfMRr0fIUSoFO9zSfi6vhasFTDMY0sUXhqyhirhRp7ZaBNefr0HqshZIjcOYuzIcCVrhbi5FdUgJS8AaLS5Nqg/4hPKHGKpsz6L7YCo62oeV940ecJOYuXhfKVT+tU69du5eTv6wfPfOnp3ptlB58XvxauM/uvefLPYAT03u14MMgAIgQMUb3712BewET4oDwAmxnzj6EsadvHlzNX0Jvn8dzDSsxORYO61Kp1QaLJyeIymKN1sBTCkMBpbQ6HR2iqZZ1gZIPYmK5Cotb6YVej1rUCsomkDE7tEL0s6GsaGMpg5SrVsGKWhMVGclfhXKD4KlQRC1GqMqMgpF5YBV4afVK8V7xPo9/foC8W/Dft8jPgLuaKjPB4ZSv7bbRweIm2CeqJ/OdPsezGz8tqEHaQR1e8ZE3jrcgM9ni5v30Ycxz1QWcU+sg9MFfYLPS9CkVqMxK5RKk9nMOUg6FGZVPr2XIxxK2mUjEI6FyWSzCdVxm5EOwDhKq6BpNPOaslGo04A/b7A2wadC4CD4zqY0jOH+SqMUGiiTeGSl2ZKIIggkQlny2wdI247J0/YcaRs8oNOLpkEbZRzAFxct2QOECHi/712H9585CdqTJ3o9I37ae2SnkKvh/RoMBXjHu1TR03MoTTkGACQxn85QPJsfIibGOrrcbp1Wa1FzCj/v9BFKUqlSWUhLOKJQ+zkfTziVjNtOmGvMJEeZzXa7oSJutzDQMul0Sob/Y2WRgSpIFNaxqqGwtGmNt9CVSujKguFb/vVhr/ZP1F5c6HtKExCfL62sWcidMn/4+PRhL9cCVR5oFchduyD+ECgBAvDyoFbsMOSAvmt+Y35w3ERt3dMhsTv12vE7yUPq53HceUeSrwXGnYivRUVoCa2eU+OIVwFD3qYsLQVp0FcG+T1h+Oxk6/q3K1eeBevFe+DhGllH9mt8sk6M1aXtIx4jyEQYllWpKK1Ox/MCScJHmcxGAs9nCgDuFEqvVVMsIoQ6jw6BFY8/NIMhSsx1oTnDIEDdoqVRRdTMlAap38RLz4vn94B/iN2oCQP3DMwWu61bRx8UVY39wZzGBkpHhuoefLDu++/ROhyD/tdD94G57+2xiM0aDefleghCl8uErWz7DtHSgIemWrRoBZ1QHjBQeXkteF4lwanyFOL2tNkkXFD8vqWh5ajUR5OR9wpJzNJAxIpnNaRXXADCkbT5lwKQT0pXJ0loNjzlQXs+f8Pf/SVnNyfMxWva3NVm27w1vbr045aWLZ2xYv6w2xduX9z7zVeffNO1h1s86f7prW7bvHZer2yQs/VR9TW3zeWf0q7ltv1Vg0Zbhw7rMGhQrMIRyO43qWLD9nmrTD379e6T375lKKtD79FwPQ7B9ZgK8xE30SVmJqx2t8btsNIer9vhdFTEnZwe9yFr4nqrDdo51O0r5yWJge20Qgnc3EUe4AVIO0ndfGiY8kFO4l56esfKzl0PuYt8xe2RUoX9u7XdFerav47c2LiearPKXFBxMejqOqVdoadNj3O5vlVU1qoVUMYo3rubCAtRGnNZEFYnoaWsNspcA1M1jtBoOE5ZE+cIPGiXwD4oSG/Y9gswbxYS91VZUR8hmEiFAJ4r7gMGHalfctBxMguo3gQMMN18n7TpwYILT82Y6d5/SvxZvPGV+IVSXIKw6qEcNPR1JqJNzG0iaJ4n1BTCi6qMA6Aj0ACXAloEXoZtvrUgcn0jrWImkJa1e++Zf9b1lOOvey9f37sZHH9oztKF5/Wbjlx7ae2rYfEC9LP+5Cy/hwgTc2M9OW2W1elU0l6tgSC0NpqOZDtYBVsTtyq4LEuWpTo+PwsQWb6sVllURda/skhOgQCHshRZtEoVRDiLtDMdATnFhzRqyhS5YnGLToQUEDLGk0pHQMa4z/6mKMjZCxeCuiQAcgO4HfokNUZB/uAjCQUZ9FxKzUrhHx9aeiwJgEwSGhhnvQj1RvW8HrGgg+c1nN1opEycyetzUJihQCDgwhuhcmYERiLPeiMDFk2akszRBNTWhgfphRLZnglRgOAW/Oj80R2WLv1nww9/X7z4LFn0vOjdvajx9eIZ5LdbJ4g///gloB7YSg5rPEAOu9F531uDb1+/sQvKU9Tw/byIsS764bhoz00fzIEvYW5JJ7E2NgR6SJq1mB12iiUVhMDrtCpWifAYaOhZjbTR5dZaGWt1nHea4HvReU0FJpKDv5Wbqk3zTcdMH5gUXuhnaZWCoQQbbauOkxJg2gUpbMLxA+KXyeBmSKOZkbjb5W2ogMGDIJnQIBVFU/Nm4EdTScYgeGf02tH7ya/a1rb13n7qffGjC2Tvhpug6JRoa3Hh+w8/ZLpBYyoO3yZG6ygKPHrjR3CZoInZ4jB6BI4dgjC3ySG2xob5srIES8AfCXOs3qoFRE5LO2vT6RCqqsJqs2W7XAqBys2zgkDLMKAptwmF/nDDVsRztJzabjH5fGoTr3eqYQKUop9Ry/Qz8lR6gQG1LZbJSuPGxvJm7e8ZugMqw+Ma0/yxYMYUNMYwdMPGEHT+5KP7S8ru2u54JPfrvSP7nl3719d++7p6wKnaK0+LoWV1DOBXFotbBi0EM/SlY8Av4lpjvF/eA0ss4hDw8YPgDqABXjvYLLZaIdbZwLVjW+HGE/OfGgf8Kx/u/4FUD0I8gDUYv7xnLEsD9eUJWk3bHZTBiJELjAqrFZ5lK6XQV8c1GkXahGUm6ltZBuZb+pigUCJDpVLvLVt27fnDl4LPGKaOvCr+BhTiRfAz+e2WE1c/f+IF74yFwH5yC3i2LhEfdcd4uC6iIpZlh4K5kGRuj8M+MO4ASL6KhHzQLXAKHW7cV7gykMGiaTSSabwcCSjPcNr0R2IChOoKSFFM8iiKy8D94niyzyuvkOOXikSCSRE0LgVd8MABSUwRhzI2Zjg8aQGEB2VTunUkaeGVfDBLT2l88DRpaIx6yDDwaFEYEi7lvTNBLKQV9AklKdjM0mgC/AMDVEukTPRD4m9j94ri9zD8UpwYv9TbpjRa0LZh5OHjW4cPOHZ4vzgU+N6qBpNBP1AJakb2+71zZRf9Hj1dhcCpZ1MdF8hx6BK4zu9Dn+IjclHNIqL0630+p1lpzst326ribpfAq7NQsYJnWlbEAZPZMZbTRPBQaQadttzUmg5dkt6PcQdNtn5k/usvgNo5u1qTSvqIok1puFVR7wcWrty8YtbsZVtXFi68ewSwAAvZeuidnvVMu28aJlZ20e7RblxPHn7z0qUPPjn/HmLRRXei2DehiaaIhaKUNA8IQTDodPBgO5w8ySIYZ4tCAX2PGWP8yliPabukyXCHjH6XpJKRfCWgElhRz4nrvju7Zw/4+MufntkBHvo1gRVFljeeI8s3kZPP1W+85Gg8TF1OYkUdQnexcK1d8KzZWJeZUan0arXL7TE7HGRV3MEroTuRLsYYnU5t4NTmNLobW3mTogN2hTikkKY4gwiuJhyJwoXvSEKLQpsnj1l0xgemiIvqH3jAaT+crWSKapZUjxtLbTLuX71OdIDP1nXr+/odKydPHl8iSDV4jdwTKUCPNy4W5Yy83qQzGASdRsmqtVqWJygGCAIDg2qzRUEbTBSMpGviesKgVrO8lmIxsSqUuSzh/VKoHbipKvlfzGpQJoHZIg8ANaD8JdFI1Ar9Aij106qnxS+/ePZL8ZszOy9vBWe2Xm48u0i8QfdeJz6EMDzA5HU3btxo3CFh24XgPj4M40gn3MlTYWTttbqsJrPBIsAsn3LStMfucjiA0+lSW2h/QKBdXspoMkqTxNDGmExKh4VT6iriSlfKgWfqIG0OKLAMKIn/KE/CI5tHIUR1yaCUAzQSTUWNfiNUxeg3UL898f2NLtPXxHsXhfMHrGplEG/+8MTGF1aD08ueb/ykxUzx7Dby03WNR44cHKh5kJ25sJDsuQ4MFg+DwQ0LJoEccRXSsRDa6jK4fwJEATEklpetNBq9dkcexzm8VKvCbENl3J5tz3YxLmgQXRYtzA6VWi3DEJVxJonPFW0GMJ0BImsMKEpwOiDX6XhGkYY1hs8vE9ADNyjtCBOH8MSMXiqxrdxLlS8++MrFlmQ40UlFvZbsmBL3JjqmxPefOQGuVVSyaQ1TKSx0J91b5khwe1kNATNeFsF0mWGo7ZIaWAPNG1gzweNDtzJF1mA4ko5UR40u2TH3tefAgwu3FUITdIxVHIE54fINy2bPWrp+1am77wQ2ZH7i1d4lbPTzxucHPNR7Ipj+1l8ufXD99fcSfBh0BcwNAigqNzAwkbfCLDeYZYb5i8HMc/AUU74/pHO4BZtDcUQaVP8jLgf2cfUfMzmQ4zePKJudTn6R4uxAvZUIaZhwMuGw1gcT8Nw8D9wlTg/Pm6vimHiixf+ZryMdIetPOSg2rOs8oG238m5/xkPxcu024VFz355TMgk8ALEK6tAJ7n0r4qIQDAYF3BQsYbMrBBjEWSz6iriFp1RpKJt/xEVByNMVyXQM2kof3Un89ceTX7heCP4dlK57BNMfPPDqHPAFGRH/Jb59dKP+PDh0/eUJ92hve2S4jP35GN0NyoPWdEAs16IWeD7L7W5hI5VqNjfPGYapegslSTsFJ0oPjDgvQ9sAwThfyJBQqv2nz9EiQFhUPw6XIA4HGePIbEItvD4EQV2EcESQ8B5Arj41V+1oM6dnqBqQP538yvtC4NNH1rnjn84HMIe/bWHXh4Y/NcR7n2mAPjQ6Pr1o5XeIzeHwFv35l69vrBo+4dOH65Zld825u3qUNyKdPWhH34V7xQmj6C6xgEsbMNA0YdFasluYgD6EOjx5lRfqobKQ9qo4mbCWfxjKQLdvB8FMJgI5oEm/bqffLer9iyKdiqAeBQMNExM8BOIdWpANCtLZCPb+dg5GA5Q5SUUg2Q4GMO/BbK0lisWQ7QiFDDbWlpPrNONdrlRm/4EBkQKypiFNhuglqEwooV7+NyoF4OzUvW272X/MprACZHMHzBsa2jVlVEB6yLNw0As7EYKHXqezEXaTSUEoXG4bURHX2/Q2Na0WKuLQoZkr4jT/X7kDJDoFIYOWVqa8XPr7t5//KH6z/8vcRxzb71qzS/zowa1ashezCfxiA3YQhif0B/Fb8fqSB/L6xV8/Ba4d3LntaBM5HUhOVqGwGwmbTWfUOV0me0XcxJpYXs1DCXkLSqTU/1VOkNbRI0lLCiUADUMZqBW7V8vZ0Dfib19//QO4DrOgxjMussup13HqI74nfif+LH4EPMBvE/OPbRXPSOtZcPMbhsH3BC2I8TFouhQBH5Gd7dRptSanz9kyxyKgYMAXD9hbENAI+rXwoLIsYaE8ag/c9p5m0ksjbDILaTSnKQ6dpAsuqklIl8ZSq1SYwnkHdK1kEIb5UnGuJEK+5ZhXPXKh5ZGc17eC4RVTLZrscIsOrYf06TeRo//5rtjntG7O7NnLKfLNhdOGDshbsEDc51jYtUv26nYb7s8uEf8jfkiW2+49c/ji0wPwveUxyV4aWGos/n4l/D6Ev/8cx6IlN79lFHA9ojBasjqcTgUb8PvNBS21BFFQKLBMcUluGC1IVrxQwPyHBX6/w6PIFRwOIVdBUx6PDTVuNTW50qJgPhqpMSenyURMqi4pz7hhFJ6SaGZZylqaKFriH0SGjrrjrRdOv8mfML09cfrk6TXDR00ef9sR75PmV/esfDqwwsUVFIU6BNrNGzxigcNfP3sB8K/df+CI/oPbRg2tWTOyf9WoS/yWg3eOtME1swrri2dPXlRqWom43G9+S/fDGM4R1HNCWHiXwu93eTQWJruFR4uxz7XakD1EI9RTO7Tjdr4pNQhR1gRkKAUvlFSMVWBTbjYpJNinoI8AXTrXLpq1etJMpMyCu4/ueg6QP7769fVZCya9tlD88SZBhjecq5kWrxoEFaiovnodqEFk18rj5abZU2/bMhBYpT7CSTAmbAtjpeIYQngkLDoLzN4xMoIabelTcTVrNSOgy/Lo+Sb3ltC6ScV0OV0vQYKjFnp/CTm/HrDi72n0bqK5lnq8YVCtPcXypq7FZ2utOIyhoc1FM5TDY/k0ReXxEatK5QnxoZLWTn9V3GlU6wphcE0X0oUwZ4eZpMXIEwpogJ1JaMQ0HC1bGjtTmitJFRQyriMTpHTSRTOfiD4kXci7DlxynRGmjPyVHPvvC6fPX5ryWB65bq0vXFpUFuv05KbFK+6PThw9eGF3cdjKhfY+laDdi1cBBW20E2jGjwaFD2+mNI8a+ne/8YDYhrpy7u9nP9h8rKL6dGrGiO5jYNGMkczplI3zO2gJzS4Fyen1Dhj6uD2Yv4EjOEYj4Vcz8O0wlj+whNIlWxEqUwj4krHYkFGhR66zJEjOBscGfDBHpGZ8tv7gP9xPcTMmbtq6bf+aCb+RbvG2br1JzwlAPvz4Zv3wCR+89db5LtclO1gI/ft2jMmH/EoWCSx6lqAMSpphlBTclyzqw6BMlAZooPXWuGgMkSoLmYmwnUABl8gxZLAqBHNmLY7I0R/4j9juMhgDJr0mtpo/9+4Jc62hX/r2iWSFIpuofY0s+XvDqH/MuGfBgnuyh498d+DylZX5xVFJTsXNL+gLdCcYo7Yh+sdMWbbiYtpPOHlnLlXWVuU3ZRdkS8mbQBfn5Hh0BZxHg6x0WvImFeUAzHmk4ps00QMFLs4HET1lNkWLMIBkBB9PyprUoBxQaKk5IBkjL1kO4EY6rja30DpMuh49Adn3oTZT/eXlwTzr4mgV0quicLE1L1jeMTC1zUN9R89oUWoxl2bPeMfcMtrX2qpVgW0U9UrNyHuLRpSUiFdve7hywqxZE4asHgValZSMKLp3ZM3QSZu7d998zzCpJlcP35EJviML0SpmVbEWzmiE2Y/VZnTxCo7SZoQtt8p5MpkEggLU586Oe2c/sb/+9nkLN52sp+mnJo9CUKaNVXWzj+8ip/3uBlvnS3sY96/Cs+xCuJy0QQszZqPBZXB7jC4zqYABH8dZoUXk+IwaVlNCrESUlMgI0ttVnwKubr1KOs9Lb1WlnwDZ/H5j7ZgmfarSeiAsMCRTCKHCQ5myskIug8EaosKRkNkMt6nZJYvmayaaHNFZ/1y6DLr7W4mZoLxvLmwG531CZlKeg0C9QGZiYCwHQfzQBh261bUaDQNHGEFTWg3uz2g15ApmoifhlsQaqHZJfvnOOxK5xpdfiufAj1LR8lBtLRiSKFfC9fzPze+paXB/6YlQTEeo1Ryvg5tKxykpXEJVpgyTBGiWHL9C44wlfvJUWak/tygPRlo/gRdAqLK7ZpcaZJMba+FnX0aDafCzNURhzMbQaGBbq0uoRmkIDTaEmZOmCWdklBHJUC32MhUVXwCxhsugXDxHt61t+Li2lvJI+yHBVeIjKmMtdXAJXbwg+AM2lYqEyaypIs46VfAX5/V6KuJeoOU5GL9wmQsrY0s2Q0aTrsOjeEPIsuANEYSmwCrxl/A+r4NdNLwmaJKW2uGIOBeRdw8qxXQmerag1dSpjMjW1pIdlK0Kxj3AgK8lP5mQG/EG3B4rcun1CoWKhRvDalCpvD5KbVVXxgmrzW6wV8atBqtBYUbAk+ZbM64knGUzeLcknWHaFglI7Hm4Cl+CvUiU/PDgQUkBZszShWMVSPp6RbTdJPK9hWIJ3DKvLb77jjnAXtuof7d9dDxc94/EodQaKL+eCMSE1L4BSqoqWTZLbhoGB7tpmwaUlZYWdMsTP0cPmlbZhdvDgWzmbG3qjC/FNYoxsSjl9RKs0804GRVMqwmrilD5/IKgI3Ae7WI8FHyxLtbBop40igMA33iWlyVBOJsiLyQHOhMxmtREIENwJmJRjM6JL4uFp+rJn8S1z707//N1z34ZOVH6yegNA57bUQXmN77KXBInPSFusInnVvxz4ZZN5lPVj43ecuYhsKhhINRjHIwBxsP9H0HZp89tASDMKRRqddhNZbeIKD0cHXQE4W40Gi0Oi07qwhKSLUgZlqoJljXMNwuAjA4RbGrmyacKO8UGHGQ3MoAMjOs/bKiRzL538MyxBwo7de6HMK23zXlhH1ndcOS5lvNbjR1VM2bC8MevIgewbc6BA+Q06R2Mg+/gDih7GGfOLjMAIYVGo1aHXFQkO6x0c3TADpNmvcFgtls0rv+D7ND6l/4X0R9TkME7u/2R4NBDBXc8EO9/C8EBcQeUewyMu1oRFbGWnFKpVVlatSKygx4PoaIKi/wh1MhocTiMubSRRmvPazlChaEiksAD0QzYquSYrz8TyskslUWTXYzN/QZplF8ESwbG90uqM2t2DPkPpBR5FKnUuBv1LKbeRcqN2JFm0I2Am6LEmwNz1rKY26FU6gyE3+APBB1uN1TDzZs5DYdiNOm+X7qPSbt2zVQgXVSpE1Oe2RiDnNqsWdi/yUjo4/995JDsghVbV0piPS91WF5+5sXGArjmiNPnV3xvVBpzMYRDgOfNEPBD0XSSaAazgqxKXsfdYn6EMSXtQ9MeUSwZbZ/RMTfWTvwcO900yaZt4PfpQTbVRvK3id5PKJkcv6DYiYexk0VD6PWcEk3Os4KB0nAMzyk5/N4zCN/kKqwKWKyoNhUEKD1HjT53gcvmEH3oMbE02684CHfjQE/vueSWGxfIZ9r2uL1T413wQYk+ZZRb01uxnW8Dv9+Fa5UBYmysjUdrpSibgTXTNGC1dDDLSlbGOSvQUFYrC+1ARdzIcc6KuIHjVTCAUagsLAV9mLlpZS3FgJ2TMd8iwbNKnjMtL8K4tjLUKWpIpG8XZ4JXGnd1WrTz0QO7O8ezyL5i3x0DRowYfLC6ipyySNy0tE818AEDTH4cwVblK8QXBn742ut/FwdegzoVQ5224DoPtg66LA8ARoXNZsyCtsFjMvnNNO+Hbtbpt5jViLYuDfIeA/GmcmTZOiRB7jFnkEQ3YUSNMTgVlae8CfJU//6Derz63PMXew7q338AUICcPZtGL7HZF4/YvgPkkv0mvHS8/vQXgBR//+eZJ4+/NIEEYr34tx8al81ZMlf8N4iAvrgfAnOUYkw4C+GGGUULq0nFcQ4WbhdeS2s9XpURETUpAAvfBMubHMABLR2QOIbS2DPKMwAf0BtAiZoQhquOcmmLQeAZwVgcjggdQchkscIMjtQ/dwWs3vfWS+L498ZNnTK+8ck7J0yENgtsswIYB4LfisBicZ5J/FpsFIk8cSz1l7+8amo4ably7swbLqqr4xKycWdufkNdh9vNTLSImfQsqzArLFa90QjPmNGiNbMov888Y4WtSlNkYujaI4jvp85MHrP7Qn36beA+4w/PgIbGLmk3gfLzML7IrZ8H/v+eR9XeOJH5PIRLibGUS2JGI8vqFQ4FTD1sNvhAm4XXYHoT3oX1TGv8ShYyStOJ0/BlM6o6pwRA1+PteohMfs3ikQmVb/Sv7KLfpQHZ4O6xd0YF7Et+gHKYcT1I1lthTurNaziF6xZ6g6T5anL72kRxahN8bMMIemzGnWvqmV6iKGa3aVlWELw+v83thg9FppRTVSXIZ5qa+OTDJbUVsjltKkab0tY5AW+++HUzcRofruyi28ew0J52TIkFgEu+q9YR7pheRxCsnqOhGHSiuUySAPkX3KMgF1+AC4ZUmvF3jRl37lmSBk5QYHzMfO09kSLkd0ydSHwmoVPo9JyKroKnTiLySn6mNFmILiJ9hB0ekOdeGDfmrvFABXzwAx69ftX8mFG8Jv4TxlskcQbKOQnuGx2Uq1csS6XVwi1CABi1GFjAWqwqHQcdEscBktRXwBRRA8xpF//NKaJkgKhg8sI/CIIwgC1CRTwwsR68+cwbc1eD0e+J9e8Dw/Xpd9Nt92yc/0hQ7ABOg9/F2mdGjpDyv4RcCkkurUql5JQKhVGNqOGMnAXNWrIVcaXSqDZxRgX0AeZU6aK5WII8xIgMZtBvB1H4C8+0BRGyzP0Tp10Xv3sf9H1P3Ll67pVnxbz6FSNGPiPWgt/BabFDYOf8DXuhLOgdPAb3WhbdhyhG0x8anjCwLM/neMOhkA3uv5LWthwqgMCCiPDkMKmhwuEAr1dWxfUuCvopg4FKAoVndJ42Y3rCEicaUM2m1N4s9ZBRH2pTyEqAdkh1LbMJOn4PRWd9+frpO+8vaxnIyhG/2qnrOm4S0N8+VhTX9Xvr4vFrjj26GbN+zuk/sVOnFVN6gZJtx9rtXKvdwyjgGZ7t7dDTd7i8wh7rfe+g9Y8unW/q1WtzflkYJoctut+DdL8Jt89LuKcoP6bmLBZSpbI7dAZsWnSAYHD2S2QmMtE0Po+OIP22E4VUYOmA0vZlrTs4N6+/O7ewc78+W8Shxl223MHj6LVHThoec45fcGNG/bG0Z/tQn6teIQhW4PX6A3r4FxVxwWc2O7AYZhcjkU0xIAVA2hy/OxTNECTRcCVL2QFu2k7ntjwyvBCJdOjQlu2ylOdWU/944jgWq6HH6u71xyRZQ/C8k1C+p+HZxGtj5Xk1RdkdWgUWSssTpj9ZG7mrR2ocgKsiJ35U8daH+vTpXJg7dM82W5visval4tDHT1O6xWOdjxkOHm3459ihubZdRnhWpopD8Nq4YNZUFfMwwSDv1mh4C0HwfHYLdOnIE0GGhumyzMeijpuAAoZKlMKVfplqS4xRCRlN2wzcYgXoHlLecdb0tZPv79CfyTNjZ0/qPqjybK85vVYtjHVNvFNxcKeCjr36l7VtXTj80Ixhdz7bYcqgmcttdE7iDfNtWlcPKOyEz9cJGGx8w4yBp75dzEKazQw89hYrieH/zQqFQAuow+fJuICg6s7fuokOBUdBSoJlT19Z6ptDbWeJFeB4gmoKHKgVPwOOWnK1zDLVODqdJ8xMtI5pEE+YyQQNDn7wHzODpT++CSGYuTkLmEx0hSeTblyXn063kWxfL8QpDu2NiwjBSCsSIAiby8+jriwXHY4ElHaHHT4eOBxaysWhrkveBEOKBIrVLTtnk3cAAgbIR/s9jc9JIiBIdNBawDjwy8mJE+WUAVc+774bbFi4SVTdTrcVC8BVsWBpo5Q1oELonKXgakOH47vcw+pmo/WbAeUfCuUvIMpjXrNOUHqzldlU0JlH5bUqDGlR0SOg4whbipM54wVm8jqVFJcm6grS/U9y0Dgi1WRkMhNUfibIsR+J/xoU9efkVD0Qv6dL18fW1h7o0nXSsAeqcnJ8xYPEH0yAeGv1zJ4xl7flqruGVk+fPmrn88/vHDV9evWwsataet0de81cfVVslGYX90I9utJtDSw1E+/NbtAnPQj1UhPZMaNKDQiWIklWTWm0lNrMorJcUXk0EyIbupkgHu4BQRK8DU68Kv4kFAcj4jcX6bYwDXqh9ekZMxs7EqgAQ9BncPzWMmbiOUpJOSini+J5lcNs1EofXgQ/vqwg2UqF4AyM1o4A/h6kyBJWQSF2XpOehH9489LaMnXR+tdOPzHKHzE+eG6Rz6rUaqk7j8P31+LVnIPgMnx6NVB23NVaHAYOjp/oGV49xN64G+vZFcqyivkE5ir5MatBpVdTenjcLCq9nhAwf5NGQEHA+dRcvCwPkK0CUhcmgcj5d/x/pH0FeFRXFvC97z4Zd41PJkYSCJmJYhncQ9AwuBfXFpfg0OLW4sUqlAolFCpAhbbQ0tJ2q7vdytZb6rLbknnzn3vfzGQmwO7/fz+QkfCunXvusXsEkwejPlv43Wfl/wyVmsmvnMeXgheEzxRXretvcis+SZvW8D3f6rvzdPzWMP5WgIUK5DmnIIq8SoVo4WKk1kiY5wXOqITfVTbxjfMpApVyn2LmRLn0TVyLR70uN8NnuRWyAf8SWiT3jMRxAx//GsawUS8Nq0mvtdkMFr3F7gAtkpmT9VYdaDQ6e6Jx7kY3QqV2eOycU2fdSHA3X1hQXprdsdVPIVc0tJu7OqdvR+0hHc5bHgntpud9e7iav4vdV1CLbIHDmqRBBt6UBoKs3WT3ZNqZry5x1tBwCasxyeQwgjCh0xgjuwAnXcmZ2qTWPY3OAl4XDVQowKKUWx6dXnamKCmXq5xm/LnRc9dtuCfUMvOucvmqEs0Rmsy1KBrX5UTvLmV3HT+w6Lb5C0YMaHtHZNZn+k4oLM9tDnBcCHBsz/wGewXygOVxNlHk3Ml6ISXVDVo76IDEQDSIOVqkcMkoOdF+HW+Hjb8DtiYaF+MuhLGnnkySl1/8eO77G96XnY9b96xbf/jMkX54fagn3+oxeZf7+st3fb7s/NO61fNePrqvfgteoeQDHMQvh3lmoHw0IlDmFtO5PIsFpXlBkOREdWGBnTopEALU1Kny6ng7sRMDMnj6BrWGFC6Duh41zvulBN8j5C+46dwlejcWxzZjC8C+8oiDV2Qp7dt1HLd4xwfL6kce3//0u5Yn7+1PV4MnnR79yNHu/eezZblCL62cXtF9ybq1nRf2uGPFzqoe+0/B2q4XTtrYqrRtD4rTq+HcFIMc4EStAmk6vROJVivSE5ebyp5ER3QgD6hpBfKoDnKjE6MSauNLKEtkUWJtzpZ0PnRk04EpdzqeTPv9zC8/ffsPLs3y7qX3zk8aa9hxRr4m//Yf+WOzvFQ5X4lz0TqRmeeRlrhdNlwTtOlsOqRSwTlT/Y+55HDmEsVkSKXcjEiBTa7H558u+XT749+mP+lYP1V++8ihziV4hRkbMHns38sf320YO0meculdS+hfylxYLR86l9Z0LtgBc3FoAS5OrNOpMJuHA9tqgtiY4JpQleiWQI0TcQipOMBJZm5q/GRwIZ2McEWebJZ/kUPR6eCdMB3Op8DmTsDFAMiKDtQ2kKpFoiCYzMjsdJlEk2jjbKBn2ThOBdrWDXl9EgMFrMypijq3KTYrFhORwd2J5ZNfZDyb9+6BvXvu/TjzvPPnJ2X5V9yfu/7AXsNF+W/yS/J5+crbur1P08o6iETribNcwW6gh1aT2+EQdSxbpiPgdKqJ2sAEWTUhViW9vyOxlGvSa3FWHV988XAfIrGa4dm0kkVj3fB/Y1WsZLg88YUmVcOPyccb64Vf+Mc/aA4rwKlWjB//i8lJC8PfU7sh8z2pCRQaU6RM5HDo0jNThLxm6Rq9hmqumo81oIdpNO5s5oJiUkI/E/Y5qoQ1KSUVdRegIkZGJIN0uYm58ZbEciYisqH7hkUzVqxe2Dogf7Nx3fz13c6F5evv/1q3YMa0H17/HTSDwq2na0f0rR628al+E4ZfpAlMPzuybcZ6W+aswRselD9HMd+HDwUCKxkVsKAMLkNK0mdnuy2cxOU1M9mp6JkSNGlRbk1Qn6QFMSFJ0GpTmS+E9ya+EKA9xgrrVTZebClKZbxbBEtrGnU/vbWHxL0TpPVzikqyCjqU38JTos+Stbpdpq6934pzmIA9Ow175mJ79j3Dte6RuiRWlIYy6f1jpsBx6S5zit6sz/JmpPcfmoEFt8lNsd8EfMNG+QayRqjvLQNT4iszMX8cxf6p3NlZqWCrLAwkc/uf+CdcIz/WZ8dtB89s239OvnjnoGFnerfv+8klvlVD1l3ZY/YF71qydDmpvl45ZYqrTWVFezH32WfZ/c508im7m4Vzq1Kro0m1tbxOz0kaLGE10RrFZDW7TYtdmDVmRI2EEKtxObvTwV41xq3x9FX19XL23/AZ2QfSmX4M3vpXCTkY+hW/yU2iuIHVzJbUCgkoM6DhMcidEmfEPDuJOGL2iBl/mrGqMby94bd6bjAsKGJPuVOuFQTml5BH41S8yam8xaI1J5ub5btygOC4HJYUlaEfJchUMUQmmpE9WqfG3zROBcf8hqI1zCMR/ZQS4Tj3Zc685ICf27a5nBUxP81zzFuceyfqIM73GDQOZ0YqmP95Cp95IOoxHvok6iSewE/S0dCAT29wpaTgVFBnUw0kw5OcjtL7Bl2IBwnJyKfzHI1P0et5RMypdrOmJmiOGAOUfKqJWfMTqrRZb8H9WGikt9SzGvtv4II0zKBefg3bsOZGdjh90e7dTeY/POA3GZPT03lkB7nWSDwZaaBm9Q0mExfI1kZXugvmT1wmk4sQpGNCaCOTvFne/4QVKIn9b8426SK4HjQo4ibs0y+/tnvR9Bt5qPzHot0sX/Y1li/bBac2G40LlLpVDq/XYkkzcOYsp91uVoHuYc+20uQQRjM2arUZjDilwEEW7F4HAhEExS7g/Y3SdJO6MH7/f02boSTHjuXKUGMPZ2iSJMNEM2M36JTsGPgyHivvvyE3xnSaFjuWESO0jvjoGfEBbaJ2lCJUiVYFurZ06TMzSy0eVJSj1WWLzZpla4s8LrEVqCeF9kJSEyxMydZ7gcd4jR6szcnR9A3m5NjTk5PLa4LJJjvNumZ3mGJ6OV2nJWIzdVVVNb1mTyhbFLW8NMq9uYCaNF34TSBCqLDJnJIbAcM95+rdof/omSNbCN/IBzUHmsDI9kPdovoja+/Ol08rcFpV2/niifuP3o7vbXh9yY3gWiYP93xy+Wf5rzvu4Z6KQE2p3ZYW7s/wIgu1QMUAt6WBTtl6VFqaUsEnJxc5nfmSo2VSRWZmkkPPt2qdVOwqrgmm+2qCRenpgsvowKZCEEhNmryaoMRpHKXJAlUQBHu0rDi1r0SpEPVJuyGzX9RhIxoYS1Wcm4MJRy6dbZ4E/MFMDyotIc18lpXNdzZFptDPrXttGDn+NvnLkCWGUiPkw3hm8y65PTfOL62446bYtadu7LAvYxgmb+PyQjO79xzKcghRwO0VCuEklaDRAb+huFgrJTW322zZCDWXSGlZUraZN1PziB1bCJwtU0u1Rt03aNBpTHxJTZCP0Pyo7SnRjNw0Bo/akFnokbeU5jj0JNqMabQ/9tGsbbk0lUG5l9IKfu97F+Tg7dOWrPLMx2s6dLz7ced+3dh+xz1tBpZOGTdeHv+Lt8uMNYs7NP+yTSWu2nNs4SLu+ZW//GJeepete6+dhRW5qWavZ638r2Mt2+Z7cnpP79e/W2h8dQfmRw5nrAHwhdaxGB+wCHl5XHZzMSPDpbNmW4taZhYwQTPT4UhWAvkcKYRgjcao5HDQ4FzF9tZYeD4mrCfUn48zeUWMcaWJluc4Y68Y509Rbi5iVrqYPTpq+t2+8fDh+oGjJ2+JWO1axpmnFStweSatUk8L1rtBc4S1hq8BzXwB9rklaoNuD5QZgOFKWe70tLSS5s1b53BOtyS1bZfiqQmmmMxsg/OBcuQ4W3N8fnp+OmLbbY8k+nSg4kZzmbL5LH9+JJfSDUXDooEwyuKUraf+TGyROTSUIVIPhobFcJG0S7lR1mfEDjLk3nEzNkxfRXHgsccqurat6vXOy7hlybGkE0tmZvYfNbJ8zup+h6aPnVLhKxpW3r65bdy49Qu5S4AGK0NTBnYp3fQ2jZSRzxkuvvn65vG13XOWTBm8vOuarl1ati5r3b4L5Ym0Rt044RWgG2MDpfnFxenpWRk4KSklWW+xqNXJGcTnz2teE8zDaazgarHXlJxh15r6BbUpgoMG00Y8FSMVxvxNi9TFX6fAOYh5nZg8yuY3Oiuac73RANC4aCxuk8RlThy6cLrc0KZDi8DU0h49Bt2H379v/vz5izv5mqe2r+Rb7amtrb/c8Ij8vumoZQfxHJjH0mmt8jd0J2dWLty5XLde1W3IaEWGoTmnngDcb0HrJJMWLVCa2QXaVW6uGZGils3z88WaYL5DnYZsNqCCW1zY5bKZos5Z/qLIEXfdopIafXPw/z0viZK9Mdfepb4ahTfv2H+rTCTyX3+/M9xfuHK9X9/BtX1vmX+k3baHu7aZEcvbugPWpgLpuE0gTQSNC2klAQk6vaBmUQ5GjDUiEuPFgJuZ0vwxLm/GT9YTLvQMN6nhA66Kuo2tb/j7XeTRho9IJhtzE8J8OxhTB1rrbYESq8UiCpKNM2qcLrdbq9M5jTZBSEoGMV3ieZfFaLfAX7PKaTDYzHZOhbX0kshP/0byMlGXRphEkb+xlEp8DT6l1LcWe4k/GdN/JOHLwtWbd6y+sHjN7kV7Vy+8GP+FqDlv6J/cC6FLXAX9+as08Tus5WGAXzqsRQI9p1Mgk9fpBD1Wq5FKrzKZDdp+gO0G+Cuq9XaR9AuKOHbbWRkt8t0kSYbXzErTRn/49EdC3z1KZiuv5AvqF4q/+qtEeUfKeRzE5/K9QDOrDKTYjFJSWlqqlJqekWw06/oFzaY0nkrYiI84T5teitc8olUKo/5pTH2WchX34JgfG4zccvvMQ/e4SlvmtWhZNRGbg1NmrKs/vaVm4Mkr2LR2ZuvkHc3kIfIXh+c8uotb9ldKhE4IAZhXHqoKeOi88vK8MLFm+dkZ/YLZKdHpJUyuqml8/f+enZXRRhYxU3qLeeLO/YsqXb3bn9hxiwlff7xuju2g8+m/ge6LO+JvyWYRmSRSwI1BjAbgAPxug6gBGHcJGNNSTCazSpKcZpKeYXO31+BuKIhs2A/HyIxbgNitw90fDyJyFhfHHNYT6Bvsc4SoeeM87fyN/tn4TLMZA+bOWdSl3+AJi54rbplZNEjkx/TutGibzOPPZ/VbMlFuR/q8qb3DMK7TzDSl3vJx9BR3lNVbNoGmayQ8r0YGg9liNEpY0p7F3euDEpClp2G2Q2FJhfG2oCVFjRetrIhsguecn2u2qGZAZWp+iWeRUHvHHQ3Nxo8WR/KV7Ugz6OgKwCaP/xVZUHFAqxUsFth6q43anro9HhTUzwAQCG4JUGyBYkHAsUJHjaUiY84Ub/C3CyStRxdHSkp2dR/8LddjVmDvmK7S7dKdS+TZyn5MxB9yF/kvaP7mM1oBWSxWm+VpGARWrIz6FC5CPBsxFp4Z8SCnHqXKBVo0Cwb3LB0xpRcbsU81/0XoCRhxVHc2It5ExxuJzpMuMJ4LIKuVEDLrXC53ktEGazwd1BmNatd5NjrPUEGNS+LTecVDtvFqsS1OmMOZnJzcFH/Ow+7qbo6UtKzeffgvGh6rLNLMUr35r5rOsanAPpcAvE/AXGgOvMEBG7UsSMB7tDQBnqSV7A7eCpsNYhfmaaUTntdyOjo7LaBod5idloIl5nNxQwhf1Iva6icxVwsriJoFQNkfWfevHT8Pn7B9ifzSwrN373iaPIZL5YuW+cMmzOGuh8YvXy3/pfDMafg7fhTM0YG6B5watUrSm4w8RqBZOSy8Xi04XbyR7pcdYNWy3oKxXnWWTovOglL2eP24kTQS6iBHgHRbHc5yeotWhWGWGzfdoXVrjKs3vr5gsUNluHvl8nS9Zfl8/B2+lru0ZffQ19xfob/6VbbhBoZ+X9OuNycimjbqPHkW5mdGFQGzUdIatJyKt1jhkxbpVRRatAAEhRaK7mXEOzZ2a5atnI5ygBSdDOwm3lDsrawYXiB/uHJvx6JDK+Qv2i87rxrJD76d+4885NW78Jch4UQdta/hP0hv7l3hikWkGYzgu530Jk+w7wKrtc7xhHuV1ZhODmjVgHAarSTR/6u6Uhk9qvScKvH9fjvHZRcsGBnkybbR2zuuX/LCLfpQqWj3iX3YlYB2byn3KutDuHKrPjikVmu0HHeTPrwsLLgt5l4MjlxQmCVceWHJ+i7bR2yjfeTw87mPhV8BX5MCIErQayWDUdKjotfjnckUGbaUXXl5uZz88vL8AePHD+BfqyguLh84obb2NnoOf4C+7md9pQY0GiIBsTMYkXgWd0VVCd0xK6Lfrhi0uPsHjhs3kHbJz584qHbCwPLi4gpGR8rgLG1lsQmdAwatzoHEWJYzeobUNCk1TXSmPseQwQhUU6FjkUo/lU2uPnCjISou1Zidk9LyJwVrJ663L7XtnHng6IZV+Fs8Rr997abVqzUT5zz7xLGL2v/cMB8TcEUtCGQ8zMeKlflYrTAfSdIr85H+53xKG/2NYua9cjPXZdWGowdm7bAtta+fWBuclJ+Gv/2P9uKx08/NmahZvXrT2u16+QC1A09Be/hq/rhJROn/Zjmp4ftY9t2jo+d8Lvqer+XPIhHlBMyEFwUOiD9Hq1RxIpz3Iv9rvsSb9WyvGnuxn6+9Xz4tn70f73nge2Jo+IW8qtCNxP6gM55eJHPQn0Bu0R+7N+bOPiBPuB93wz3v/568Cv0ZFD6RzJ+k9fxorfaAiaax0tIa65x6w1CB2055c2O0jx24guQtLfeTk5P+wX09UT7Kv0irBfyY2E9mwKwiBI4jj/kNQ7G4KYi3o6q4iBpKqKKVCbhzkVoE/MlI/UQ4Dy34Ou4g49OOJ6BrXsAcw9/XGtsDxz04axZfh3vBA335t8l8oT99PqChEEFkcxDtQBExid4MlHrI/NAHXC7/9jJl3U/xp4kWxhDoOQHGAEdWlISEcSL4YfXbJfzUiqu/8qdtmKQq9BuP4k9zJ6PtkSBQjwmJCjRN28NKrXau/69XV/Cn/0qVQzakrFGezB0MPwFztkbWSFDRDQuUJzM3ZXhggHyNLAhPaVwjQZuDZGeTNS4I/YPLlq9F1nhenkyM4eUwx6T4OcbGiZ/gSZigPDk6wSZto/C5oa0CnPMAHHlyFDgcvg4vb/Gt4GkJ5QUsAsZAh+CQEpUai7yd3nhUKZ6B8VFJkjfXXO53cm+N14+Hf3yr9967/tJ778FcrpOxkf7cdO2IEAAX8xxR+mCXP9CcNaXtKE1Fw7iP8Xv/naZm34KmnowjqZSmQl/3R/uK0lQRNenrFgR1WCI9PYUeJklYBshkBPSSKAJo1SoRWAac3SuRW5XoyfWA3u63+0mSvHvRrEUPT/3iC3RjHwjaMsgKggTbc8WX0Af22r3AuTwkCXrAt+FtX3wxNdLHEZLEUa02P2DVIE6QYCZEp4duNKKophtdGdUXK83OiDCq9BaZFfRIO81YsmTq4sW0zxbYSg7gewE85tMURTlKj+LR80BoCzcTWzfCs82BXhwEeqEHDLHxQC6I1mDU8AhIBpLg9MaTjEaWletXwv/9BsyNX3y/fZl5UL+BA83LXMf4k5vuqOrSpWreBuV8EUHH+DJBJYFMAtgHAEa40oRq0Ci0BfEt4e1e9Bj6BAl1VBUrGj5r9ojhRbEDSIMmySVBRyMjKU7fzi8mg0UtwMuJhgTaAW23iKLLrTZuChrV6WrORNRUllQTYt8ULCJ9yAzyMeGNpIhUsS/LyEFygahIwOHuBsAtGD5L0S2ite4SMiAoDElKKBW4csbMFbQO3YJo4TmhU+2sWbXB6TMGN9b+w/hJeSBxwicz5Q8qULSRThAsVhUHE+V2MkGtKDZeNBELu/j1R8p6lBNnVa9Jk/t3Wx3oX9y8rK08M3nCwE4rm2Ut6ZDf0sX8ZWHvrggPIjcqCrjVGodT40xKdhgMAuybAfbPujmophvoK7hxC1tw3kwDHFZqm0vjIntJuPwBNb297jSbdoa2qF9V4YCaHp7sPM1M01j+ZHbzbGtWYNSYMvhQ1O3O6cq9XyrMwQr4IygRpSo1o1FapCaiqNOrOIHbMFQrbEdxTrLOOJsZKwLoYa94/dWn5bflMvrKn7T9mPol/YF1hr/E47kkogMcTQvoMNLpVAajDj8raACtk674ompBcUsSl8KDSElfpBr8vpKa1ksHvpVfzX3jXdepTd72Eqyzwv7YSHNyVniTnTuHBok8L6g4LRL1OpVW4Hi1RBQmHpezlxK3XCm3PLfcWe6UyNnBf/01+Pp19kpWRz/BK8PTDPQU6D5Pw/4noa6BVA47jDYayK/mBUFNjFhIThFBFyJuTucGgelUUMdzMGDRTQP5o9BipiDcGAhfHovk55Kvr3ju5RVySNOjb/fu/Xqs9PmTXT6uPbdQ5rAcWmtd3r9bMNit//I32gRHlaZ7GY4i/A3gTxhkhXJGz2FqIHlLTzOJTYV9p4BX8Mo3wlSxhEhncyRRI4twpvGjjlAJbvMXvp1rP3gwmaDEyuNy/BHZBTp3LuoVsAGdzbAlJyXpQCHMa6bLIE5n6llqgUh2Pk2Vb6ShXwC0oBPHVw+qvNH6FJe/Mna5kCA9puM0juzau7lun3uqaUztKU/b+bcN9W9Zv3Czdbp9d/8+Ze1rFtSWcBem3jFoiqNt5dys5ukZKWW9KydNGzzWMMlfluezODxlA+gakkDWPQU6mBZVBdwi8G8NyFS00rUWU1ItaeBNJTzNdDEGKBq/lpDsObaDWpAp2S4STApeenkVFv5ce/aJ9X9hNcjZreSX8Ho8W34f58mbZVYTJSpnW0RuBYPn7TDEYCbvuALAHTAWJSZvFvljSo6HeSaTwbvkx/HnQpc1Ce0orzIgIhAMKyA8jyXa2FJZFD2b0fZmv9JD9S7y+Ro8pmkfeoEOfrMu/P6b9MHtW8Md///sA9euIT829vGqAgMOxBAqMdLj2qjoNcNKSzkFGq4ROjMYzIF2Q8hMpR3fCLuEdtQ8TIbI7ul4AZnZ8Gd8OwlkagPICEiRoESAYuKklSOhFBSGPtZOh07wBvl2MlNeCP3ky7XkSHgG6Az5AQsHHB7Ol0ilM5XA1QFvLPIlveZLcOegdyzUjOAsJ0c+ffb9xzZv2Cp/jV3nzzMa04J/jxwQU5h8R6GJYU0IZkbqRCGBNCrziiR5Zcyf/gj3zZWfngv9JINI6Ga6sxUVBKwgI6qtZo1aY7NbVCqjYKVatO+KL7LOOJYV08g9sU/4c6ab4/8kqugxTZ3yreXyQS47rOhOJkIlFJ4TQSRW8ZhC1B8FgqUyGr/HQODHi/s9OHvUqNnyQew+fvxmfVG1jgPhBdG+OPHmfeVKXqufy6Y9PdhPPnj8OHYrfV2SB+FPw39BX7DPnMADokgq6BJ6BBkz6g0cgadgl5z27FL86fHj8lei0lnTPoCR0FQpKlgiT2dzYx9CaXku9CF/dfz4o8rioMFGuZZLDb/NZBzgeFEZx06MaljRFV8ctgm3kFO41Pk1NfPn9e03d1Tr5s3btGnevPW3fafPqKmZPr2meXl58+aVlcqaN2Ijp+c6JOomFBfj9Qs1proJflT+6OpJbMSOVPlTG+KALxu551hbLUiP5khrrVatUulUhArmPgA/TjSOKX152Cs3lvYod43vN9I7vd/8Cvp/PtI/7C6luFRQBxWoafe0+gDrnVBNCPvZq/vkVfmjEH3BRhtOT5W/VV7pusPfyFO5J8LzAcJwcmx2O3TusqiRXQDVxA9YE5t3VFgSG2UlKirha/kDqruml5eph2pb9gVJqbpz2jjzMPM4eSrIR+0qJ0xqC+/zdsynegHexl1iMrBEve+pSxdCVFLaOpTjA7ywdSgPkiitvHwlgbnSZMdU/hVeeOEFPnT1asPOq1cpPdoLMnBxlAdQeUuU2MGJnXfGmIF6kmL52gq8S+j7Dq5p2g7OHdA/Rd2Nb0eZOd6Ld62QrwlX5Mfeoe2AbhWH74/QTeYfxt/YjuaILZYnr8A2uRbX3NAOA7UEzfWGedLkKDCeDbRe+a135McAJ7+Hdh9DO4liP9AERtV4LMbTBn/jqKV+8nHIsA5/up4OfPkyw+tv5cHkX9GxOSDgosR0u7g5O/3U7erbzdykkCp4aa0ir/SEdivQPqCFLQI2FWUREuEYSdFosUoFSmfRlRghjKQhYE53gsfppdgnecgKedCTM999d+aT+PjpX3GyASf/SvsONYi6cG/Jq8yJnhZM10SPWiOuMSuA/OOvV1eIOsUKgOWd0O5L1s5+hqF/fCtfVP2Xd4L6L+oabSPyaf4k7in8DdbSLGBRq4BPAtMRsajh1XUisyolsQPkj2M3UeuS1Y97MuvSt1f4F20PPmjD1FCFGzoKDWGTpKKx8wFD5NzYBH0dnB1UdNGf9E/fxf9xcuQutzg5QkOTk0PX8D3/NrYwm5KxnnC8ospif4ShYQs1tCjGJBx6SPRyA8Rj7FkO81Sb9EWeBQ4Veoh/UPSuWKHA5kN+M84CvUSPKgJejVZrAB5o0PB1khEVIY6+VKE+aBk6iC6gH5GKKaY+ylFx7ELcnKAHz99vnKQb26sHCI+WPfzmjfNad+/aduGdlNbcx7+DhgjLmT5OVWAc2z1KsPz2IfX8OydOMH1K/oZ/ATuERYxWpAZ0iEggg6soI9kBTLhxu5jfCcV9+5wjob8d4184C39gXU7hcviSVIAslGIajEYRaTSiaKWmCb2RcQ/TS5E1KPYeopiAgYEwA7C3tB3+2J/frUv6kMnf9x06s3NLcXl6pmts2s7WA7W++SQN6HIFyMKXxDFR/mQRgUMBgzKq7UThT40wst6CP126gT0JR2/Cnzh5GeDwCuFzxgOaBayMB3BASQhjAnUi028VNAbh1RdvEIuwAXnZB1flJ0L0BdTKJnwg8YxgeihBdCAqKuLXifjmZ8QKB10xm0658m3EaooN9JAw3Apf5utQK+V+8zQCPATyU0X320ebmv2tIgZTxuOC8Oz9Ed6QHNAKPMhwIHMobXwU1X0Knnhp7QWzv2zWrH8q7eX6SB8RGD3AYFQQsDE+LGrVWo4wRtwUSI1KVDYsw+5hrzhLfuLqB8CK4ZU/+ffUz2z0R+n/Q/4UzhLHwVkxo+YBm9FkIhotT7TEoiFEMhkk1j/se6VyNhuRK/GIEMCuhGOSWs+fih4UfBKOAD2XT8C5fArGSg/oI/YoCdVpebYVV+Lw3wzKnlfJ3+lth+fttUwyjunRa6xukvGA8NT6Re26dG89byPbj73kOzSOybfOgFotIU3cDRVmcYAkdj81Pidv0YjB5LsHJm9qv27pP5q0T2Z3qmq1Ju5+CkdRPSYDj2N9CFdu2QfH+oi7n2rsI3o/NWLwiEV5OcKVfyxdF9g68QHWx2/kG/SicFnpQ1SDmAUrIeqmfdhYsVxvqf/FgTWFE8URzwlZ21dmd80/8Cb0MVSehE6E6xp5EEhsijk5RrWtjAdVU0P0pIghGof7yJPRvcwOTXkQMKFYK6XyExO8pJNxFmgcrpJHosPh04DZKQEtoYY/FVP1FJsmG9DHzoRiyzw847ffZsgj58yaDW1HQNvnWFugMETEtDFI4lRNjDVmh1Fifmd2L2vdc/YsJVeSvJZ/ES8Q18F8Yc9BludBW8M76JlSxlUcWICDLNgc2s/9Ak9XUlqN2vEES/9zrxs1HyzdcBcZvk+uRSPDbwEOW5/QiMBXEJX9FQDTFO7xBuqRUfu0XBtnoMbhXtDHqfADyvqhD0TJAgf8O2Japmk2KxWXcsUOfIoZp+VaZp3G4d7Qvp61B/mWo+0FQYUpeYvYt3HskDojtul6Zpq+SC3TONwT2j8efgYoCshBGlaWi3ahU+zS5FnQRJKilmkcn5HJGmebflwxTctvR0zTsC+X5XdxZXgs49GUNpJEfl5JFVP5XeXcmukc0F4aN3RGRFot0DLElh+BZHmcp93j8lf+gb7O8/fKnyu+coq8Qn178KH4PoiqSR+NaY4en9/ZN9Avf7VX/mWH5agJ59EsG+Fww+/yhdC58DIQe/4d+glF+DT06wgbGd0G7I7waVAZOUVIvTmblmsZm6Y8FNZ26QYdz06eZTpeVNBgPTj/r3noDSoeDu+WK9GY8AHA57SAIUIzeKQ2qTkYZ/gVfwylnVGM9o8pzLtjxOAXrtTeUTRuyP3QRw+5E3qC1lVFrQMZJrPZaDDwasSrid2s2xY0B/SmbmazZOSkjTHTthItip1+cyNi2KKbRf3NpXK/lIafkH+o9BRnb2/bLSW1/ZTcESNk+Sl+jDgoL597Yhzpz87BQFqXAzhPJtMAkaCj6VATzOjYGYX1DTb049SEXtsp3oTeZVVO1IQO/Z+DfegIdCYOH+NYdcc1a2CfR1B6Au8LojqJYitVCbiOHqeIhBC76SlluhdesF5OX8f9ItdevoxrGO7vl7fgseElyI1aBuzIYNDrRZCgJVFMMms0xGXT085AfvJFzlTkWNFrNbPiV+ZXfMlib7BeV+9OI4aNbtGivP2w9uUtWoweNmK2/F1O6fKpvTr26Ny5R6eeU5fTsZ+E+XcODwU8ALkQ5BwQc1S01q2I6wAfEtZgqVSEnOjd8Pgrn0z8CIQcufZH+1132SO6BfTXnvUHmn9EtwDlQtSIXB2vbtphgmpR7sftQbX4aOInV+SptMcfKd+XZ+Os8FzFxg/yOBXHge9r+Kan4b9I3fLsRqkbNe2TLhbEfC2I+MzSFt+n/daixJ0xSQLLe2DNtwHtitd9LCpUZ1OMBkkJVgPrzXSf/bcyGtTeoPpQ3Ud+BlvCrW9FK5nuIz8T0X3kSdwA+buo7kM94f2Juo88SdF9OKDBtUCD9zHaBZChdkMmdNaxERKELCFiNVQIM/35OzMasvntQT/j23DoRl2QklifLxEe5f8v8Pi5CTiwfAhb8Eig5BFYNNUDR4Y6cOexZTODxcM4hRuEd9/iWW7Q9Vr+QZyyhK0BhT/nEPlMeZbj6a3Pa8qzapwLUnjD2LFkP1nRMGY0OUCf/zL8T5wufBV9nsI59rwX43R58Fb8oPDVn3+IGkZfjsjVaFj4MuAgtbloNIB8BnrOX2+EDEm4/R4evfyWjzTefsfTH+A2AqJaAo/rmEkkoqD44i0ieEGCRYQLdwI690z4KtvzpAAcKwl6kBSbypXG9jS8kZR67c/I6/D8kU9B8/nyV089pez3YXknHhFeAfsN9IuVGEJOp1bnMsMHHadW26iCCUt6LULB6FuEflmVJK1M1/QyJ0olfKzB3KO8zbA25T3MY/RDqmdWZlSXVY/Uy3/vQWlXj+ohQ/15Q6opHLP52ejvYjaTR5wCp9Ly9M5Op6FqYNMLO9xYPhZGjruz+3vtqpWDVq6qXbVq0Cr+5YFrVvdfvXrg6lX9Vyl62938VDRJXI9clKbZ9HrerKIVHd02ldkk8AxQldHeY8K2AUulNIEIu4Aqt1PGk8ZNKqrpX1ic6k0dOad5S3gTNMVVWZreYk6+s7i0TWanan0vVVahy1faGs5j6ISo4wZKLaPnkRb9JUjFi3W4kVLFLkw99mx6oE/wD1I0FnUTJpyfMEHZn1P88fCPwvMg84LsShNawBahOgKaU1KceE9AySCle9bPvyg8L/+mw2qajwtZ+OO4mrV1BzQCu1RJbEolZjvxllpx9cX564XnjfK/dVjHxj0K+udw4RyNkw6YLVRHd5hAcha0WmudmnZxxQcH0B+R2hlvjRIDSyMt2JDftX377CK/enzqI4XdO7XPGmqcYJzEP52enV5SiTl4m7ZuIdunfTxB4/8f9LHxTUV0ROSH+Ku4v/AZrFcNZ9MXcEB7EJNFjV4t6kWDVpI0FABUyvVHhNxGE4DSPQNGRLo7ee6OlfKDu/DiXcJnRvm6DqvkaydOMKMODsMxQntAd9JRGqATtVo9UdXpoOtGMdQZ523rb2d3GTyFOZtWNXic4kztPduYPvMW6DOZEZso6FICKFNSHTVpxlsobpQ/+Lci8gcn6+E4/xReGsMzjsccVgl8HeMWiXQfOqE/sp581pBKPrs2efK5yZOBjnSFtZxn8hKjI3AseOgiZpuN0pGoucK/Zs3PigwlH6ZyVLgU2r+aYEsWCOA5BbMyOmh0zAb9KjNBB6kFmvEa/g58m/AnSkLDAy2QLklncOnd7qQkgKWFt1itII8la+HkGojO7RZMDoegoyTJUidEEdBXxFDQT4tomyuj5yFS9zFSNQwmrlAompoPCIZDQU1WLr4mL3WslfGpdn3ajm6b72acamDrvm1HCy7rQmBWLaeWTbUt3DG/eFo5w7F7+DF4ksSxGokZqEMgLT0lJc3tVtsdDjgjHkGvt1tArbXD39T0JHeEwBRF55kgBN5cpmAykBC5JzhQ0LdX5/Ryn3qitmW/qsJ+PTullflUk83j5RP19fVCeUYuYGpweJkn11PuWz7lnRMn8G+AoZx8kH8OzxRPwzyLUdeAx5OZqW5RpEzSl5aTU5RZ4HZnZsJ0HWqYr3oHTTHnMykwhWmyT7FrHp/5v0yV3PS3x2418YG3+g/+uSaLwaomv6A48yPgnTn8pCKjUg8PNRBUQUMkicdqUQF31GIVmbYgAfPLLbf7S7F51x+7dv3xx6m6ulOPzp2r2EBq0UnQ2USqU4vUfZTnJIHeB4MQEKUREatqqbcc9OrWc0+eXCzX/rB58w/IFXJAk2/Z/Yua5UOktcWbo1LUFnVGPVFfFESj0SQ0Cy1Ay9F6tBXtRvvRIXQ/bhO4f0+3++47Mnvu5BUrpq/pcrjftm2DdpXdeWerTdLBFgsX+pY6xoxJmiAeMAwZYhmR1q5dZoecfNK7d36HEQcmLD24adfhNXP1vfZ2P6LFfZCmD+l1pNcD2r33La6rOTpuw4aJW4bt2DHqnsCqVZ3W5d1+e+H8jKlTs2aaBgywDcbdXRUVKW1altQd3XLPuvkzB3dvU1LSpvvgmfPX3bPlaJ22x73V9913sPcR3T6JdO2q4ntQ/k+R4CVf5IMSER/905h80P/fX8x+00WFGjmjdYVvDLn7H5+j8SvMtkHlWOrMmW3zZpaW+H25kXdr5N0ZeceRd6nJd+pxBzSV2Vrw/3i26ffsJmNFx86G+VCBVKAym5/7dtonuHfoHHV14DpOmyZvLamoKNlZUllZ8md5WUVpFv0qg4hRXvZIRWlpBTeovKysvGHVJ9Nwb36tfOqTaQ3qMvjD3Ulfd5VWVJSGHiytKCv30u/4FdpQDtI2f9Lmu+hv5S3TppEsOmLoGfnUtE/4lR9OmzatYQ6u3g7PFcKP/Cb08wV8wLvgwxD4EJpNB7/+Ie7+V8m0D7n3yvytQu1KS8v3lJRUchmRp0Ph8vLSL+FB+a2Kksp8+G/os2HOtGm4+4eKrHU7vwRtFD3Re3IOlFAk0XtykYvek8fdIij35BvpNbkwP3JPDrI1Px8NYz729jPUHRQZFGfQmASQYGkbdnPXembffgdniWuYfbss4DYbDFRVtIDGaOG1WiMyGLcMlZDhEMgXvmh6kEYhs/JGYzS1+SRokWn14pqoIin3Ue56QKaVO6C/h39nnnNOLfWVQ7woNsq0BKulG2TaiKvbrcRa+e54sRbgLA9CG5k/ArUDKj4NiS4NMZ7vVDwaNsY7NCh7FeuDaovMpSHRo0GhoLSHxn2KujMAfL+WB+GHWXs96hbw6HVqtUTvU5GWU0mSEWZjgP4kNU/LOemUbiupY43PH48HloRs4JGxIu4cmA7JvajMOjK0fIy5duDwUcCT4QxPFB0MsMSguCDfQgcbdrOgDox+5+/Hp4TxsF8O6suMdGqydSgVcAsil3lWZqNTvPN+r8jNrajMya0QROWd+R2H2wMsz4dfQAbUPuAxUC6i44lOr1aJGk7DGbGWqJFOVOuIVisJBmqprCyKpW5g/MVZGTPcwt47o3iQ689Y7d40vGPP6g4jNrjXqPu/4u+ZvbDZsqXNFmT3Kt1E5ZELzAZ0DllZVcQ2gWTBmJOTlKTJQMim0RR6U1P1zZxOWj/cGPWC8MVGjjNHVUb8TnJjdkknXbcQV2pPiLNT4s6TqoN+f7DPxEnVQ3y+IX0mhi61LSxs3bqwsC3+Nvrpj+rx3buPr64e363b+Gp/Gfy6bZk/8g5wq+BvQ5fEkojkytNrVBUvSZRaXIm7doI9IN5yj9UvXRo5KxBG8CIsl788hZNOKbjcX64V1oRfgT1MDxi0IA6AEsmpNgfZgfBdKWhECYHzZBA/jXjOKhfWfBN6I3T1m9UjcI9r13DPEWXyRjxnxdy5K1if/AVhjeiDPrMCJi3rEg5JgHVLox+YZ4evUY36bx2LvsaeWd9CKtkvUFuNPaCmAQqY2xwEeTmKcsyfe//1J/geQuoytr53yf7wwMbnWXzCzZ6X32XP8y8Iq4UwSCM5AZMdDqXWYSVEKxkMqE5LVZTKJqobCwbMzopQOqrDw0LKhdXN69fslr+Rv9404va01c2fXxR8bSs2Ht9TKYTvvXvQwAHDdhzJaz7oMWVNMOYasQzgRS3nWq0oSTqiZma5eKsczoFReNARPRlWARSI09euyU+MWP0t15Ir+pZ/gcIIz5E3xvaVXAVZj9EokRpoeYleNokJ90U+JuHRDDbk6q6GJPIliHdT51IadRZ/iFfxvyIvKkKjAmaD0WgjzTJUKputOSEtxXwa1KQJekSDaEBms1bxijXj4lOuLJTFfFhTEQsM9DVJPVgZQylzo3TIjk0VjuYBKvOwxLyxXK406jOX5Y6QmCF70swZe44e6923by+pLgNLd25MybM6/IVdWgt80YJAh0lt1ywZ0x5/uGDy/KWE5I+sblWle33VEvlsZaXQR9ur96AeIwPT2rTjSJ++VR1hrc/AWnvAWq2gTQUDBgC/zZoE3/T65CREF2oIJlEnejFJTNKYTM72GrZaEy5GGkTYZw310E2sjpawTrrISF3iaKYsf4bZnquwyBcmjasZZZ6Svm/W0ePH78WdlmpHDw/eJpDeqzZ18GcMDV66dO4VeYp59ILpC6aDznkRf4vaiojpnC3O0CJ6PK8S2qtxSxY5SwMKlEhhXyQHexxdp7oRTKnNggULhLULFjSM5a6HBIDBKYBBJ4CBGjDfF1ADzzUJgkPSR9YqwVo5ZGWfuca1NuKmiaY8ofnx4m9kcCe5fs9DuMeJvXVDJ08dNWLC9JFkonz7C5fxXS++dGDztr277tkOesn7MHYu/wWMXBnQ61X0VsNudxh0KjtbkzkS0GmGcXVKzFwkqhM3Gp5IY/GWaJRwTqn5kQ7AqRbyt/Nc/vQBi6bzX8gp0wcunIOfCj1wZEWvTss24QYY/zUYP4f/DTlRl4DFarFQQ55O5xKsglVtNNojIDACCNSw+O4sTrjpdse59cFkTIk7HXXDPvVUh0HaxYa7591z7NDe2dttSx3rxwwiU+V3uvdSTVt9+eL51+ZP1dy5jp6/SzCnVrDHtE5zz4DBkWo0AuaJohdkIVt7I4DBCNurQhkR53TqLZ4UcU0vasxaUmWpjAMTZQeRQhWsPGxprlKnJyehLOwz3hkDNqzAhgEzvBgv5O8Q5fV9h08cMeK2Yf258T2qnn8Jbw50dlbhNg1rx1fk98Xk0Ppd++/euIHZJT7F3+LmbN6VAY1Kcpgkk9nstJzFvlMOojKfj0bZs4kWxwJ0qxL28sYQe5im9EBcZP2iG4LqeYf8Ewuox7IL5vA14DLN5mxxZIOKnppiUKUAXuV4eAvPqJMLplRcbzcY1NqzuOXjqUgdCWOuoiQpEp0Rm1PkxobEJTCJK65Tljjb1hXV1cMWkjkClzO+14DRNq7jvpnjF1T0qR4K8/p8yuCFc+Qu3OAjo7zVHbv03LpsE13DlMHz5spdqE4NZ/shFpNfFFALFguwZKvaAOdACU8vBnm1MSa/Mv4Ikhsj8h/+XwH5OFyLP0ZPC5uRDeQfndZoVAEtsQMJFFkQhlYt0ZBqDlkST/5LcfCJ3TTekPbm6dbttw8cktVv3brMgqTm+CfzCRwafvz4cDm9vBB4sfwgwGMwnHs1rNVIfY04muSPcJxGxdHoAYHGbrHogQTtgl3G4Ugq5s5b5d9XHG5psJ1ZAeu7LhvvL+nIeRT77xPQf59InEISdM1LWMMLlMHCUEQnaXgQB24WqKCY6n3MYq4sLy5O4eX/GaZA7cd/8g9xZcy2Qf1blDhFoY56McXbnq3US4T8Of3qx/xDNqxPlRtYPm+QSx8Pz1dsgswOK5I6RG2CMfcSQbG2Pg4t19nkX1MxHw6jn6DdG+HlJomIuAwpObXvitbV5eyROuDX+Aq+GjhdGpoQaKdHacmSaLXZxGTEp2ekJPcLpqS4CLKarKOsM6111metoppYrS6XqSbochBNTTBdWiZtloDrEJoOqGh4LLUczYplbhLIrKRNRU3KgVLayHkzEU1QugJzv526lv6sqW7uge3b97NS5vMuLvg9jPDBei4tUv576KSL//jotcnTdKP2B3HGy1Rj5OJqrCejiYEqs0USk11wYFyihU9Jdbv6Bd1u4gDSbDSnm5eZN5t5NTGb44qvm6SZUp30hgSCs1IoInExs262mltUZKeG71tWZQ89Xn+zwuyh1bCOcBiPkneCZt3KBLIa87n9B3+S+1H4A/bfkxgDrHt8qLAdJUYcMQzC/+jz4kP8SQ/OypY/Ychczp8ku8T2Edsa4L/ipKTWazRqRIwGlVaj3RJUa4T4fmnkn69pxrfGUcojxn1OXfbitp2bQ4e20iFnZMs7LYobB+AbTb9wRehiyUFZCJklUiHnhGuQ7RRnItxZObveYOalbFxQiqpK2Vp/wke5f3D0Hi474IzEQ+4dasRVeAY+iK/iHzEIr0XDG6O9qfL103f4KC6Q3wmHw1ehyQtCF1MOyhvNxgv9BuPl1GMDwcaz4WdP2VO60ffH1ZZuZ8Of1BuNCMH4BcoMlNxwk4TOQCPMaEjAbtbpQNTlqUu6CiEtr7VYDWYAUMAVNBgEiRsZrJHwvdJjEidJaoHwQKerWJb44bMUtClIqNIVV9YsEgZDp8+ASR6VB1+4gB946vrdsHfcjNBWoXPoFa7sr6d5FN1HgCeV3OvY+gqXNcIzbn0Wa2R9RljflcT1UfjAGTkhDIH2vi6N8IH9cMF+hB6ud7hF1LgfCjweBXioQCMPBhwGtVqr0wnUsKtSiRhznNGkNVCAOINaXiQBFrdKqpjQCWootiCWibVo+HCl1l4kENoXg0Uk24LXzJI4RWDR+xn5wOX//HH5el8Ki26hs1w3LhS6nwvKT8dwmgu/zvL4DQHMykdjAkm5eXnZ+dmeNLeodWtJst2jNhIPKSjMzafzswdzic7lUicnJY8MapMsyDIyiPi48gewWf74hEWN9pToSfchmouUljzwsCvNiGDrpIfA58zhSkssZcoCuI2fYeuxe0a2uCQXL55/YMeOe+cvlosvtRh5z7Gln4fegUUJQ+Sz8s+vyhcmaPd9MlQ+997PP35wLjTsk33a8bj9lZPYskO+L7ZU2PedsG/DxfaWHDIZzpFIKn9FyH2acBj+nQ1/Wp/k0ot030pLEf2JO3udLSI9e/D9MMMd+j2b8STomh8KeyuwekYYsxiAkUGOUCyOr5HEynDigxfIolAnofM+ihc6aPssa2tA3QO51KGW14A6LRKTMVXERhHr4TNHtDz8UkvD2gHcFhYj6fTTHKogWgFJHZ6YTMlfCihgxwYOe3BOrg7/8zf8WegoqSqSPyAl8kv+rK18/fXq7fx5zZMLQklEv3JOdF1j2Lry2Dq7w/eV7Hvb2Lrz2feCm+TbHhyoNFEPbcB8PinZ7RoZLHKPdB90P+rmje7N8HbB/bH7R3fYLTmJ201zcY8MqnliHRkk1qZprGcVxEfD3jQJNwFsiSXh5kPxSbg3yyfjknD3BT6QkIQbD9qzh63nFeojz9ZTGFvfq+w7i62mmWj452FvNKC5JWnUPEbUmQkRnXYIj3uCkKNRE1WEUvmbboGHVo5gdaP8/POX5edbZpWmy89exn++RNZsWfvcoIaFQmcYczmM0ZON2bIJjIsZjNfC9y4wB6qTalFtoFSrApqBeYnX67SAC+naIi1nhJcq7UjtMu2j2o+1UjrRagXMAwryFoxGBjG5KXyj4X/UeYFWUoAfCtS95O6GgeTC1tBY/sF9+67X7ttHCAAM5hbZb5ibj8HniDJXmJk3YAZlmSAWr0gHjBDwgrggGn8kh9sRsvZC6N9CZyDID16vja55JFuzn/U7Fb4fgn51qH8gH1gGVnGcQYMFLdbqDQSkCkAcFQjNqdT3AGhj/KFQKkjAEv3+hFh0SywDjL9UTZfqwTQ531QuKfRv8lXDT/gV2UGmHeay8T8P7ZNHL5YN+9h+9Iqd9XL2HSgA/wD73obtjyr8O/+i0IfGd6FmaFCgRapNNGeLRPLoXUgvIVKQn5xjzhkVtJnTslXZo4KCaosZm1VmlWghIiB+Fct8NzxSvTcxF3IsD4PNgAsw9XdlRRhQayoVwWmQqIcjCNRl2TS7uxnIKP/i/Pc2NDvd7K7352Pxk7TTqZ9g6flj9wi67UcaXj6yXafaeYx7/s6vVn7wwYpv1n+IhRMn5IZPjz4e6vbcocPPcmcfi63xQbbG1mw/ABP5fbAfyTQjojE5WYesDpWABAdJTTHqsG5UMAljm15U6J3fX1nkv5mwQ8sPc0qC0taYWcmUQn0crIFzt3r1s0NbVvn3+ldvPvT5K63wRuz8CZ+Uez7xImnZ8MalU/i03Ocn+Rs5UqOW1lbZDrTHS2uBA4+i3MqoJkTr9vBZ2f+dQTVNitiUJ5VZojzJ0siTTIi77Xec/siROwovyalrVpw4+sDxlavl1EuFdxx5BKcDH3pG/v6cfGYq8KExWHXik6+vffiw/OcY4ETTcPdnsA13jNEccQ3IcYVUjkOTAY+1yBnQc1gn5HCYMwEHYQwIFUT5D8M51qZNpI0l2kZN25j1Wl7VpM1yOKtbhD+Az41hfK4CmlpBYwJc5Fw5zQQjE07gHzz7KJX32bMTlGdr2LM4z5yD2+YVaPi4Z0+xGuz02YkJz7rh2T7uFJ0z7lnGa9mzCq+tSFOeNcGzGpNVYbSRZ1mNIsaX5yp8+ed4vvx5fXqqIk/F+DLwTrZG0FPcwIcHB1omCVqUkWFx2O0galoEC63eajCqvLTQj0nLmXitysSl1gQXue9yc26OKiZML6H8UzHnxVXMbcynxMVlYKbBG5zksNA7OCVLNS2gAKhC5s757bXnPnhz6anmnNP3jG+ASmhddMblFUIXZ6+afywp9Z556xZ8L4cBDVw0wfKaBfNunyy/NuZe+cptbTd7cPFHl7+6+Le3L7N1nQAY36bU3ES9A81SQXl3mL0AFmuuRsgvsObm5ObUBHNzDcTgrgkakDqZ0Fz3jlhlyEhNw8RSELF0Brlexaqi3CFJaThadzeapZvGZvG3ff/hmbWiWP/5v1588+Mdx+XfFkzfvjxwrO/Ge15/8e59eOdLn42YPVh+TzgBz90Xqk29wrUeM3Pv/Q1vFBTvWbv5wCbtNnZOS+XBsEetkBEFAlkGXtLqJBUyGnUqYjbN5dfwXGt1T/VQkAZ4g0GbLCnFp6i/fwI/ZUxKjdOwsx0GyUYk3rJyjMLYqO/Bi2U450W5Z+esC+6A3IxvFZqRccVi38Rdu379CfmDZ3/liyhMZwKuDGQ5VjNAa8uU3IbUDGS1Un1W8GSmZqQDBPkUI3GkIwco4w5HLNN+0yy1SkmN3IjndxngQRpnt1ERBeTWcsZF76noO+bspfu3bD8k/7QHt6mb0Ub+7Ysv5V9++UF+jruG3xu0Y+GE9j/tPvLCWd6mkl9eevDExI/kH7H683M4qR/utmKzQuMejejhuWh4wJetoVl2Cc87PXqzRsxrpvdkejJrgh6PTaJpdpELawlNtEuo4bomKDki/LAoLq/2zbEiO96oWl6aWJCRWRbsGfSNmzb1QmBSze973/1w77wpa76+uONvHeuKtk6qm3fh+zC6tGr2gN7jRo85evfUXVpOv27M6n2Dxg7u2mlgj8GD144dP3R4pPbnTr4a9iETdQh4XOnpBpUqKxXZ7d6s9JTUlJrgBJ5iBeHNZk0q0pzFasYhi/zD42ofWhqz57D0G4DEuUyPYNk5EC4VvbQ0FA+kdd6cOYt37+zaf6kzY82pR54chqvx9G4DZR/JlH+TP1mHF1WPdaV6u40NjN9Ykd4vxd/D6x25Zfg5/CFuI4qb7vxVPiH/yOZ9KlKD24VaBlxmlUqNXGqXO8lss/E1QZtJZ1TbgT9W3azANTbftK51pOJ2fEVrGGPUDcWsr6+hcsbdgAtlwqsgi5phDu0C6XajUXQYaMiPO8lu7Bu024lKZekbVBFtjBYUNW46rkywtShEzeOzYJ/F6knC1kyOeDSYL/vp80++w2/++LGcv3mVEPqnsHzLphUi5xWWcP+UV8ob8BJ8O/eDvLnBic04Xb4mf85/IP8uf4GTgSNRODGaz857q0AGvQDXak1mgx7IlBEJJiFDIDoiCCoVobWKUKNNKNH4EpfBlnqFc+tqBkwfP2LZqZP3yc/hX/GQGeMnz99w8lmuzybKO64BfxxPa7Ogv9gcZsP3fqzGQ5dAjtNlQDaT0WiTXDxNUIoNvM2AAkZLN4Q0LqNdA/sHgn5c/k8/s7clVL+j3mRK+kIgQdhL4PxT0Z7zDypt5Uvze5PHZPUcN6A1fuj8VU2RKq1CDj9NXrw2Lle3SmWqWLnv+l1c++S7s4YsDT1H57cP9nkJwCgNlQeSUzkOOzUakG3TM4xiklgTdNqSHBpsZOhEczo3QShm+oukeU+sdJyT62Wv5n2np8yr21bvLXCntm85dKRAJj/XcVq6XCt8Fup3512PHObmNLzRs4tquW3EuOeb5cgpMKdhALMymJOB1gTkiSQKABRBIkaTTjBKvFIsvUnGXhCYQLvBVFzK9Tv4srefPy5POId77lxffLKEVJ+Su3zKt2oY9STuc2Tt9Eju8AvyHt4Le9MSZPukFGRX5WdlWVyUNSNVsY93uV3uvsHmGWex5omgq7mruSkHaMCZSDE71CjiV7KbwKbFjqwl7XCEgJWXSgJ1UeUV04LI228kFhcWfHHo5ItbD6SE0QjuIzn00Ys/X5cvz5y+cMfcjpRkzNtz/MxgPOb2C8scnHbz7ZPrklRY2rQufcGo0dPMK9Oe29JnQnJaVrsRXUYx6lHeJS1zxEZF/orVgkf92Lod8P0wwJfVdjY49LRInseAHKmOmmCq0WJXAxqqHXG1nRPSaJkTDoTdBPzP0pZWfABO7QeG825+SbrX1rvDnAnyhk7P5DarWeFwTSkh75AToRG9OsNGz1rDXe4WOib/ey++9GeNS79LZ2a5c9F+wMUBfB+Q3NNQccDtBky0UqeFDFqaz2jSJBMgyiKJZqOuKkgkbUq9johAQWUkC72nzHBjJkvwA359fsrBTjxf/8s7mz5f+txDW+Q/W983aNkGjv9Bfrd9dZsquZb88Du2b5V/Pfbm9/I8+YVuPd9m8HpM3sfnAb3NQh0DHpKcadUl67JzOMkiZQJS8pLTmW70etPTgdOlm4wKn1CICTUuR45wYx1VWlo+kjleVPY/ksvJErlF5B7b9VDbu/ZULhjXPqsItr5k8pJzJwfe+dn2WU+2mzWHPCd//X6/KX1bmHPaDOlUOK0P3e5Mf2FGyxkP1j2GK/dW95i9hMFzGK0vA/tsguPbMuB20vAMvVUEOUNrU9tgj43E3SirJahJFJwRS0czGsNkT8NSSS7lHECoy/gy+foXP4URLsQOrmjvjgGdzi0OPvUGzr/7AP7uZ/kX7KZ1m3D2JpFf+rc7fnvjvZflsc+hGE1OgTnReAqXUaXSaonD4XJbgSpbHRrEpAXjjWm3WJrFGI55lADGyAUw3tpvB0Ux7g35zsUVNc7ZFXXzyAkFr0ID1mpWioZ5ddxlZfxI/VFkQ0UBl1qkPMvuMJJ0wpkEs2SMY1hVcRsXY1SsqAUFQWkJB3TGwnf667vPPjiNjfds6N7smdJWXGv5X/LV9z/m7g6Nlf/+3jcrsL96rnxN0RFoLZzdfD/gBRmocyDLpE7neYvgBtqmV/OeTH2KI6VvUOcwpVtEYJ5EtPOM7EbL+9ykMhHMSQJsp6WJLFRsssMiqLzEMD/TjbP43dd/vPeb39551r5wLS45sPPeMw8O7bsTt+dK5R/l9/TyJHy3FnQA3Re4wLMu5fOH5VEmrtMLH8r//OPCx/LHoSf1FGatQG7exNeADjAm0BZznMZssdhtNqsJEY3ocJqNvGmAaZyJjEQzEFcA6jDnRliPQAZEVmLiQSuXaoI6kx0nR8ucOyupnRD+uKoS1V8QAOktXDSTPBwHK00h6+XmyDufwe+ebz3Cn56aWd59yOKBh3HO0/JsXH/+x9AkUolrp8w0rnRP3yd/wCWHuja8B/MeDPCeJbQBXAMZBWk0dq3FSETQzYnL7XDwJiOy6+xwDHQOTTyg/UVNrQXZtMo2MDeRAruF8hnW7efqDy05+Mb3915749Cie++dze04wa0JLf71HU6egndy7/zKrQotfGibwL+i4F4p4N5uoG/NUL9AgRWl5XrUIJXkepJEvT4tN4nPL8jLc2pIljOrJkjv5TiryelI1ZgYv4tKnU0qG1lYRpbKiJxCNabccoclUrtIqR5WGsEN9kBb7OfODOvetedto9P3nT28adwqF+9aPXbjkTP700ff1rNrz6EH8XN7nnjz/PPfJ63JkM999R/54+3zF2zDGX9+iTt61iR9/fK5t87sbmjUqRdFdWo0+XPQk5/gqE5NFeU3622WiAG70RbAzh9rMzehjV1p8249kCnUpA3jX1R3p/wrzn7ggjatXcmRy4043Z3p+YruXmFT9HzoHwt2V8KzbD/YswuVZ5srz+bDswX5zZP00WdB5qVz6AmyQjJoQC3RqEAFas7lceY8Z6ZG4zSTYp+UXRMsSgLFDUkmKUN6THpWEtREKpKK9DZbAcjlWJ/eN6hvWlQQzkFlQUHijtLdZDVkcMyzkmr9nsgXEufHwdRlGrKBe+bypWcm//OnX/9+4rNpMsaHzp7Z+WDdjlVrt21at34bfn10/5OD5u49zufX3VNVUTP0w9de/+xu3A578CI8Y93C2atDL23bvX/Lll27ufvK22zpQ+lVS1jzPFhzAfLDiu1uk1ScZdcWZmTkY6zNkviSUoueltJJDuKMQtBZ8wst8FfIzS3qG8zFtEzZjTUU/fG1XRN91m2cSCsolsPSoqe/sTS1pTQnS/GzsVj9jLrB7/l5o1d/s0t+0+VqVTzKNbnP8Ikud78utx0Y8bL86Z1Xjl+8KowOr5r7+vfcnx/JW5/FuuLhw71tijeWjR3sGz7c16H7ftz6JBl9Yu7uevkD+WN8Wb68aCW95QKKXCUMAR5REUgGcd2sJzqdXm93GLRms95I9BYkNdrxqizxNZMjFZNxTGWVlHswNcCaH91+bKuhyaU5BaUO+YFn5JTX8FycUrxAGJJfvMLpLfSGPonciu3Hb9UMorgvL2JzuQI4ugLRqhfFoRXReyChitrh6O/NkroXpvkt6UlKEdhJerk+yWUkjSeJniOgh91ZXsVKxo/ywt/xx4AX0lqf/QOFqRZtdnamSxQzLSSvmSPdmA5U24i8Ji+nJl4vUhsdycSO7I1Ve/2KmgI4bKlMYE+WSJoGuzdSR41ESVG5F/vMplyPaDbFVIY8fskSf9vDO1/28e65k3ccmbmYZN87PvT0uEPd+hzsy7e6a/A3S/+Uf8Pauruw5voPbza8jO/A2ifPyP+R1zy8H4+WD+57hNLXMljfVr4dao5mBtLMBs7AA7NSq/nmtvx8Z25ystNqszl5Z4uiXDeriJXrSPNS/NUE01IsiLMatSL7vdbI2SMeaHAYE4pgmeMLMcQ+UnuQx2KOQ1tOcmKPCIIeTehuilaSaIupOmApJxNCH8j//mFeakVmh56LF5ZlCVwG1s9YMC/f91OgY0FpecXY0aWZJL3hU1yDJ31l2G295/Qd8g/dOZK8S95w4Su9/LX8vu6QvlPfcYad923Ajg5sPyfA+ukdmAEkDJDsrQbQo4waXuNOkswjgxKPHaOCwJatqOo1f/yiogVmqRzBbrbMVKywxq63ONWr7ym1Zd+79G6sumwt3peOR+OyaGVZ+U15X6Y8lu/XeLtFfVEozoHsbEBJyB9IskfnlJwiWUDUM2EXEEXsQCmNJf1umFQpmwWrmGyNz/enOn8p9PVvP7zywhvrd+/etmXLwU0wqb0pOP1nUIzd8rfyl3/IXyTL48nL77391gdv/eNdwJFZ7H50CMgEFYFUE3E4NWq1k4BAYEUjg1aNVSM6LaJ+ZFDko0VCKptWUMb0Vripu0u52cuVfPw5zvzt2HedHsjdN/HeRw4/2qrFBZxix/rf/8QtjpxoP3fpS+dfPq+R29PatACXMoBLIeoZMDrUQGVQRkaOmjRvwUeqtPEm3uTVefOVb94UVrXS1NQDNdEaKDBVgpQmeuOkcYqyQUWCUqYMkcEthk7dc/y2Msz//Pj3Gc+alt1xcEf5uM217RaMbPXltxNOlSzc033Vqnn55VlWd828E7OxGac9uMcwZPKlj6Yt6eq16DPaje+353Ca44GCVFYn+3mAa1vmYwGylkZFsKTklNLp6SUcj1nyWACxmqgsTYtTV1bGnSRs9hBvKbues+Pl3FF8WrZcIIv4B2WLvPXN0GfsrhpjNcikSaxubCBg4FQqgefVWrWWFo2lADMGBU7g1BoNrglqjOrkmwwZKx2LmeOGMiSfFDrCFRyQ59QTMzkBsvzjTzaMFP6l+Fv/Ef6e/054DeWjHoGsZg5HjtuMkIG4SUGhOb+ZPR/+ZmozU0cGM7EWFq213sD8zP4bs/pSKtGoUQN1ECXqHm0pjdVT8jEiKmG+NruqqnV666zAgBVr0+2rf/p8S2pGwNY8N6MV/GrIFF+ahfuKr94ht90xbprxXtvhk3dg6/gR+3ZO0C7B3z48sE9z+GX3O+vmya/U4q8VmXQhs08tR2qUFTCrBIIEWomE7xdUqag7WdXFyqL4i1MQxa2eUuwnHr6ffO35r0OO/0PZdwBGUW1/z526bdrOzvZNdrPpgSRkUyCULL1DQnVpCb0jHSlKFwUEBERAka5UBV8UERWwICKoD58NG8/efXYfZIfv3ju7m02Cvu9vJNlAsnPOvfe0e875HWB7/ivyG7IuSpNrW5AvRvU+HyJbi9CzoZylEKPDxbJgMdIGh8MpShQN3x5V3UhOJtVvNlmMkiwYTYLoMIkOh2iiKI/HVh3x0LFSJdxLh13cWL9io7GeMm54BxLBwEja2hYwWSAzC2QB3fbiazLaSs+GWuto2Ssfj9eq24LL1lytsC34Z4+HJoza12fWhKsbT4KUB8Ab2oNa1ZitXc8C+UTgxiJgv2Oa9h38snDM+DlTN87/VhuB+LJpg2g38y/oG1SGs628YDByJotIywxDEEZBplW70cCZBItoMoi81cAbeMqqI+a2ujkfsSY/qOoybBSHrq+YrIxM9InMKKMJ2p3/fFkz7cEu4I7mXbUVXcH0y9q+I+BB8NykDzStFHi+eW3j0fWn5s04ueEJYDg88MWonrceCOVjOpTHHEhnlslIKoo1YDVmud0eowfGGSTjthqpQFpNJMA4BEaA7gyjxMc/Si/i8BcXyySl5uNmnUnLikXejS7+XCCEh7kHSgJ4OjRLpd7Vzj+n99bVeysqu3fY07bbfXv6P7EtepasWL+ICtse6TX0rfepg3XjH1i9bBX1RN3QjauAh9p73fXClYmbdjwduhvPh76FHg3lvBnRN5yVHvQQRDOhWdBmMBiDxub5qje1mSEo0tmp2ZURZ6pdECsjgicpv/o3bIAk4tkEzfos+mBjBsmTLdqH+x78+LPoZ2Tq9pUgOLbzLYMVMvvWgXPHHWjRvkNvujzab/vCM/vI6uvvffbOmjV7lkf61IyZNOTIP8l/on85cICchfZlGq5TGAKtYUU4QNtMCBHHbaM8XgdZHXHQooxNNSqwEKwwfq6IG6DGUxiRGQqm6eTpk6/rAZMc5LhWnZ69+/beBzqdPv3wgVc/O32k6/h8em2x9taWvQV55Pprp0jnoF/fu/JTViaiaV2MJi/U3X4r5yIIr5fnKF8KjSZCQjXrpk2ESewXMdGJockJbz6ZpEAMsgfdkDj0GdY2PZEH/52a0/Ifq848AVzdwuVt5xRMrrnnSC2ZM7Ty2CVQBrKlR9TN2rWZtxY/ej/449opfIb3wL0fC8+wj2gd9sk87xM4h+BISZVtNlN1xGYTRMoHTYpPgBblXGyiV4MLav0eNlTUjtKH/uDyvPgAanRQ99RtWz+5Z85992zYePr0iHVdPv2x14YfXtPe0r5P673q9U0ffjUkWsl01rhQBvRu3n5J+/LJaujTpMC4qITeQmTDuGho2Aq9ymYZPqORI1NbZLDFJQ4ZWaDUSEFaZYTkWqTSBQ74QdhUiwdacDuRg4JEKUZywseQHclxYKw4zVEKzQJnV9HVE7r3V4O48wzXpcaEsLgdcMR9kHxA5h1YUhxc1C1j0Z8/dJvQp42vw9Y5wwdWjxgEAqXV705btWXqswsXb+zW/h97g1PpvpV9ug+bXbTxC+0n7eOUYErPsQuKisDudYOqx86YH1nbaVVVl+Kyp9PwGRkCeZ4Gz0gzFCmkZZlUQfQRhKhm0fnNTT5rLpEhZZA8lZGRm+uvjuQqgmC1WmoiVjqR+UuuH26c9VOK25FlaJcC/sRkJgFwAjaNiNcyOx6zmT4kVL17d+fFo1trn2u/Nj9R8P17//5x4JOPHV3W4+Ae0C/9SJH2+W//1X4DU6sWj+iRKfmLerV5663Aka2njo7cMCozs92IbjNuB0r3/i0njXrp2/OQrzGQrwGQr2yiWzg1jVFsottN2Bg6JzdNJB2K4nDIlVAus7NJMgMPhyftjThqxA7U41AS00v+jiMosnSXb377Q/v1L9k5vHP+ewtLe5w79ZeMzFqYGdTvFU24PnYLESDSobbPczjThBTRlB5EeCjmdMHJZGSyihsVtznSTWKKg+EJN59WHeGtemZObzS/yRTo2CHksnANNIXqUfS7OcgJDnRSQVk7AAIUdWT33En+8nBOC9si0LrucVC6SCnKcec3y5w0d9+w2c26ds2cC43V2z8wW86NKRyQma+9HU29917y3yA3P9NdUD763NBZZ85MGHfdTHbTeYKKnn6cbg9fBYkBYafLDf1CK0+QAseibjQ3k55hsvvsSNKsEc7lgrzQEuUTJejwSWo8hfZ3fFEhBfnIiDeOUiBrCmZNBPp2QdZKyQlTP3i514aWEwId2vTKmH8wev2RBWrLYJv2aRNabug1an56y1Y9wGYtSh2rGXZraNQIqCSmrlkDNoJQSeao0K3DauZOPXz4Uz02w/VqnaHfkIo0v+TxMCpBmBjKH7A6ayKS1UoZjRbkH1O+msZViI3ULCpCRKFZKboKR3uBbkUoPTLC1/PjtJ9+1sDkLy6BPtq5+Ysr5fmvfn3t/Mb9+7aAlru2kbwW1T4hBwATGPjwfeWLp94Fv9eef/rUWW3cS0jW0V1XfxibpEF7oMqsA7prKSwdTPe7KyN+P6ST12MSo0TZkvMHifxufQ6BxrldIqM0pDLxs491sQhK0AGi+2s3Pv8hCi1A+wdu166cfbjHjl2btyzZ0a11wayxH1wEC069CdKBHZIqmpgtnKHy0Yde+dc9i+dNMxvudDwZs6fVuB6sQ9gvKIoJ+mEuo9FuMnl9pGywqHBNXbKqmhyUyarn71vFytvqR13Wp5DgscbDFIMyumBycKiLCsM6+ulqZZOwfcJzE7YJmxTQqua5UaAl1aND+9SWvmV1Halnl/laprbvAKRvv8W2a9WNn+guzLuETLQKe0hCkhA0kFURLSbAmThoAYykZBKRMsHzZnW/61xR/ThKPTDJQFDhHCpVZBAYA91FW6h9P1Z7u4cTrIW+PVhJPVrXcYyXarsZ+MFDYzzav9E9CNy/++l2UBv0CCtGQJICDW2U1xtw0I6MzBR0+XEikmInYhceT0TMokzirGr9NNRWDcZeh/7+hiMRuvzlxUbsL/7uUgP/ReIuYxnOBfYh/NDidAuLQlYW4bDbAwbC0DzfY0XnT4l4PGaH15wLXT6zyqRXRhgp7vnFfYEGfCAzY9WtP07lZCEwlhTgCCLLmk+BpKuFZaWzn7nrz+9+/2X6vnbs8EePbV0V5nay6X3Xr3xqfkcYS6/asXPd6q1714KRPwHDnn7az9pX2g/aN737rNrdPX3gELvd2G7yjnNgw5WXL7zzxpuvxu6wW+IcbBd8fzdHG0x1wjMlexMN6lnprfj8LIPnugz6vQpRFS7gJUlE6JPQh+Clyshj/Mf8jzwl8q/DF5SZ4nkYbZtQ4gxYocOm/mWFbexyMgdgocTag0V48FIOoMs03+ffEzc+A5e1zDX3k4ujS0EQvAdEhCkOstY++sAK7TCkawuqEcb5s/7hQjNDSBxNS4Sk2lkGEsZ+zP7IUiL7OnwBCWNZmwUGShHo+pjxXeJfl/5CKwpDoDKUWYOuONwK5JDjjQpsAe+tuy+6lFy8eZ2WCT747vu6qxok6JEVex5Zq/2mXdNuaO8SDWt3d+HvT8Iz1AGv8Rn8/Qy4xnNxzXCmLqPw5zvj2t5wONXAMCxFoqZYi8XIUrwAaJozInQsjiJYq943hhvD5VDjaejI86WCFHIvPTAGorZ9dee1Q9e///dv9IboB2T6dRiIRb8kXdithc9F93Tj8Rq2CadYjEYTQ4tWgrDZYPir2uGqWc2iyStCA6HisouK0F88swLAPcL5bjR0tbRMgc9+jWK0T7dpV9jt186XiPb88z+S/5o5q64rdeLBrteXM59GFx+8e+cmcun1c1jOesZy7m4iC2qLrDQYkCgiNL4WkcrOcaRA30fiZSv0gUzQQoleKiM5A2+NVdcmhyaJegw9Ge9D45J0dNykpHyiwo8ecPnUtF1hmkYjs2sXLPjkn2vfn3P2gbV3zCk7cMucaST9p3a1U882Fbev2r9/Ffn8NSBt0H478PZXJ9/QXujc56yeHxoM93UY2lfQrcE+Z6J9ljmog9uRCuEKy8AZluRuzjDPw09GYzcnIeMumqT3yETvgX7nxr/+5+/gHgX2AHxONv6djjdOEr8Sai2QmUzw1I0dtYIMzEn5Jv3nhyd+fhI8AZ/gO3uLfmf/Z60kEKak7BeA/HxHr4ZnNI24JVxAmVwOWbZZTX6rP5juRVG795iXtFBeL6E6baqtOqJSVpydoGmoOiqKChI1HDhzGJ/4ltgpdOPGxIdKwfg3HiahmrUADpXgDtpYamyfZYGxvvbNm7WprJn10nPaFapMO7p0Vcsnj223VbabGQqNm/bygqlF0VxUp689l+44/szVw89BnnE/CnvQmkl1xjzPJW4jfsNZNhYuUpg1AiqRZUP8xvaOcBIbwzVO1myHzockigxrZl1ugpd4P1R8hlQDyTN2oiZSYK+2k6J9vf0x+2n7x/Yf7TfsnIOy2w08D/1dSeJpA4yrUa1XIVPDTGfglyXMG8xVBmHZKrgdcAY2GQXJWomIdbE0nLwMT7U1gMoTyYCfgCGuX4lleAIqaK2CzmP3tdp5n/a49l/tc9IJ+i8+kLFj/K79JnCYHKll3n1ve20tmAT6k8e14+1nLP/063vxWe0L+Z2AdVLpTftA9Brt4Uk12gCemfoabXCTGu1jN76jruD3aK73e934D30cniE39KV7hXNY1eH30x6CVnmCzkh3pNZEHA5aVdkaeHrMUk3ErND+mghtrW8xb+LbJUp4ka9EmQAbS3G0A1YlIOugzXo7AH384u5/P+GzV8y6rcSr+MtbZflLwbe5h1/bM3dIi1ZDpoG7j35An9QGaI9qJ5aZVnDtdwKVfC965tLxKXdqNtQnT3SFa4Dot0Ivr3c4EzidMvRBFUZCWTnG63OYJXNNBEAfizBCX5o3WgWCwp0w9f5zg7K1+qJNOZZhre/dA3HCyQ+GHX7t4m7te+3E7t2gO/ho7pDRk4dMg6r8zKXHjn5Azo+uQq/JcF2HGKWEnjvE8mpH2lTkoV02EHaD3eG00tWRJVZAWIEFiahZMKGWGXO8aSdZRGc0lFGk6W8il6pMXWwsjGSgkRBGke9xANK0A8vghZgMDo7JoA3KoNvmICz1Mhjv+2EfhD9/HucWuxGX4D9AvaZgvba/VlKAIUmv2eAZfhK//5vo5w2o3EV/fxX+guhItUgNZBzVHBbiXEFx2GWGO8waGZI0WniOotCEgOoIaSU88SKqioaNMzhDEOuyDMikRdtwmrSf1jZog8FBpvP1ofT+a6e0wU175eA5QnxtxvZeJbqGM1jCaLXSUAYIu8MoV6PW+xQY3CDNUB1hKNpaXS8DCeWQ1+AY6VXsAdRKJweKaGTa0ItSevONL6K/UFuiOaDDz8SNM/v2aW+B0L4Hwd0nLjOdH9TGXTwzf5aWPZ1o2sMX15noe6QzId2MNgH3awqQ7u7hdJWQeBsUAIJCY6tIjrQ7eAlG85SNMGDSrRz5FDDotTY4SZvUYZV0TRHCLVBovoa1TAlwAYoluQBNPLarbsuuecMnpnYkhz2svdciEOlOerZEL4Ot2gQyfzbo/ivQtmh3/qK9Mqdxn17s/MM1h1HusnBXl9edSrEEI6emQtrtdo/bhNaXYNxUwO9ivRRLAVkgBEnwC5TIoEbwmkiqACqEHwVSEFTRSHkYLB9FuJVHb8BFV0iJRs6k9FfiE76QQVUUAbkAUKj3Dcb60NHHl3/QSaJQvSwlApm0u3r/cRKUt8175ejmnOpOuzpV52w++kp2e9D65B/SILKatUVXka+3HQne1e4YP0oih0b3S6PGg2Va9rD20UJyPqNGd+tnuiOUgelMBK7CHeGeabw11ely8alUBk0ZM6iMnNw0gRd4aK+EaoFcLzwmnBY+Fm4IjCAQXtEJHJTT6fWq1REvTbBQT9Bv0FdpKm7Dm7bfYxVBtGq8rbo1T88qs+IKNajIShKVIjBuS49NPEfpJAGQU1/Vfh+4fx7gth07c6Fr19pHty6541jRY12A4fyb0Q13bX709u9se57urf1n9ZwFMzcvmDh25tylbY8eeH7n3J0B+8FF808hfLBYjyDBE53CmTxJAoS3DwyCuNYCFljARAuwsIAyLmfAHAaMY4C+ncOHD9f7FIc3KiYOYRQQgI5mcRnYc8RKSh8dkqJ/Mp3rdi3bQM+8doqa0u/I9S1JeupgXE8ZvrvxA9Q7UE8JWE/V1UpOgktoHqDrQUirQlSGc82CxcpyHG8hrVbFoqg21JjjN1MmxiyQMgn1AUkq8EdilqRVbEppck1g4rShS2a5CPnf8ASjNksBBOXggdPDH+p+/YL2bk63MhD9SBuYPi54GpqMf4ydChZq/dr0z4kGyFWiI7qTADc0aKOH4/uhFmEnkGWDTVHsBlWxyqA6IlOsuTrCKvUGWQYxXDI9gdnQAkNphkZ5r3ZnXtGojSvKvUpG217lpe625DtP0/uhnZ2jPbbKtJXrtRd4XwdXYVTyt72fecTN+i33JPdbUjTB0ZwBanGsOJv2WwZi/ZbU5Ojvp6m76P3Xh6Kmy8b9lo1jtMY9jyj/hmwNXqfu4WzBLFMST1lEyQIjUL9QKJAU0iakQAtmMyFaKCRNhFJfUY+UR3X9Dupw2YyO9VDUjizD8+pRr7LUblV+1YhumeWlrXpGv3gH7AbDL0W/6zPldlumf0NrW8ktG6h7oj7y0+v/3bqkHNIZ672EOnvwTfsWl0CbdwLbvKKwy2DW0dzMCAWPocy4jZS2goY2L0lV48XTbR59orbu9tOk6fSu6Im4xbs+FD+jGr5lC/gMNLHIbuAIQRA50aqYKehnmDnJKsBItiKUfDMSc+Pqs12okAEKHzXrkfvavXbxuW/m/fbcc+CjDPXU42Rx9OqXLci3Y7mZCHzWLMxPKOzkaMgKYTATZsQPoOBzqJqkLthQYxMeShjwkBzZA9zof8hKV/ok+hOPkwfBNUO2RCTahVOMLMszpEgQJp7kJdkMfQX4LJKpSXYWkp8VurnHgP6ablfn3AMA+n9dzG+IPfp61+irCYyE5TFfoW04lbBaTQYYTNB2B4FcBchszH2DXoLB2uQGNCn/hDLQMRezJFDvXQoroGNw4wsNhgOkAJ7Yt2/qnH0PUuLFp09chu5bXYf5t2rZswnc1zsR0jIa935boV8ZDvuhz0TbOVGkFTskyMkJNRGOo21Q9MSaiIKcllCihaRhfUXsVjZP73mFXnogiKhB31IdtRuf/Xa43e/X92hPde69/wHgOKz7K9Ez55/8WbPdrv2OhJZo4EuZoHTBE81JEm3GF1ScWI2IgbRI9f5T0yOHFyR0E6fp9M08puiFeocJxGN1uOsPhscZjMAoqDbS4xFsgteHYGAKZIqwSBa/heIZAINEEYAKUA1uBdDmnwY/AspCgXB6TjcAZIvshLupFqphlSLUSnWXeky9qv5HZS2UqsqKwWCxQHfUQjfsX5sR32n0emaDcDGRZMa49fVVCH5ZIgKJQLsMfAkOmXbuH78j40Cnrx4mndrn2n/3/Nx3Z8v9Y/ccMZMj7/3km+Uz2h/dE+2rHdW21J5pv2H1Vz+jdR+E7nYh71bCSwwOF7h4FrqxFoPBqBBGwpdi4SC7ltMW0kJZLEaTZK+JSLSJMlopT31WoeIv/Fk5PrQEt2RRQRwRhdzoxpSKdWnBs3z/+ecef9G8bffubeZzjz9z/sikW6dOeuc98qB2SNsGOoBQdCfcr6OgGBRrB7RHgB0YtT+0b6L/0s9NMTw3edhfUInh4WILACaeIATaajIZaaPdASyypTrSF+H5VMi3yqflH2XGQskywXE2eLAoU8K41N8hNojt6nUM0JsHkeUJAsVmh68C/mKwYcep374Cn5z+Qdvo3boBOLX/aG+QA90X76s9e+0UWRE9S126bTF4G+rwJXCt78J3tp0w7WtRXoT5COq8DKJfWPWKapBlVUIU1cysoMVCVUZcKXpCyuKyuKwej7dfxGM1VkasyS1wMeDAhn1UOJRIuoCmYpfUqO63tKy0TGU5geLaAWrLivt23rfmvt1rf/no8rUffv96yhevrP7xtRUPbB6QQ+dfAL9fOH32/PMvnCLf0a5r1+DCR+GW9AEs6Phkliew2+3ydrr1+IYld2O9chLuRTnuj3MSAVTPwkopaCKkW5IEm0kwpQVZt9PtrIq43YIouiojoihIlRFBbazukjzR2CnC/OjeporcTSTtiu6UBgMuEHtFrjp/fvbkpUvfP6t5aoFt9fR567U/oa2cOm4+Xb52+YhFNk5ePmnTfrq8rufA4WP7g+e1M92G9OuF6r8g7aj+C+OcIE8ZoSdVRhiRUhvgnAAV7T8q66qly9fVDYC/gvfSDmOqufj3FaJnOJ3mgcRLisnMWK0Gg2JWbCrOJIpW2mK0VEaMKkqV3DymSsLpRb6YCXAIdjsWWaHbEKpCezF9aBhcB2V7677YO6/PtDxy+kbqiPabNn9t9AoOrDKXgIugpm4A8h1WwnPWBZ+7bljfIXygVyGtAWJ2ONvt8wRojrAGAtAWsh67w+H1mE0mhvVAD9DN+WiOFv1ABHoVnLVABKLoMEmih0W3yfFACt+I1MdQySVp8elVcn0UlQ+yYBiVD6iQIx5GVYBYGAUdXpl0pZTx0ZOgr9rmt8c3tx+Sv70wEt78+Ltds0HlyailLBVcpR2m6HWyxlEFZv44oUYG57WW1pHjftROTcqL7iIZo5PW/IjX1ZD3DLoP9P5mhtv7LZIXho0WL5UO46h0Kj0r289beLgfPO8iwlBf1yC1PV19Aypt6IKoqstlhVIoESjDBuP6+A1oE7ivv4qddAXt13GRcSE6m5y+188yOeSlKy12urcuB4Y3T5544Y+lSyx7nO+cPfdl9yXdlhz+3jZvVbMBlSerJ949pN+urt1td8/ftqL9pI4GUtg4cfshyCOSOxXuJ08Uh93QlvMUyzI8I4irTcBE8SK7kgSkBSXkhuPGj8YdszKlB0jo+l8G403gl5eOcJTGnqHLo8e0b6mx18+Rm9uPKay7Hz4E5UHQ85haGCd9hfocDN/9ovc5CHImICSnhU6Kka7Anx0Gf81KdAkHeZOZlGUUJlnMVigT0PWSSKgBCiB9pNWsxlrk0YHSVVvDO9MGkRE+LXpgdKV2xuYetc9/0qcbWHpReyFtWgmUTS1zxK2A107dWhx9FERFm6bnaFh4HpyYnoKwk0RXfFajVbFJJBJOzoJ7y+PF2smlwzjmSAqLsCRSo7Xl+el9500qaubKK+/eoSN5Dkrh09oN7bdp/FLjZtAbfIXzIoAYB9dBz9F0C2cwtCjaTChTg9M0pniSJixWimQFlDCGMKHtQhFtPFnTqlWDWnH9Fq/sJvkaQ5N0TckxlK7puTXaDG5ocroG0vUEpMuJ615Lwh6AJmrCs2NiLDwwVEUKAPzPxECZSN6XRocnIMcvfsBEcL22VmPQ6peCC9fPge81BSnIm/SMxp+L4z2GhXE+MBg5GiUdWaASSVnjOPYX1rtO/e2vw3WO6d4YbkcHuhK+d//EsxK50Vjuswd+VlbYCqAcM4zBSKsUh8SaSHQHJjVpKwGs5gPLqPPa3FptLlb11BH43h3gs+7G/djDsM3rAr9fyVyEMZKD8BF9wtlekbbYaIph4MFyopGBqTzhwX1hItQ+NhZVOLD2Jp14zorkkMZR34WM2/FQLhz+k90KJEYWAFOcmSWn0yt/+OSBT37+z2cPfPt53R3Acc9q8qU77wEKmVKnfapq48FWBQSuR4HXBpZqixXtW2jCl+VRfWz/PPPCP611/8hBazUCrs1UzM/QWG/qBPphfB5KwyrJMEZgMrIm1gI9XxOoiphUAzRbj8cORMVN2rdBLCZCGwbGwAOxaW/dUWhwu1Mn6rpHPwdb0a4BYjtcvCh8KRN5YZWA4RdnkA1WhaeRLjaqCbCMRm6+3ixcX58ogz5jR845U1v75Z6Nm+Gxm9ZnQDFJwJN3eehDq8EDRAPZu1lsKaLYsiqCZP7/I7YctwtIu4C8K84PdSIuR8Pguj2LfZ8OYUl/Bi8I6DGSLMAlC+OHmRs+DT+uoml8GUrGAoSsDtv1X/ixfn39Y/WlJEh0K03fAZ+L4srO4XQLXDxOhgGz3WFRq+CRA2bouHPQGUZ16xxfFeHUv76CjhVo2RPhpSuGmpIHyI8vXX73nDZeewrUXVh22+yVr5LTN+3cvo86sk4r1cRho0cMxvIwCd3fQnpQHIewkdNFiuJsDpMZ7rDD6TIpkCgTJMpk4lSDyJmrIjZEUSK+bHIl3oCkUD1BGNTxICbqzL4Hbp81444HyWP7dKKQ/tHEESNHDNZ4pCygf3YR0pUTo6s8nILoEeEy2dRkinSC4ivUlJqbU0KuxlS0r/0PWpefkkmILQs8H4ugTmoD/RAfcXu4r8PplAgDJwsCwuJPlcSqSKpUIJ2WfpRuSEyq9DF8QUkS5REd0IA7HB4P1BoeCTUT+w3TDUsM8ABLhhrDGQNtMMRQSGfc/FK3SRCJAOeg/xWLGwPJMWURQbfRbvw6/5VF/HPi5pn3bjZqy8Adhs2b5q6WzqT+VvsrtNIp2g/a1chD1ZZxM46dWv74oYlDhS1HtY+wD9wF8rgV8mglUomh4RYKD4AEBVmUXKiFMSCLkkoIcLWJ14mPCQpKCGGiTXZ4MO20D/pXUpOD2QC4qN7wKaH6qhsyC4eV8W5VzMw3B+XXHjn+2oUnH3+dfWTfPjDg1gkTppWMaDtlBjn9kzrtDU3T/qu9A5QfkHWKfvLq1Q9eX/Ps2A8xD53hIb4ek6ee4QyCohiTajabIOsytIsOOwVNODy0NmAwQF4MojlhrfTghQg1SfTGGh1ApqyHj65Yl09rQPbUXnoV3PLfd18Hx2q/WXbb5EVRcAHazneKAX3fFqjGLoCfhg0fMVy3c9iPR34X8uNlluh4HGXRSD80EE/deLzW5+dtDfJu+s8vTPz8JAOBMr0U6ZEzKdKQ6uOVBrUBJRj/6iKMRmvCKYoQYEi/PyPgFAJCZhYTTA9WRch0s7cyYjCbn7pxJmw1Wrqlm9PNRECVoXmTPWh6XHKTU6w3s2EBtR6bKiFUJ6TauFBpyO/SoZtKHKiwO4EnEywJnXwCIbYaqYnfgBG33da7qF2XUgwrs2IFc3HH8hWtV1/Slte9vG21cQ3bbQJFY3iZw/SR5Tdu6PEc9lE/jeUoNxG6l8pCL3U8a6SJBjnEe+FaVWH5XB7u7xAIKpWXoNvPsnYH4YA2XILnlk/l9VIpJqlUykN5FCiW9un2JfBs2CV7jf2MnTZSdrsnBn0MGsAeN7jwSU7Oxs8LHriY3HDFwZXSpVVHQL4XkL+e+M17Rlo9d8NmM7hDW2bevH7GZuk5ftH5Bb/dIHQA5OMbhaET9z21/Mzh6eMt1Q9FgB+fiUcgn+l0T2jvcT8osR7hy+Capl5J36Mz84t+ZnIIvTrAhBqqbYKFAg16QBvUnUH5ccH3fwTKj4vwE4PD+QaHy+1mHazoI0UykObyw2V0QWXrcjlYB/QwHSIPAyzezrqrIqzapEAgSf9ak5SwX44VCqD1iGUpyhRsrVC1JeUFa1575vX92bZ2Y0YUZKgZhcVBawk4H/ri82JyuvbalgPUWa3zO59Vm5dynY+cIn1QVTOvnNYxLiD/x3B84IH0N2MUheR52QgkSXYYZaPX54HueVWEEQHkAgCe4KH9kPmEi1xPeKjpnUzcu9RdJGxK8oDuOseNye+g5/ZSZE/+qT2xnVxcumTB7JVluj+tlSLDAv7QjNAPaD1m7IiRSGYhvUhmvcSAsI8SGBLG705RcAq+FMbtgatKesxKQmQtUGQ9Zo9ZcKpYWEN/J6g3kdPgX4rnE00EM9qb3JaQSHy2cCyIZfIbfLbmTtIlUoESWaLYieTapkYxJtHxil4xIKNM3Hu1ksIzDXQd9suxbhymx6Q/1ffpE45Uk5wUkz4Bf1aPeYrDLqPJRNDQLSM46A96oI8GlWRDh7DiLx3CoPxELfRwtV17dc/s+jl0+4/1STcoByuZIUQ+URXOzfE5ASDSg7xgUBQhSPiYgkJzpj8TXfy7JT/NNHM3q4447W5UQRSPCuqbTxxJ10J6BgAXu+kGENfP6i/RLKE4nB+aHaG/LiNTttgrCnv279cjLzi0y+337N2zadPgAVu2PbB3fcUt2ZFA8x79+vUY0JLcoU0r7wOlGw3IcRQNmqmtgaHsSW3z4cPQj+8LuoFZpa0HF2nf4JvAq4v1HkaET/Uw7vnuG84yGiyiwHMsI0mcYKFNCknaHWaTyS5ZeM7CGVXBJLJGHW8pIdAgccfXCLYSFwUHEYp+CChUSMFYTPTsog1rd9266pC25wQwb7z7xNX+wwrp8vnrHtGGfw3u0m6DOzENPAo+q5u2HfS8/8EFUKbVWG4ByTSMvkXC6bQYFNpAe32EozpiNZlNNRERuuqE2cBTBmd9BkbvpElgDCTX0IBAPA0TRAPtkJiAeOYBjMRJB5R+uOee0+BVrYScFU9A6CkZ6otNFy9uiu6IJSF0Gh9mXoU0uomu4XQDrShAslski8drgFJsMEiEBDWNpHJWAmpMmkT65lwoaVBOo0SRPog4FCslibv0IDY6XgXNa0Gu9jaQL11+7yWtXHsT/PuPa7NX/kmXg3u1W9donx/YueMY9VjdG6+NGIfOcwU8zxcxjvbEcJnH7TakQXkUhHTZYIOqEQVvGZmOVNRyRog2sTqShpD7PDaOkq3wf5wyjGcL9HmGclKlZ5KKTC6vxkBLULNj/L5E/gDhVkDLSOqWkexgXHB7qHe4xbYuz959/mP+0N69h1xg05qzLXcHW/ctWTjLCLqQI+s+Khp5R8tzjwLoOEb3opw5OWrvY+0mDct/+/d7sbyOhvztxD0KE8MtGQAUu51NS1NJL2+BW0B6g+mpTmjM7UapMmKU7AQDnUCFKWCAh+F5xkORlN7krzM3PMFd0jVSMoNF8VuNELrUbWjrrYlBMGQW4PbtO2S58OQ9J51HzUMHTBnHgj7a4/yl3mMth5VnNz15yQw+0VKgfcj7hrjxyH3CkEmHTi7X7h0/1fJALXQT6vt5nse5VRv0aTNlEiojs4lmJA4leoyMhaDtKgV9dFThaLSYKAYYrXiuSWMlhMnHA83wRW4Q7wn8DEIiYEUQyMrMop9/5Zllj93+DEKDHmXIyugLOvfJC5C26HfoD9P5YMr6iR9+uOh23demV2E9bEV0WeJ0WTkR0yUStE2hOCtXGbFajaJJhHSp/0e6EKCoSNKrXtmwcN/stRfA8bfy+/pzhbJeYLq2Af2BEcBzF27ZVHzyPF6rCkjTJVzT4SXGh0tQSaCTQ+2hNCOb0FWhi7RBMgkbY+QZXwpHmSUzVN2SxNuslEDBIJ/HSxfSIe1DcbizxITcIjlxTZ6oZkjQq8TOuJK0npf2bKveM3Tbnt1P79379Su7+nI+fxhwFS41vqb6ukYnkVsOpqyc9eGHt4yAfIxGew7XliTsxORwKcEBlmXsIiSRtPA0QDd9vKDKstUqmBja6VBEi0FSoZdLqiolmFirCihRV9T1fCTQleqtEWQizokONAPNeQg0ZihArVt4W8ldYNJDMwZsq5q29/YrMCxjwJ9gozaN7ADjnNhmgBnaerghT8dyKpCHp3AvTgpRHS7weVKgR8PYXITXiys1FRvLMDZ/qllwCTURL+Fy2dzulOqIm+JZm36A4wWbTQGzYygriRvGFNIHghg6DVIs6N9A3QMCQAlQhZsO9axteefC5xavLq/t++h92ivUD5p4VptJMcK8f3186fLzm7vQ0XXkTKb7tpOXL1155zaRDEdPgsOYjyDk4xDcCzeMLoaGCwTRa7MrPh/HGTwqPEqqwSYyKal2RfGxRp+xKuLziTYbjLNsogGIajIfsUajUAP42PoC/gT9aQLADJQi+lNIFQQU+tCh1nctP7hodbtDT76nXaDe1c5vPtpb26r1fbvLhns70VoVeKzzfeu7dNE+sJFs9Jow+dxj1ETtjphM7MU14xnE7HB5elpGIC3Aqn4iGBR4mwrPkeBlUz0eLwyXvFmZosWd6q6OBInUVG8gkFEdCVA+ShU4b1wwGmxKqIn+T7jKSZtDNd2c0rL42YJbFKRWTJ5Tanw4UNlzX5/+wYfd7jv37AHz3yQvaLtm/0Ix/PDNL825dPmdlWF9mzquvXj50nMHWkbvg5JzlqxI7FU+5LUW58bSiZnhVmlskGEZi4ej09Ntituj2Dw2grdQgQBhITIzVKsfwROncxRFMEwQ5QuB6LHxemqs6G9Y/QtOQzpDVIPTWL+bMFAIKvm1YMVl8sKFGQtKDvl79z7Ys1fgUMs275Abf1kEZeca2jx+2GNvd+lyal4xhba19I4nunTZvi9Pq6IegxuK7V0v6AMPY78lBhD3hKtEqbSnagsq9vZhYybRrFlm2JtjZ2w9JdPAQW07VkeK+tZEchiaoWsiQQVaRkt1BOpigWpbxIh2u8gUtWW6ubu1rI607+ZOrYnY3EQBavmHnzA2mxMPLsaxnA4DD9ekIUZVks1vXGUIZRD6fmV4RBUeiCYCnDTTqw4p3AGLSq1QOBUsDqYJZKyLuawdTT2AChGfOHrvqjuOhB4vO3v/Uw/uHerrVtq/eQfZK6j8LTtqN9y19VBhvznrHrh/aut95ZNHD28+YurWHr5BU+7oeNeeAQ/u3jRlcEUQbFo5d/O8hZMXzlnW9u5H3KC/durdji17t0sRfee9z65d/LDf8diKocuHtU63yv5QzhRPwLtsTG9vmnfDgsHT2omCPaNdBPU6wVj5GnMQRsr3hFNaETbV5cxyuIVcQ4tOHTu28Oc2d5tgXGbq0zfcBWVb1UhzM3RNKyOdwmabzRzuRPd09GyNEYV6ehHSkCssRFKyHA6nO+yWKyNuKTYn80O4ki/Go+jY8uuLfvM1d+DVIkuKAyVJ1Z1/seyqXu1583Xf0m3l6hWTW2lP7N46enhkhmVP+r+eabjkQ6ffde/4+dv6HfnH9L65W8uH9evTfOgkuOCdB0/ptPChnX1Gt7EpzXu1PX/3gFt6DOrRxXahGYjUr/Yb7vXjxt5lJPn1U6tXVrqV1Pz02anpqbdP6O0L+rageORGDM/fR3QKp/lkiRAkShQ5u8ORkmrguBQvrgmWBcGObv4bYvrXRyKJDExATssncbkvFWoC679idp8uuWN2j/E3b9GlCoP7f/5KObgne/SLTyF0/3V3dk+px/f/Wfs2ju+vQtkbge9I2oVTTC6X2elkrDJ0MGDE7qRlkXBYHBhG0OxNhhFsYL5ugiOo00kiHMENe9bu+vf3O6cs65cx75El9tx2ZTvnkQ8dJ2dGN/zxuY4mWPXoK+SKaL/bphYA6gWi0cwT1L3VLZwZEATW5vMRLJGd47FDlQ4F3xP0BCmjMRUPOJEbDTiJ1aI0RmSun3EC0jg3vspiEQBBBgxOA34KIdKQiXknGBgq2rd7W/qh+9ZtlvIy24yvGQ7G5mYZtMvaj2ltO1aMHVadNANFh4s64NRuaP996xKfV5InmIGmTXE0K26m84Ww9LtB394EVxz15Wem8TzrVRTIV06uW4X62wylJ92dThkMqZURg0RJjdqQ/4KveqTpNC6lAVu6M68z1u3aD9//DD7/85vobZ3bMvesu3+NsXtp8eA+PUBmRVvznevvXiu3qyjq27MvmaJ9pn0DLbZMFmo/al8FX3vh2El/ICeQGnjy0W27UgLZgfjsFqYF0xf6qIVhJyBYluR5lSJJm2qSqiMmGIuwADcYxgFPk3LGKJi2OzygfsAkR166oHGvgHB2s6pXWu/sNjpvZF6zlOY2pnPdgtt2gmbk8QsleTPy23TAz+4P5es1uJY2Ij9sN5skiYIBkkrZLaJkVgm2X4SIN80m1xTHEez0vn/kltsdZUo7QP2ZeFzdx9q8Mz/wLcP3+2fTffQn1r0JDVo4+6VvSdPUav2eB/PO7rBm0nhWGPkG6SR+wz1vqXrP28Jar4vkG9xRYpqZA/B3MmK/UxTDtvPrKJF7an1uSxK2HTwzqVBGX2EGEzL0PdEdTvMsp9mUahWNFl4QLKTV5GQLCj3BmoiHVvNqIqrCm0TRAsMmpiaCwMd0xJtYC3ReQ5xVHbVXLyOoAHimFSWAeEkcbmqkinVYBNWmx8Dkc8WZ3rRWfTN47addx+7Z+VPxspdXPrB1xcrtkxeW7bQXFxWXOOzFhSUlTm2weRU7b0keXVL3A2W9fu6b03QvbaX2IugA5oClILRc+1L76odPxkz65ur73906/sc4r3BPjVA+8oj+4eZWOiPdROQEM7OyszO9RDrNNmuelS7mZAZVNxQQt5cTqiKcRNqrdPiK+KVtjOebcFs/2qgRY03XgRyqXdU+W7N502rMV6ndHmpRUuoAZJMVIFOir5FFwAUc2m/a+08e6d3/yYcfeWJg36fqPm28BjHMhJ1Qv+0lHJDLseGyNIs/3Z3rJIjcdAvdrLnP5/aL/uqIKorWVCtppKxWkcpNz8pKN6ZXRwhWYkmWpfTAuGB4DKsjpN/ny/HpYE0G/5GcjgCEETfL9OGfcHslHW0li5UlHZbTUUqPe/yofVBJ6UDHY489ecQxIBTq73j0iVcecvQrbNHP+eAuZ9/CwkrnTqj5vtcebtm8ZVmzUjAMqNA17F2UW1ycW6Q9rn0GFk7NKijImqKt0BbPymxWkHkr5LvNjfX0BvootHa5xNRwG4XItqd5U41Gr52g85rBzy5golwuu2SvjOBydyMFz7hkz8hIy6ayKyMcJTKpDMkwsTRGglu0EjG3Ts86hprgsFjLEMAMjcD2UI4nk1Rs9hjHOlK5vg4CaPP6xWZjRjUH2y+fbz5qZPNz7zw7aYa1Z2lJd2X2+AkzlR4l8NWcCWTKn8DjHDO6uQaua1+5RtcowAPA85cdhW3K8z2XTj9/yZlf3qq5+59IhlGv66vce0QBUQ59rtvDnXxSx04tCwvLg+Yclu1NmMvtnSRDn77lrWoivVu37tTMrbiRQSvvVKoopZ3K6a581/brIl35TD8PD0bQbDby+IZWTuBa1TtY8SFHjdA1EiehPmXZ4JoWSYP+TWlZ/aUuVJLYyQqWlgRLUBUZhm6LzQqHP0Z+4+/QYsfxl49vuWXwluMv/2NHi47+Mr7U1rX3wgnlE1JSJ5RPXNCzq1LKTzDbMyb170N27Lm+3+DZZU+mL3U/uaLNwpphS9szg31p2nLtUe2INn/qVHAnGAgGgIVpvs1qmvYuFKg67ezALl0GgvaAhB8t/A4yPCq3TXH5qK73LClp2abFh/tr89uUF8J1zkI5H3YzjHPzifbEvHAzp1zWsll6en6KheC49pQlX20pGzp0bF2yLtLa1r6goKUtv3llJN8GmVSRpytHcmmbFPAInspIisViEuxJq1wROhdDs0AAbueKCkJ43ZuuMK6xa7TEamJ6KLbP4G9Xlfp60cZ/f/vII+vGjF/z8IFv/71x0cDhbeekpM5uO3yg9sZfrySZ9uHJLdrH2k/aJ9p3/fsDBaQCEQS2PPXR16fb5OW1OUOvuOnKIduE8wTs19A2Sbg3kiDHgQmE+UlAlBf4cHoW2z39np1ZCn9Ojv1c91g+048yHAG7iWzY96wNxLiUdqJ1OMVmoGiB52kD5XAKAmMyQb/NRNMehqiOMErD0ToNG0UQDiWG8QwkH1byvvbNT3/2I+l8+MvOqCv58P7Dq8ToafCgB0wAJeTxPUfbz1iuaVBR/YhHjEB69kEbk0P3groX0iPTDsKM8i6U02U2A44TMHSnDYNNeOur75rQo6N3NsXKJDu9dhkQXz38vvekMHPitnXbNrfN1waDndAxqwM8cB25Xxgy6YXL/3zPGn1Jp2fajat0NXMF927lcAb4LNpqEEysTWWNRsoCPSpFsjBmCYiMGYgiMDO0wWpAwHv4grcgBpSdVOVaj1LDZVAM/BNUMsoY/CdE0dU52s4+YEyO9sCS3Wu1h3PAsN7a7hww8o6dd1P3bh2hfVu9tUYrAb8M3zoCqCO2VYMXNBXNI95DLwQ1DJpznhYWGLPZDo+JnVIMggCJCRVIF4sSc45jXRA6MCeuVNfh20BN9xJtf8f8og7dS8BQ9JWZUdTG1rJNuFj/gp7zDP0q6MWchesRCIuEohhtErUuIhEmo5EgCpDQXURzo3Wtrnu3rB6ol2H8ll/IkpJAh8zZE8ZNLL4ld2SX0ePpV3uEMx3d1vtt+bfPx7minXR3YhRzEfoZnrCZJghUbUgyKBF5sVVBjA347mrQhmZQtQWjIn3mBVOYi0+PmBya2Wtj0/fg8HsYDDd5DxgTYTEf5c2Y1yfCXNzYY2r55BHoYhFE32Rak/lQXyloHgjK/9l4dn2EN4UJZX2EgC4mXFgcSF9KsAxi2oJNVsL5406OnXl3l7mrnEv9H+9rv3zxrYeGMe1KWlbkT52+74nccCs05pAw1GVoh6j3mROQZgXGpVlEC6I10ZnoS+wOD2zRt3lPV/v2PftSrcUypazS19mY1TlLYYJBRalKCXaherbr6O/WLaO3SSyiyizFxXIrgsmmmttcZG4uV9CzY++yVs1dBQWu5q3KenfsafC0b2P3IPpDsXOqm6ZQ/cS9pK/4FWh4G4CuohxF9ToVYcRJoSJVSbwCf/uKusnfZSRekXUzZ45/7z0Zf667B38hm+Mv11biLx/rf3cv/hJ14S/Ui/fdh7CrWfyF/AF/ufYF/kJnJv9b3VX85Vf8Ga/9ZG0ptZP5ssnaHw+PtHlat2nTqVVHxiDKskkBgOvSolnP3n3ogsysrIIWnMnQsdTT3uRMS6tyVhqM4Y6F4eYFBdle1RUJZmSklJcVterb2yQbO3bO9nhTWvXuIcs9erdK8XqyO3c0mhmRqdcWiY2II4ZJcZvmvpSUBMUaxNGw+i8BMOZInGkZXQWGWDWkYt8J+s8loQx0KFXooAcpVFPPZWZxWSALFXrBSMtBcRhhrSyrDAGsIQxAB9fZ7R3ToSf+FJ20oNPwnFuqHqCPxF60HVRYYOoqtiqZVtcZvjR2gS9vtQxq0b9F1ynlJdOoNwcVDmjRdVqrkqmt8W9UPkh/FHsR9eL3LMaftT8Gwx/sMrUl/B0O/85U9J7t9LdH73TXoBb56EmlU/U+MG0cfYE9COMuHzElXC6TJLTZHq/JbGZ53mgweG2ATkn1iLZUW4GNMlI2a9jqXBexgrCZ5w0Ig05iAcXEJ5di0Ndzbuk1XZ6hj1pU3+LdwH1IdAqHcNaiuAwofiqkR/UhUu8c3vXMkdVTpOif72nbjfuYYZMmDmf2GeOtxNcnRE+C7dSUPseub2H2A7p3t2690Wx2kjipvUK/wPwH8uRB6LUiNOCqzeXmDAbKZGIZxm2T0aw20QYQP1YHZEcWKFkkJdVgMjH9Iia9MkY6h/MxOpDt37CiF/TH+CgtA0E5A7KCDGWI1Mv7H33+yD3zcYk/OKY9aN5nOX3ass8cL/evG69lgzJyc/rGVFTyPxeEX35ZO6PnZOikXDrU76LZ6TTwtAL/3usTHdURAdqFmoiZE+EHbaRoZ3LTXpNkuhXlw0KJ/j09kx5Sg2rTPr6HHjr98stNe/mozzddurTp7fp2PkhjJar1hDYiRiNHKQohOsyi2evjPFURVrbKVRHKysEPEYio/lMFoDEOadOMv6LTVp9ND5YkynYu1M6bByy4DrRiAcj/GVWC/sIoJ08uj17F5aAbll+foleD6r2OizD+gpsYFs532UVFgXYQmjIRGh+PlyENZgWeZbtLcdKK06nQFDz/VtQeaoqDXeOo43YMFtmgVULX4PFknA3KeRYmVe+MxN2ZUAvAaLN6yLzJ8+c9on15Glz8AVBntKd+1+b2mTpltJs6vm3mkpplXaIa0/mt57Xo983njpzSKja7sTvdG3pozWEcWZbD5NJ0MzKPonxEXm66necFIZegCvIZknO7/ZURu1vKaZaVlyeLNM0JXi6rMmLk6rGeFhU4K1ohIONY1VSrhvcGDRiRdEYS8x3RrDlVLwPFQIWxcSQ6a51HjBozYvD8a4MYupZ9FNAMXfjQ0vPnnl2wcvL8iru23dJy7tjqIJmmfbt20pCxpc8Y9mgRhn2klG4xThkzXPtV+/CT54ec3vbWhdzFQyeMwvg4gJ4LdRJHZIStDAtIlkS9CtURaDIoBt8hFzTsVtCLg6jna6N5p5nOYIxGXL+F6YT8zl/h3rPwbHJEZtgK35cBqBeBILnKCCkmOk+SW91jrdrgQC15697oHrocbIxexT5sWWw2N4/wbFmTCRjMlJkSRCNP8DURFh41szU2rLsiGV4rjldeVKTj2eo1IrjjIVh2EA3wRi1kpw+SX5PDHtTCm6KHyEHoeetjPXI80TacQnGchTGgme8ii7MUlNls4HmyMsKLhgSqr/NmT0Q9dEiQcBEZ7qV79dXaBQvo8nXalRVRjSRXgFr0vEdRjgpjf/QJ5xBut4e3KCzrs3hof4CyV0cIivJ4vanVES+qwzQapeqI0QO348XYo28Kd9koGI910MJv8N2krI8xn1p+X4//fPHf7x9+t/yJvFnjtmy8d2vF0u54tjk1MyNHe0F7XHtAW3Xn1pTqbsAHmgHmu7Tm0RwdSx73o1TAdfIjXAiPqtoNnEAQTs5OB9I8Pp+1MuLz2R0Od2XEIRoMtF2lzWhAZ2KTGhUTNxhnadPvS8pi80xxBKsTLWNgd7pi9ptrjr+R/3jK/HEb7xv44KjZ42rJkVr/2bM2frpo2M5vF65dzw/o+eyT0/cN8muj6fI12uzgnI9iWEPaBFz7kEVsDFf50tJSvcEsp8vlT7VlZcmskbBYoMkiUqmc7CDLGr0UDDxtMiFLsl+mREYGNRERN9hSqMHW4g+EA77qSMDqtFoowqAj3oX0DNWlWG09oV8axXrm4tZML5OI994mIB/yqaybg68oIVxsgDsH7aZUv4u+KQjLb11r2T+4XgpZDQwGjvwbJJY3oufBVnI+pdDR3ahfEq0L3M8MYkU40+P3+9yBDJRQ8lkzMkSaI1C3JEv4qKxMNxeg6fRYt6QnYuX8KHSkRNGU4vdD0+NX7RJU8qxK1Fvyc/GJJ4kBzv97Jf6yfzJpJVyOtsLNeyi5nnudUaGNE1wlnea/6qLUgqjDhGRMLhJ1UmJMGniuESZNCXFruA3LuD25ZDPCFjBnZQXSCVJs4WGMpWXpkiiJNRFJIlPc7pQU6BKk0AXFNZECMpckoVFjWRLjpCUhw9fPtms6wTU+hwK7sv8bhgaBW9viPXrkePXFa1UNEWkWH2uRhEjz8enUJbNn9Y8MWrqvsj2z9x8YnGb+LAxOc9viJHCa/e85FvWrnpa2Koh6SuE6oJ7SMnSbSlN2R3ZZbonkM2Zk+AIlZZYCB2Vs2ap5UVWkuTcQby91E3a7262gLG020aCdNFYF12AJGmKzJ1ahSTtp5k37SZPXAP5QFjnk5Q+a6/2l79aeeGHOskUr+D3Ot58/92WPpV2WHH5oc2DebeMHDO4Tbm23LViBek1rJtw9pF/3wV162O5asH15+0mdWdRsevsu96z+k2cEVqS1rejZSz8TB6Bs7MD4ZMPDBSTUdSYZCoPZLEkIiV62Uw6n3SqbbAxpQwg4hCCheinJyjAYCKcgIQIx56uiCd+xiD4kF8XxcPAhj2PinFwTh8RZd2ttrjbQNTULg+JcjmPinMXCvMriRrg4xBVI70Aoy3ZibLhYp5fluIb0qpBelrRVRkQSIMxrTDSqvYRSLjYgOj57+O/pjrerJtGd1LLarM/etKZNq1oLJH7xxtV6rCEXMSJcSDqdLpFTFNoG/UJZkmwuyu2xiqroMJFQ4GiOZGwkA5eckl1WUwxxKD75Iu4vNsa6Sl5o+DIJfQg326G1Li2ZVVCWhEB056zyFnixreCoti23sh6GqK32NFggwRVP7gF2EqPCIdLhcAqc1UorkHZJFBUn5XLLgk2wm0h7Jaa9gAQKIl+hJKdqihXWx+oq/0/06z3CMfKv1LYKTuzQrb5PeGKzQrzkBtBD+7TZlPpmYW0v6GCI9QvTsXV3E5Fwvol1wZW2qrxgUxRBddMer2p18iYY5BgBCe0fS5rgB21zW3maikG8Jgc9RCOk+lhgkYh76s94/Hzv23f6xIn6M45gn9AJp/676eTJTdqNy0nIT/iEx/LD0G96VY8ubIJoVUVV0WlX3F4PJFkwOSsjJpNgc6uIcBgTkSQtiDQRm0idXILesA87boaKGpLduCP7jTdqr15t2pX95PKNG5dHDzXpzNZx3l7FOEx9wlkWhjXxLI+axW1Ws9Wu8iaJISWsQCxWK0MRNuT9xS6ub0ZmPZXQe24ApMVhIfzH/qWJJf2X1tM1xHv6V3SQxReSF9RBRXfSej1/G4SZg+vce4ezSatVVcwCZ+AtFoOg0HaHYJY5EkaVkEBeUTkxMdWsCYENNh/XaBe1IxssnhxoA95PKSzu8MIz7w4PgpHntW+U9u5a7T10WKXQMNBaO3WXL3oM/GSwaEHqsdhsiwkY01JEuWqOomg0FAdqNDNNSZA0uFycxB2DoTCaoG5EaITQJYWamLDGrxaS2y+TNVkcbSuUaOzFqFsIMmoVDEmi9yI4HbL0+lCkZ/XebkjLvbgXtnc4B8CwkIQekoHjGAHSAixVkVjzjAk6RgK+4qhKuuL4azrqW4uT+s3n712d6DjXu2JjXeeAWBGr5eWJirA/tiYmnuYFES0Ix9ExhHx4nuhEvURyIf1NViAATzvl0bJPnwbvgsd/qef/weuD47NPLuEYqWs4HZjNFhJ6+JyFE0ReBKYE65TBolIsDJrEeiyxWMdj42cDOR6cYZ47gOPginalVusbY3pNXVW8zx4+fwD0TR6APCP8ldwAQfl8KarBIKQQdFqQgXoKNaYD4IexK1x8Qr9VSMG3Zf8zakLsl940btKlKiAPIEcPHLp9+8NHZu7I3GXv3Hp4Va++qSV5Wfu0z5nOWvM+2kvaMW2dtnn9+pTKwUACrQD7rexOj+bQB6/H+mQx/XRrGPMNCaupBOWBKhbS7yVgzCeiHg2M1S5EzF4GqjCdmxQMOg9ELy67rKf/pkmkJE70OSj1wVQcExXx0Xv0A9v2H43xMaxfz8pb+kAu6NbRf5Z/8Yv2q/Y75qH2zcd2tNMWUzvrRhIk0f/Gd/SPzBAihygmhoYLbcbmXlHIcBUWpaUVCl4jU1KamlsdSU3lLBYZgUBlOThorV0ZhYXQ2HGxzHIcvL8pRm4oeSBIZhYb1Esq9FYfFbf6YKQAuCuocwZdhwCcIXOUysWZ9I+VY9oOK5y0N/pD3bcL+/ct7X7X/UfPZPQdPHb3umUPjhicWVjRUXu2becu7Wa2z27j9pWRZ0APMKZ0RZr2ye/aVe03uT9IOf4OMGnfXzmsfTZQakbdUrtx3Z+dDwLnlqd1jH3I/3a6F5FJFBHVYRXy7xGFoLMwKxAoFDxGJlScgqfPuSMpKSxcAzR/Lt3BOqoizmBhIU2TrP3/tAboQoioXwOcDCzTQZrQ3nKOojIqjoHkaAfo7V0mD+k3aN7X2vXPXu0XDufmTV25b3uXTl03zp2/fnVhp8LnyvILiksL8kuCZRkZIAANowAKPIttP7908QrV58M5j3/y0ePaH5upLHDb3LtWz554trj4aT3XOhhjTGeijkfCY3Sa1YAfepV+1emQPFxWNhtgA0afL7064qMFpSYiGJ1GI1UTMSqxJjPpxYaD3ZpoPr1AwEEySa49mkyfSSSnZkH54WMINXqp9kc8rlHBH9r1pEQteRDlZBF69Om8Fb1wRLO4sj0PJoNOibwtEZsn2BLGONnEwnAeTzgyXekcq9hsbHpmCsHm5HoDVRGvN9NBKJJSo6DpwmcU1kgpqMvQ70nphibdSFURR6wHdjG3nqO4MPyHeDNsXhIKaR6+BqhoqvGVJrle3BnTOMDJJJcB8td/fJd6Rloy96FNm3ZMWSc/Zz2zPhHXOD79We+KPbxVGDrxxfc/ujRpqmXpCfuizrFwprKrEaToddETED4kYSbKwh4zAAaWpljKwhMGowHZCpplAQxiE1az6XwoELdQJQGVfGnt8W1aZ7oYKrg/kH1ESMo6Jgl8Tg/c+9Iy7CFp2mzkWCNr4Tmjka6KGFUKqrpkcBL8tEaDqJBViD0LA5XM3rtShyp5B5lB6kgcN/IAxo1sg5/bGe7rqhhWkJOBMmfheQNAMz1EijAYSAstkl59iEhiCi0e8xA3hKhXFdgdaE5PiHymVmt7AVjk4qBFAd5XUPcjXR7tlffU9Mwy8gJ6Xuz5hEB0CgcQrhQvCOgmiaYZRpQozsBBTQgfzPCm2FUq8j8Tl4ax8sH6hGTMEpYEMLImlQ7aaGOe0caBcm0Rmn47+xJ5dSsaeruVHBvdQY5uwLOCZrpAGqzQeWcImjYyjE0VDFaTiOiAq21QmeSKW2urpHnx8aatHFBPQf06gHba87Xa8/BL8nqs1v4NUlc3WBG8JnDvX8K+Wr9wnigIZrj8lIngabgqRiPHsRZWkgmKN9FGIFAWKzoT8Owle2qOhghpDkxekQ40gBYGnQojgP+HyHGg9yWtN5h+V22Jtlpbcwl8oPW+RHUiQXRR9GMcG7eNvkCeJVdg2kZA2qZh3w36D/B8cAaDkWApGrpwosjzFtIiyVDO4erxooj8GZWj9c63+G3WTUmLQSDoxMXoI0drzz4PdmqzXgbNQO4r2izQfszeLPCM1olsRgraULA/+qs2EOOcoLtJHe9UJNqHA0azmaUtMDoHInJvTSzHVkd4jhLNNHRpSRrPb7vJlPt42TQ28jr0eRwC9YamkS9oGrhLx0FFcnr9D4yECggDXJPzMWyXNCirIs8Y4DEy8PDZBpqH8mrmVVaEvpyYLLI6DY0frsSfqkPkBAzkk9oN8CKCyflMu0GXr617Kw7vQj2qn5dqhC2DY6N2Yb+BsdhsolWWRYZS7SaqGsZxrNWGei7ReHSKqAgl36k0vPeG8YUfT1XUQXT020KEzaqNw9isUFshdFYwNY7OGvPqAbEd0rAe35tAGoysSBDQybBZWcrhRECFFgshcaIK/zbWOq1nK29CQyAG3BOqnzWIY4ruCMGnduzIrkc61G7cG8PvQXg+AYUkYnA3SZi0DpTZMxtkihJoaGrsdtpAOV0kIzDVEVmAsawo0JTRYbUZdYzapJ7TppNPAMuhkSL60rQG+PZAh61dNX6hjNaGWjh6DUKu9Yu/fh1bHfCzZrf4dADbejwjF9ErnAWcnCzTViOUF4vVSbk9iqTSMCLkaCtUe7QVirZL5LHQJBN2M8rQKiXokTGdceCjMSOnT43U1o4ZNT1YGAc/AoXau7JHR0DKcb5/jtFRkHR85dkYy7cg7EBIvgZO5KwKZcZpFKiJDaI1BubbqhHkTWw6QBBPa8JgKzVJaL7UeITmG71I+r9sEc1lOsd6910YE6In8gtvfA39wn9A/8gHrcGIcGHA4WAFo1FifUSa3Q6VS0amg5WgBAcks1nywQ9KUVKqIwpNuW/SXyCH/mIfsWjrrcKo/glVSNgcbgSVGsfPAKjBNh/Qi6surv/tF37uYnmHfYRw7VPwdd0vpg1ba1YUae+vW20mu5rXvnvHNFAMWixfXN66ddEoCygCraNdK7/8ZMAg6p6rv37xA/J3AeRrH8YMwXzZRNECzZ3DwnIpPh9ngXwRvIOvjKQ7ZBm6uazD6HYH0A2wEUqM0f5/4QvEfB8ygBqh02LctQYYCVaNlSaBD9asGLnS+dBw7ak3v+L8N+RH7AtY21fnwOlTwpL5c9bQ4I9nzg/u2/wGASyA+LZtu9ZF0//9XfSsc/XhHY9tI/S90l7Fe+UnslD/a7rbbZQtFsVIM34iw+UiGCOdneM2KsbqSLoiCIoffrB2e6A6YqdZH4LrRrDioUv/k7WGm6bDnP3Pfevy8Iw733vP8rcbN2WqoF0BQQluX+rfbB/aP+0C3r9U6LlPDbe0y7KQSRAuwWRmOT8M08wCnZVNiC6o1TNdiuJi4YfF6w1WRryS2RI2WixUFRrAifU9ymr9f3Mc306WgXyn/88N7a/9ulK7R/rrHf3Krn0AMnPAx0039SYzYPBMBfZzayZ1DteSAmCNzdfwM5mASMtm3A2wNTBeKPMf+PNfJH5erz1NQ7Wn6bmsp0Ht6QFoqw/iO4h+4VwixW1HIBC+FKirU0wOOi1IqG63Wh1xu31Oymx2cJxQHeEcyYnb0M1TQRgF1k7A6JZNjtvTA3onKL48Zbn/R9qbgEdRZQvAde+tqt6X6u7qLel0Op0VyNokIUFII6vIEsLaQACRfd9X2RUEBEQUBJFdRUQQiBhFwWXEBRccHXVGfajz1NFxXOfpKHTlP/dWdacTwP+9/5dP6E66655z7tnvuefgu/6Dcm7/afcTP3Q41WbjzIdPKP9SPup3Tjsp6NcXf+pUvvzlWeWbe7fdnVHf/9vP33+H9RhWjwxmlzIcXmVzrKq5MDc8WhjKcOl1gQxdhsx5XeAygoXLzgnRygwIXb1ywE2PceWrjnEjV/UGbXHF9VqnuW3VngCJlKCb4wfN+fNm7Tx36/YZL922sqFByw0Oyv0C4ZH7v1nCjnSfeWrFqXolMyVHeFu2W/mZ1kwqtKaK2czO0SCyu2TZ43HaHQ6f3muHYMZOHCaDCALtkWlccz6S7EhLL/A4tBPIqwYDVDjSUEitMiITlReTswH6xnrmdsIPPPrs0Q13pI4HuB0Vozz0qVomxWhsUl7jXwEae7ie0VzeaXLKHhBL7JZlr88JXpXTZrDSe3DgVBncWK6LYa1D0Pm2yb4KCaHSups5wacysv7zLWAksU3LlfUdo72nD6GtOiu7Vobb4beOvKi8hirJU0of5e3dvS2rDDPgm3rUndY/UfjuAh5ow+jWK5ot2e1EBD9d5/EYidHrY2GgqOeJJBGLxUXnpVzNwaldOzUKJjOpLbJoyZTq//yo1Rzs3JSSW/1BuV/ZoFYbeFAehe0cwGZltOsfzec8FoPHYLSKomSUvD6OcxldYGJc6RbaxNOCLBajzWQzylp4Vd8yM1bV0uUQtAnLzZCqs9fQEue0qcsXKb6GBvRVw6WXT72ZtXJI75NPoodp8pGlX4VLyq937NDy0SrP2bju0TAEWtRjNEKUaREtdomFMwZs0hHRgS3ggeDExOUWPeZbaExnODULTcjYDas0ku2j8d+uFGoBh3EqjV7jX2N+e/9oG50ei3pgX4vFagQv8TqJ6LrrJKKT++hJzUSzCjsWEs8Fkpx58eimzUAejRisiC6Zi6Y+fCnz4aPgP+udLhe22ex6u+xmDeHNelrIyI2OORw2vebDa3USLcrQtEE7rfx4Gkx9vaHZjb+3YR/qnOrG/35GmaTqZvDjmZ/qprMCOTdE/3aI8NwGj5enbWV4k95tM1kHxCwmoMObV3f9b9GIU/NK6a40d+OkDvyyg9OaG3JSB/7yeWUSTkP9RyT80VUafwS4QdE2DiCF0SAHwPhinJ6WJttJRlA2ChaLZDRin0TsDpx2FZs4Wk3saeE3w8Y4K3X0siEpRk6tQ24la5HLmKergExFuYfWP1ydy+/719Pp+f6w4enPVjBWIuOQLRC+d6rSG51+bKHy3pXdQnfFM2D78Pke9A3jLjpz8TWW5/dyfaN5VpPJrBMlLwgexhCLSGbi8wt6vctiM8sSp5OxO0V5tRzAeA3ArzGGEWAevSnjqlGME5gGax7ImNrhV9ViYL+RiZ0HUn+8f4r93+PIpdkZiOb7q9YcW4VczEk+XpfSh4v1rGd9tbrRz+Kd/2I9B0tYz8G3GyIdbaSFr6A+u157Np0vx6nz5QiWhVyCOaekPj9lvpy6xtLEGtyUH+jtTIIraZvCxqY/N5RHbKTVd6hP8hjzae7kEjPDGlnP38Nc82zEPdpsRMDRxfqHmdkkn/802DzNkxSv1VsR7zSqNEkDRI0Zuc2dFeGzE+Gz44XhdhEN4FL6q9tF7GfvJ9F71OJaey4agKi/1AfRwdqMBl5KA2Bxs9AKn2SvRvoMSgOkfSOLEgFlZrha3mlV6bw26cMl18Aoj16E5XLCqhfXimYX6BrMj0uugVEBvQbL5eWoflxyDTaDiq3xirZGQWKNErqGs6gdyWm1Buu3ztb4Sl3jP9o3iugaYrs2JLtFz8m+8Pm1wirOT31FnoDEOJ0Gj8diJ3xautXlsoyJuVwS57RLdgjsOTp/J2UUJb0Jps25S3G2UwpmWsyuQjTlg7RpVQvfUP4zJFEbVIMar7zP65XKt75f8a1r/5m+yg/7192x7R60efdDymzTxyfXXJyv4rcE7G4X2i8ZD0yZGTUqMTMKb+AwyBv1jW3UlwYzo2/BZ2pfu7pEXztDreZJ21jvdKm5q13y2WuTc/NS9lhme+zUnp5Cf/X5S5N985J7LEvqNyxCiz2eoPKqg57ZtOLVAJPXNJ/ItVqD9fJm8lrXkleDjFcDaS2+kdpXgHbJ7httK9tsottq5UTO65Nto2M2ub+8Qt4i83RKCjEYHKy5gHl067nlrY1x6+YCmU4IGJ00WGzVTkDhUNgVv8e0Z8s9D5jwDHfr9gFX7kTv/eNbvvKzf6DX1J4BWr9y1pvKR6f7ue120WOzAcz+NDftBuoG18HtBmidtCMYMV81ufya0CbveDsQbb+rgQux7U2X//WPX+P/+Pd3ivveLYb4k7ot927YasE9zetxhvK9cgllg3PqQT7lm3jVMy898xIZ9tjjjz/GtdhDOus5dQ95EhRyecK12pEWe8jvTN1DnoQk+AYKBlK/kZhny3jxE20NWbtDH1bv3Tc1hIIua4vvsJ7HjBfj6hq/a7yYQ3mRhEO6lmuocx9HJeY+psiSG2QJebypcx+TPR/rEj0fk7Lkltinm3s+Jp+9NvFsgD+SkKV0ioDk156eQiP1+UsTz2+WpXQKP/JrK7SCf3dyjX6oMrFGJl1jsjt4nTUSfSt1eA/KSX6HrjI03Ze6CvsOy4EyXD7QcLElvuOj6xg9sq71Oiw/yfbiVxWX7xLfoKvoPbJkaKGXPwV/ldaWG2iPCQ4TIugEndFEw0SR0GN3Ohey+RBMq+9mFTc52pmUHEJ7N57YSYum99EsMquO5uisFXg2rSNnzyYCRFGcnjOaDBgEySbq9WRATC9f+9koeeRFy8bnHbwjedylzRlgs60YbT5qLQsZTBbS/YK7FW1Yz3JGm8stZSEoqdKj97SgTSXs2QitFq9MtNkkjudlo+TBEvGnEafLOSbG2VzITMByud2+0TE3kSDikRx6iHX06dfqcpuaK0oJetQTPntIjWY7IbVinlEWHVJGxpSvOt5U1n3p9EdZ1T7+9zalWvlv5UP7Pse9C/Et2/AAVo++FOD1s9z0SIjFHA4X0em8FhfHuwBe0e1xg+ryeFw+H2yAz+bSsRZDLtlkhxcnY6arAb4OtFpZ/9UAqyX+A5WvIjeVdl4+OlHqr+zUgN26JFnznw2wvsnq7XpH8xw2p8nk9nhlzuUCD0Byejg+PU32Omy85HbS1pJ6sBHpyTIrT0rCSG0JqF4fEVJPi3PzUg6i3Pyb+1Z2vKm6U3nXXDpfSjseQ33UQ7OGPgfn3WPfJ99QkznkZmxTz8niTezsbNksCu8ygHcc6+3WNxr+Y3htkkz0jKT/V5CLEEkFedzWRQByh6rq7BnnlY9eRKuUra+AcTC/pmxF3Ybcv+xegLhLWc6IR1FRi7O00qXa+aM6SxCs8eBoW7NosBkgBkSYcDpJstOqTKzjnQ6DaLECvxKOHlDaid7UPLO+9WlFM+CsnpGOPKQ8Sk8gETsoVQ8hV6BRyiF0+E31GPKwcgCNVlaqR5Gv3B+/i51DzrsfVzG6Aoy1bD7EiGjQziOkAx0hmcxGi0Ey6EEf6c0SAGlHgijQmhJzzGIURWLS2zgi/zGgyTacpSWhJIQJmMk65RNK01rlDVSinNfo+jKqUF5Fg+jZJPryHvQiJajS+R7Fz/LIM7QZZGCr6AQeMyfYbKDSXDIvUW/VIBqs9PiWns1d3apVbZPRGUXYLZ+s7EpXCBRcljhj4Sdbke+c0v47Jf486vWLct9j6N5lf5qB8e9n/vKigp33aP72l9pZS08Giwls0ONMN2VzXaNhv2zH2JepN5kyZZKTKwQcgTExbxb8b/Aa7FaHk1ZR0hZYVc1DxLRKm2SvYbW1Puszpdbc5Ja3z+6ItJb7FFY880DnLl2qD6zd9WR00J8fexbpv56rdJ4wbumyJTuPC92vFN0xf95a9I5S+vYzW7b85aUXv1L6L7tr3UpUuIfBfAvAPE14gwtybWgf0EyBs9vNuW6fL1cgbduB1+PBen1+bcyktzvDmKbfOexO6ZScyLm1hj0npdFGJE9qhUlunoaBnWJQXnnojnl3LL1pQhbGBzpGGTIT1+UqF7v0HDjgQM+udx8CGSxA6ch/Y91stP/yI+vmJlDqNwRt/vDtz/6M9r6nyhcP+BwTYoDN4GhhGy5bTDM7XS4QtCAntm1nyAxmBsfE6MGJl3htsBXONm0IyQNRax4L2Nx16qo0OLCLVvCvXnlogVPr2xF8zZk7jrx028Tl67QNum/99oO51StXjp/Sb05bfuLyeS/uXbYr6Dm2oXmLnn/ljkX3Tlk8bm6v/io+BsDnKKsFAnyMJt6e68kIBj12F2cSC9o46UCx2hjEVRlhS9hfGwu7jUaLRVcbs9j/d/iglLsMjlByyptHS0QmtqsIIX2ir1wRuvnwW1snrl9lMFd36lgFiK3fYDHsRz8n+sYhvHc57RRnmzb29tGz16uYPXhoykgA1g7+x9OwP1ncoGg7m93gDmZmZgUCbh9vF8LZPrXRoSA4M7OyAqNjWQ4bxKRmeh7ZjE7qpYXWUSf6gxsqAe2GzowPX7j6PsqDD+1s2IFuWbml1f0Tz7H176nFtYibCLB3Z32Kh0QLnS6Ln7pmHOfPMLgA9gyjgU16MQoeVoBVG/PYqbM2ICbIqRVLV9+2ibQY4x3+wxsm5K2FB9e8/mLrmyR3bVlDHbFflq6+6vKIbe8Gmn0APjrBzoVujGYafWl6n17i6MyxLI6z+XzGMTEfyXDZXEB8Gz1EbFEDmOwmlrhkmeB4oGaLacXOkCbnvO3AXTu3b3sy4K6Zu6g83ZlZXZWXWYH+WXNjlxrSTSl9p/H586SnMkg5pjy12ni7rsteJOO/XilatXj+HYzvbQDvVtYLtCaaieyOkM/vD9n1fFbY5xPtdjQgZrfJJtFUG8tglYst4W3Rt6T1qIJWqqgcDzue74pOvqV5WsHfq1SB3XonHVbw3ufjEsMK4lVr5yVE9Zk3KJyTAc5FTOf3j7Y16nw+8IzoUQVxQKhqGRNzO+lhRa2I9olPiFiURInoeUK0aivQ/InhMS3n7rQ8rmgNcLXy54MHUVFC8W/b2JyAT9X3z2o1T3TO6ELmg94Uzb0KxtqY2y0CPYtFpIGnzl3UwPu/Q9dWudTQgEINmibfvl1NxNPEfLyqWXWfeyUxI7o/mxHdJhkb59NcIg4z2N20vxHQV+ZuiAZoAaBstsk2t8dicWCHYUzM4RQQRto921Y8kFoYqFYctQIV3aesIs8qq8ZPnjLxydfOnnuDlh5d+WnHujt3oiNK9zff+4DV0aVpczUYDBjiDafR4rS4PeCtcXbQtXY3EEwekFoxeC0YnEkIOqGI1ilGCqWRfOX8/OXLFz35z3Nnv1HO89Vr4vG9e/bsPf/18198eQ7najOuAIb1wnDVDmQSj0Gy5+Tm2tNFAwE7IPoDfnAu/H6OHYdJkoXPgVg2rA3MToy7bTXlM9UOCFnZtLMFreClCodvrvvsiGStADTT6RF5PP475Yuj27esn/+3jbCDPU5GHlq67oHHn+zZ8/XnT+1GZP5DMeWy68tnVh50Zd23aPKhEYeOdbp91uyJ82dvmrV84QZk7/vsPtjn44BPF7rPZAKnnpMOZTPT07kO0QCy2z36dIcjQx+Q/aNjcrp6VNp6cHrbVL10zRPS5nrdFiPU1WPSD3bc0zHa7sbbrnFQ+nv15l3WffZ7Oe2sdCgfgP2nsPnMafSKT5qTD2SkmQfE0mwShHCSG+tYdIFbBmzJvkRCIiyjh3utD0n5gPJVp2i7bpXVV5+TrlI+tO62dx3Al7U+KVXj5wnKMn42k5/2qk/K4s3e8H5Q85kAy9WrMTqdddDIZs4NZ/mAw8oKEm66wLm4UNQpCVar8RICpyKKatEYxCM7V/xGfX0ZdeepJlVtktYQuTzCDFJ4Ym5JJG/cjT0n9uqqrCiuKCqqKC4dXG8aNcpUP5jm89AhoR/JE58FH93Dhbn8qFs2GGw2go6T70kTISRqsPQiaaFGVAeK/I229bO1q+pqLTkTlMqU17qU1+hQUWZWUVFWZtEXiRdzCuFFSWZmoTgzs7BQ/aH673H6Gn5H8X5X6Id/F6/QuRMnOJEt/QZtH+WBP+HKPPiDf98N/z2xkP69W7wyJPkf9ZuxC75/WsMpK+o0tEbHJqeg0xKXVPixByArKQ5nFhIAuaQ4lFUkTs8qLAQ8KLj0Z0WMhieBhj5tvTRKQx/x/vGif7L/qeW6cioMwJZ4MVCmpIRSJjNUTEn3yszmxVVgiorQDOUeoNdLwCfGpmOcjrOe5ng7j3mOsgYNlt0Rmar90jkTHzxSN2LKlP2b4fNvC8OwIh6GEMd0giAG1puUvkBX5f4dO0Tu8OHDdB86CrVkq7gG7Hxm1CKlc6Z0+GPzII+2J/XqHT61DxQtTtLlqncMNA+1fV6lhhL1US+k51anTa+7sWxQUX5lJn0zbUDnstqKolKxKjcn6u6Vu6hLXcduVcXsTf6CLnXtb64poHC8BPQ1iisAP+m0jQ9S/DQAEt3t3DLePXvSA0eFfiMnTd+3Fb7zMtBEbPqKEzj9CcQDOaiI5FVGdETccvLklpPKioaGBg6jJ+Bzgaaf4NlOzvGUThcliEgmrjgC2BWr6Qbq7wkp+0MCR/ZMnNfEJXambtOBKZNHmrVNaQ0vCRKwfyqR69VNp8330EuP7Z44R+h39/7pk0Y2NSW+Yxf5dykPoyC8P8aeYePcUYNJfY5efVDZm/VlzY8Kaf/iCUd3T5ir9FYfvOXA9PGj2dOpmuFGCh352boCeFoa15arBI1i9xFSXFyACpzl5YbaMApzxfXUGP6p/ioRzwPWyK3URslRLSNoDVSytA3XpYzUxi8sj8VWLh/RsWhY3bD0RZX5+dU35OZUK++mw/vi6pHLlo+ILV9cnZ17Q3V+bgexLrZ82fDhy7zDBg0r6ZjfoSovr6pDfscSeOtdNjy2fHksv0N1LvwMaDJb6EhGajjIUaOvGPbKWWtABgr5n+rL/hhmdAzgWn7biOqSIYOGpS3skE8fnFtNAaC/oAC0q8nvQH/eQc3HvgB7YBZ3cRLnBRHmeYONFj1rrEf1Ls3tsbVodk9WvQdiHjo0yzNunDFUkivuKhs2wTgB9dlgLqwsa6HTaT85J7YKwiUeAuMoX8uP4XneYWScV6/qdKCyHC6nHd8icsI3IeGNE/t1HJcXKcmdOOGIPHKkZVy/0tLykpJyVp8FuuAQ6IJPgO+tTxKgGWaqAEgjSKHySDkxKk9/FFZemfK2JiP6a8qIfktDw5YGVUZS9Yv9KZ4jdsrQXDHjwYR8ECPlurot+6ZMGaHyL3znGPuOjfNF6b0Gk/pNG22b96bGY4mvh7R/8QT6GHT6sQcTD4O/pg4HGF6D5+Gm/8DzzA1RhJCgajgklFfm5cg6gpW/bz6CMrYoJyO17k8jfXwtZOoig6kV/zhpBZCvVod0zfzzB3xNgmnDBg0p6zDituWxoSsXAlNWdyjIBwauaUeZlfIQZdaqPJV/YH1tr2H9v7K9eRng0Yungd6mEzxK2rVUkgv9KMmTOmQdfFZ6krIdwZr5qGdVNomtFNfRvaS4qnsEa73J1tZ0N7x/m+G+RVhKOgHu1EbZT8tUdGwGxmytLGALkdmiisyI20BcCjpU5zWLC0VVFRWMPcoKfLrpO/ZsT9Rs42QUlffJWDYQtgI1ssJ1jB32FKsuQTGYNqpBC8eyt8zKJUwsJ6AqwG+btgZoKq4jlxeVI2lpVVwIRUP7QjhUKBtseQYCS7I+fm8kXBXhf+Gq5FzPhalKeC5fwgtmfecWqfAWod6JH+GSzFARRWMMgK19vijVqfle+xnzGqiNIGgI4DMf8CGMGwNR2GPk5Hwo6tvnwz6LTiMcUzICxEeV16EfGoJ6VbJFUnyFA9OnR5upqJqllDWprQuC/pFYoOnhAiga2BfAAc3usVXV/FMYVg5ff+2XZ6JeUw+0Xl35ds706XNOtgYAAZ8cAj65EfZQf4KxRkvOa2YF5Sfty6z2Gh0CnVbQ1I3tvbWBOqj0y5E/8kPRoYTL9lUSrH9rPltWkiTU/wWaFCT5CvYhLclQKQtdzcN/4PRmqet8lWCUecUMlMxilbPVxemHjlM2YRwO8t7kA/ldA/xgbiA6UHBUJ8GSNPf+EuqpPL1sSop+XwN7KD6BueLmTcKlM1DPKcqh+VOmzKe0Frz4tNBI8YpaSX/DCsNew9sGnlOtZf01SK/CKEwKlqpiR5/xMPjRPZgfTgyNaCDon+t+75fE9whaCDQd1PSDRtO0qEW22dLSVKJqKqHMoXJ2yrM813mNFibk7MEE9fYlXozRBOsmVVeU9Gp2yyn8eDY+TawAh/U04QwlBmxQqXo1CpTr8NlwYSF4+4X0u8XAq3vYfuhPcFjlVQiqcPFM5dClS6p/0ItfTNYIfeAz0pOYCGAa4XMsr6AeUaJeuGP8ZaHPu0yf9yRG4QR8xP4UB9pXDwo4sRHJPRZOTKFr+5Qx+KTuA/is8zRHCC8gsJnFalWveo8S+3YqYwwLf1mv4il0gb3+DPAE3inW/KHrbtTWxEZp3/3/sscY/QCC+RFfBTDqQJOYIeLQEWLQI14AF7UfV3O+LJIyN56moght5/nDP//5Tzock1jp33R90QPrn2Y6gRiuqRPU3REn0MWz6O4wuJUpoEv0/wtd0piiSxCAxpHD/AXQuu2jRtFqtlltkp3XdTGiQVyM41Ff+I2ZvbZRNFIzbKzKvn1nxJIuViSz8+Z+3e7Zf+TEzX0z0YH4w/iH0xeGH7lh4574d0dgrU0gB52a9nAGkFUdlVUh7AGHrhIElnRqcE63n0RPvLnP5do3Vc1l2MFRfwZg83G9oxlWn4UzYWQxCyLinC4XJ5r5NL8JW6l5cJ0B4AT4Tl/WA6aqqtXwKzXvwg5MnRFU4QQHw4pZIw2sI2FnZ1zZ5+/ope3p7nMe4w23TkSTvo7/0LY8x1f70qCsziP78hfi2+5C+NJHU49un6CE8ZtyzYSVynS05aFtsaAKK9CRX8boWBU16TmDSRQNkh1xZxjtEOp7SjQajOo7A6Nki6mGjirWODKU6faBcxsqD9EBqsvQYuT67o7L7+AftzXyoSPfKj/EPzpyBOedVuvigefIJ7BmGheNuvQunUv0W6w6UbQG0vUuV5rOehYWSuP8bNE0SptEnW7KVWRH1brn6dSNDOxx0uyzDYUrO+MalFeEaSlcwy2Tu1W1P3Z69qC+Ze7Qs1nhHgvG32gpKOtUtY6/EOx+12dxEf1HvmHBsobTpzcNDTgix+/scETrOdgDYNNx7Z6CDeOoLIAgnNIRnpxJ8pZGhUQdt9rFkKpvcrQx3pW37QKsj7Czv6XwvDp4HvUPyqNWI4cEnkeSHWOTgCieJk5lWVMqns1oskdH1MG0IUpnCfV6+mlibLzvKaUQ/QXoTAJX/o7fabyfklmVKSMs/BJb0/ckwRgU2jPwcEJ3ryapfSJSGBuffpq/cJnWfKBhgOoe/hPOylVEXRad3oyQ3m7DZguHLFZ4bX0G9eH07BEUvgRnNoOJ5DwrZrfoKipzysme6R2LXI0DblGO8L5zOcGKm6viw/GeKbdnzj3LeGAN0KUPwGjhCqNGQbSYzaLNahEpRXRAYkoRXZIiqb0nWddUoDbluDDZtq1R+bkRvQJ0eBq/c3rX5Uv8BcpupXQNWnM6nL/EBbiOUbPVLxK/k5BghlvqomoGN6BEd5PTtoBD/Zt7xTenFbNyWSm6Os9D7aJRznoRynYs4j4/v9fYft7k5Zujw6ZOGN1v/foHb57ypet/kAe/G4+s39ltzKufX3yhyxOdFsRfV+LK3zbR/cE9tP1JixrZBtmoFWmk+L5Zf/UOxbW6hjGghz6C75m43NPAmkA04KAB1IVoSS+NXDQkaWYb8hFlmfVMNJUVfB0wzDfKd+y5R2EvgvBciepSC6EDgp0Oq0XTpVbKO9qWkNa6VC36K0DlIRrVaotJfDD+pvI86nb29FPPKc+iKI7gQfGjR979S95f3j0SP6rOI3+XzxNXga6silpAcfMWo86ic0icvYsB1XJGwIYuaITF9ai31jY0ktoEtrQkpyLbUd4+zAoLMiU7RBfmc8hx9zeK9WnUB21V6pRtB3p+yDWt/QiPUXorDygfK87VIJMJ3hNZlwCjHgwt4qw2nLAeGBZFsKyqAa+BcQGSmCRKTN3xfa5UMg688j0eBgqPMiCqu7I+qe+sbL1LnJ8bGpUF2Ut4j9ttl3Q8L9HqGa/g7mKDJSVq1DSjxQFrCtq+CkkQ2HRZtTNY8szDQeepozKHDzHty04UTAhsA50r5+mM8BMfvRB/GO1tN3rYkt3R2edXSO2d31yY3/sQf0m5pDwdX38EnX78woj/KG/Hf8G+fg3FaNWFRRNVPQLx4LX0yIBr6pHfWLybA8yzgtmTMuBt+ImBSHajQaOskVEWX01ZT5VKVxUFdrxM894rAPIDoX69nziyb1u3I9ixb0PHI7ELT2lz2MfCOnaIgLpHHbxdIsTlsqcZjXQUDy/w2ooCrGjhPOy1JSHfVw3LVItUKqhFh32V7VwoE0tIlFjGoDNinD2luqABl6L0K02c8ovy+z+Qrts9Dy7e2Hn3M3jNop/aH/lZ+XWY8oTyMipEPdELi5TPy795f8Tzrw57kt0H6dF0iR/F9F0ZQEsErDcYMIiVzYoFwlnOAM/rgbR9WWmP1KKTVmlJZWYlAvPvkCJ2zAs9kGuPsukC6rVp8fOvKl2V6Qci5JcrwyagI+h+pTj+78suWG8uyHgPtg+domYLb7KC2bFKdpO1EQ1qiJlMNoGqDpum+WwJ1dHiLgxzlJieZWpEAgMv4W5U1YLW/ee/lTrG6pef4OtO71IePoKPwbrzgdeHwLpurk/UIumsgt5tteq9HkEPC5+OCYJkMCT2xkCZnnOw11IKN7QsIGIuBkoCEMrkYINUjVNOdj98kkGC3kEWREDrjESHz53GR557hgGk/Kz8ow40z3vv0T2YDjSpBNhkauNMlFtFkEJREj1u2WRCdpGyN2Ls3dLZSLAII0QxioDPQV0NOs1Jh8c2Dl097q+bh7bTjZxUbpKf9ztfuwSK+sC8d1/bdemRuwZ4atct+4/y9fsftaMw9Ab6dGO6tmfUbTSZiF2UBOYSgM61iyIyCmAHTkkY4TMpYpJs2NFq1q4mNMAdrEUq8w75blf64wtXvv0CLevX3eI+J9sqJo5E0SN8KP57aM2aSx9t3Tw6W6lVe4mvAJr0YTLuBE6x2/ROBK6JnsguCFjMJlDG/TmecyY9H8zIk+KneKqSfWHCEqHVLaCIy+ksc9gxNKUxgsVfLyonlM/f+Wz+lvhPJHB5LL8HHTvxhvKlUrDo3VGo/8W1EzT7BrrjKvvW7w/sW+g69o25Q9S6IdATv/BHmC9eG5UhsPL5vGYPL0gOh+DxgiPOmRrRkNOgcD0S7z0LK3hAAw+G1TwJhoxc3eVBa9qt9uelrqezTH1tRHyIRFC/6YPM3nNBa83yNe5I4+vTfTUvRLMfUo4rJ78+i8d6l2xFPZTGPftGBEXlX2P+9mdsif+u/Fn56Db+L4wOeZp98nFdolarz6dDTr1O50zzO1wgRCdjeif1SC0IozNJe1XTXCuWwrSsiWEoIcJtkeSyqsoVHJkfzmEPcv3w9H2NeyD2Mdq712aD1/pP5ft4KaVf/BkaA5VOmpu8Y0XAFtjzBL4J9sauE3jW1LDV7+jP4Hf6JpT4He6h/U6vfU+vfg8Y+xgvkiD4AIQLRMExRrTUh0e4kdr7N1OiTrBmEVy5fv0/eBEvBZ59G76nsO/pwHt08IIo6OC7HNIhg15AovqEyJtlqa3mkk9ywv9o2Pr1X324YcNX9InxO/BSVRaA7n35aniqESKTLF7QiQYAFlS1kQg6kxkTI6mN0WuUBp1oQ4LW5Til7binuRIhFCYhNgnQhPi+RxYo8+cdR/ce7rF7BypXLvDV8TXoTSWi9iS4DOs+z+5xOrn50c4mnVVntxNedDqR0WqVEBLAJZN5QXDZYX2jpTZmMyLQHEa7EYlOg2iojYk2QUZWNl8o4cGye0O0JI3e02ibnIPiaC6GSoy1Vh0aADbRJz1ErTr/fPxp5YNtLyIF9OhaNFB5HG27cvFrL+qjNNC+2i9sUB5CN6O/qvdJtPtpXD5Xzt3AHYyOr84TdVnmqlJZ5qrSAwUOR6BKlyd06uyryK6ojZXKA2L51bWx/Pzi0prS/qXnSvlg6ejSLaV7S/nSqNvfq7TUkJWZ/Xb6pXTMpc9Kx0aSnp7tbkdoawmb2UALaURDYlxbolCSolovqQJbPztS3Lbt1f0mmgusyrFakafOamMt1QRdcxOuxJSt8hy1AX+AzpDVLrXgHKHh5ph9Q7dfFq/Pan/fLatWKacfifbq3VV32PnApid6Dt7/8KPkclVVdEzFkv4DiuJj6+qJssMwDHeV0NxRvQoRN2PJkhmH9igHBb7jupkDRkg7Nm3ciNJQtveNunGxHcNiPC4ZFz91bNdjD6r0HQw8Mh54xAXRTC43I9rJpNe7w6LosAbdbuTwWx3WvHzZ5OJctbGg3gZe0XGO2Li3uUscMYEf5sAOd23MIeMM1oi/VXn+7NYDnFMmxWot9GlGRheRw6wDMw3B2OwKquWRpB00DJ6Pjj/z/s2PbAwVnn9dKZuPCpB18YQZs5Wfvl88YcJiPBZ9uOfucT02ZNRH7rkffag8UVcXG4j+qpwYXFc3RKtL6sDuOPZg8vgQ4NyRyaOdy4eolNeDKZIcgpnOoeZBDHj5WtEIx9xzwvQdQMZ3VL4AP+AeNAPnP/34nxrPPPUULlT+pXwJQvg/rz955ZMLdK0MbS0T56U39ZwGQZJlZDALBsHnd7FmZZKNQ5SUBmyQa2MGGduvRcpI645pTMCcWogCoIVzVMjoWWNZRcY6CpcK4ToyDuD78UcK4Sz0evxnCiX68qbXn1ReBGG7QG3Dm8AMXzA4b4rmgiqlYxF4+LnZQtWATQQIwYkAZ53ChozNGuE6l7YS0p+QfPLFlX/gpviTODv+MR6XkHPVPp9q+pZ8CjKeTfsA8kR229IMWVlpGSY3EXNyM8wms4l2SvJyMgQ1jtqY187zYMZrY5w7pVD2+r3QtQ7g6rlV6NpFs/AP7vPIy4V7y18bM7t5DrNWL7t45weuZavaHRo14tXWhbKWLdPvP6r6PJOUGXxndj/HQrs9mcxmA616MxisNrNl4AhzukGk+0uL3rQdTrSoa9mTobnmDf6nGUH038rt5H1lOKpRLK++So5u3nzl881/fv55oN1JoB3tEW3n2kXdBBus2Co5GL1slEJgvdzanc8W3CxkEq15hgSGXHKJKK583X63bXS0/6jv0YFGFwrkjRs+aQ6+dWNc2Nug1it9q+oKkKPf1V4fwDOvsp54FdE0vdksIGS16QUT5g2gTw0IbJm5mVFYSaLW5UyzZcAgunJ6F75S1gGLvBpfuHBhw5kz6C9o7/i949EVZdbevXuVlXStWbB2PdNT0WhQjwWa9TS5rJJkt5tEYBkXxladTTIhdUhAhM5TTc15Jq+Ls1m+7JJ4SL0kTrM+NQg/t1+5Ih5D3n0VVlfJPmR5nAhky+6e8UEgzhdfWLrtUVxy+Tw+OkebRd0I8LgY7iVRtwlznMUIAiJYBKvNSCw2EZsZGDWtdF8kOWYoMWIITaCDhY6yoUKJQUKwUGKIUPLOIdNfdWwfNibq77DM+K6cK+V3kP+Ad+Gm01GsehehEwtFaWBM5EwDwQml+99y1EomL7t4UB3ts4XEATZIBR6P0pEb4vfv4xeRhIKfXnj74w/ev0j+kxjF/NwdD+7ZtPG+AxspDcq5qbDuf4E/WRz1EqPHbneJRt6fZuEGxiwgVuLAmJMeVGrNKlNH/am9RXW0ZDE7RGFhxdIUgqkfXpw0zbz7GRRETgoCG0F4lmTduX7MKttp+dOjf//+h0+1gYVbVjIbltP0Pv8IP4pzcH4ui4tFyzLkgJv3Znp1JNNuNlslvUDEcLac4Q7waU69YJV4oJVzYMxu54xpA2M6nTa6zlus1llSJvVUpTYaYNmQnMzs8vaVeeWeikim5NJ55Dwxr6wSUVScWTrECDiZjqIeO+/9Df+NS0ZMfu2OH1aNjL817OInqwfj0gFvl/3+3UsLxj3SOFBJe23uiEceH/CcB/292/oDG3Ffr5LR9a49myg+6bC/DaAP/VwO145bEe3Txgc6ypSWxhWE7PYCnY8vLMrI9eTWxvxtwCr7kc3f37/Cv8XPm4g/mp3Xy089Hb/fIDs97jBzbSym67g2zKehfURnX3WNJSUzqvkznoqUWayZUrnQfBEk4cDohw7o0s+6oebL0wMGPvXg4SMHzvQffEx5Ad/Xf8SIwUdG1SkNvYYQ5Vl9Le763CvMY3nqKcpvytfKVydO4Bpv3kcXL36EHn8nvvjxB5iTgrn3Qcf9yu6K5XA9ojmZFtnl59J0Oo6XXBYxN49I3oA3UBfzeo1+l80YHhAzuptz3tfoIM7mZmlaX63lqCwHVoxQdCSnvbmk49NNi2/fefH5Fy7uX7R4Y+OEkc+HPp82Z96M6bP56jWNXt79wqaXLv753KaXXHzgqVUr7kS6eFdkXr9m9V13slw0zuB7wz6aQSolUceZdWaLldMZWBszddy3/U9lrZLQsHaYjkaXyCYqa89RqcMZVBDZcPPP6HOBP3rjDNA98FzOIuosOqtNtBhpFKFh3uq56j5F1FvUKEoF+Dkq0jjj/Q8ufpKYnk5pfYHOAANaGxN3sjhkB8ZxyWYjtcE0iGcegHy9O1mh5kFfPpTw5FY0oLdO/teHjeB2WCcvmD+Frz517+4GbFWWjB8z6la6bhUw/vewrpmTuZujOeAOCUZYTBJkk8koGN0eCAW4ATGXC+v11gExvc2EWZjUcuRPakse1cWkF9VyJTrUUwr7klXRuEZ5+QIa9tuHb6MnGr5ZvWjqbXH0ulKBPogg4b7tl8+j19GPI+tH1at2PRW2G6NZJqNR0hngjUyIWUfcHjMAZDCbeWS08a4BSe9RC+Cual3PxlwB19lp8s2TAIl0bFBq3/7wN+XwBdTxSvy2qYtWf0O9tcvnt9+HhAj6QKlYBhDRezhgjnkv81/zog7M8zpB0BsEmeg4XWohe4qhdWrtXxvIOOVwg3IY2PfKTeQpsCUHgZe6UZtOFjC7VsMN4zeRsyBrhVGPgRPcbouD49PS/aDT/Q6D0TAwBsryao3uDGmHGOC4lFXKVpwQr1ANPjZ1QfuTe+KbyMDn2gjtqvrPqj/xRrwYWdqMjK3e3iAegQAdk84HF598SI1JvADDkwyGDNDntdG2oUAgK8PgZ8D4M4RwdjCrLpaRVhcLZgQzjP7rwKZdnGrbupMoui6oiDnPchgVoy8ZzMpgvDEF5l+Vrxvhv2tBjjofxIWaP1vTFOM38f/mCmhPSz4nR07nDIbMTK9kThfatvEWcAV1YJPhJ6G6WKakN+gHxgwt4L5qhFWCxBXXADsJfXni90DxBxc9sa+Z4HOHj506fczJC/Fi+pvj++Ob8G1DZs1de0rDoHr7tKVb0kmHvbMP3XdyyKwFa1R/rzvw2Trm78Wurj+H99vgfTv2vp7h/Szo6a/ZXZXaRE8Sg8fjtNiJ4E+jPUmo/HIS7UnCoh4xZZpPMnt+7fldKQ58y44kIh6see2L1+8qQRXxr/DXyiOHn1T99XHDp45djwo2rlNeJI/tUP10xP3Y9E/yEd+Hy+NWR2/m7YEMzunNNhiN2c4Mu5BfwOWBFLmiLieIsjfU3zXTtcJFAPqQLbAigI0kEAiF0mpjITtnmGWA9waDemsvGYyANW1+RUOSeqmqKjEY96oW5clpzCw3oBqjZFv9vOSVRfx8x0UTxw7aV34keGHHIy/uWtXqLTpaOyA65DHX5m3b183bJN6WeLdjLbxT8c5k9xH7cm258miaz5QfkvNtRGhXCC9NnMMe0NH5StlsQ1QN4kgdF9M8R6msgh6HJ/rFu8DNVwu6NQyKkc6KUPbQ+R2GhYYXZvX01W/tXf3S041/qu69td7XM6tweGhY1dxhQ5dUV1ZWLXZV1szNa58VXnNyxJ1d79m/d1vXDcNPrglntc+bW1PZc8TgwcN70ZzeCFAMtwFvCVwgaiXANqJOwANovK5ZosTRJFN05DZlWwNTcmy8Qyov476MFrS3I2E6NByVBBEjEdHZhANiOhsWE5YlZTKh2q+MJw1KMTz48nnaazjxbM1mOkShMjlH5kUmB51pnYbPBMGqw6kTRac/zYtMEPxZTSaHWVTnFkYiLcYLNqfSaFlMFpBZvaZFuxuq15/osBNs2fGvFY+fPHTioZOP3/btblQx7exCdKvyxgNP4BXxVY/tQ+2VBxefnaKwO1D0bnOA9fEujHo5J5YMkpPILgnoJ9l0EKLp3MkJiqk6PXSNnoBk0tX3XK7uBHj5PLWb29A3fBWb2WjhukUlwouCntPp9Dyx2uhpdSPq9VQMrCmvF4UzqB2tQ0dFf5T7RGrq04B08CKXPDpdGTbzHnTnbrRaKY4sREOW2hE4Msol8vmVDDL+PuV51CWPw02/ARzPAxw0D7ox6hFog2E7pwOe53mr1SUDO7mcFJqTYMbhn2gwZnMGncXOJidvMwQNxYYmA7jWToMTDKJDL+i7mFEvdgbYjkEMwR97z1Hor5ElTaZJHWpc0dwMrkVyVAYuI3ixcv/ae9C7+K/KLWiBsgE9E396+McJtOYpr89Rjs1Dd6MvlDRWnwgYk98ANwvsYICbFJVNeqffz1v1bo4DQmcETU6f00eRsmtIEcDEyQuCo4uxGQvOz17zCQxaZHVapVPY8R3L1YUy1du5iZyYs72aGiO/nXlUWYpGoCGDB8+c+/KkW95667XKf3z545yphL99O/n85/5LvdIaNKH/jcpbypdHlQPDmN0/BvsUYfNnaRw3Keo16jxpgmA3Z3o8yO40283hbLdRQhJFxxDL1CFkx3aPhocdYMdckL3GgFOLxhvXTUMmcmhqEjIxoFZIIKIhdmwURabHsxv6UMRG4cavAJkpFQwxvhDt/XnKjYu6Tb99O7rwCMUGyxQz5jvC1vFeNnfdQWsCbIIRVJjTJVo1qEWAVOBs2k4UXSPvSOU9pI6hTWQevfM+3KDsQjf8igybz50++tq+RvLFrq+WkM/j35w+F8fvgsw3AV/8D6xr4kZELYLBoCOgloxmCz0v7RV1xGxCUCgWmgTgazYLhtfgQUwODS35+aocHz0k1Dg4yb1cE/5b/BTOiX+EJ8PiCV4FWD6At28yWOqjVj3PmUSIIjgTAMNfCxiDQa8BY2DAoP8XYJIHZ85y1p2e/f8BngyA5ABAf0PfzEN1c1DFvCsZqh3cjT7mS4SPQF5qozYLpxOdXi/ofD4j6JYBoNMxtzuNpNnPsnXTUDGwJsBzKqbTkUZUyIZwcNeYsaIe9juuGrxRTuGhapTbffmLg6+1v71g05T9R0/vH7a3XPkc7ev12R1fKE3k05+QYe7SgkH93zjz9IeVkeMLlUf6jUROCu8nQL8fGP26Ra2JGVU80E9HlVbUEivW1ej66widzNRKkbKupa2baaU0BCW3KIZNm9CvW0DDQABEPldGoQManXAQfYMfh3VpnQZlEQE/Aw9H9NHNdRrwJPz45s10x+lWOdDHZCh8x85V0hqkRD5SpaWZwSZSWhJal1R8rdQkymqVmsQdfinZYKnr3LXfU6jb/ehjZPAOGj52DO45L97r7sNAn+9BxnyMPjdG/ZQ+RrDlnMlkQDxvtkAYqUM6Xn8VZa4uilQDRtarXaJmhkxT1i4A8rx0SJmI3gYS/a1eWQM08qMvldr4WxTfroD4SVhb4HJP06BV1KGzbB3SkmubHRRKeRl13YQ+pzS7cs88xpNbAYcb4Dl+rmvU67DabHaDXvbyHOf3y3aSls5bvBbQe+0aOINM7I30sZ7rpziR1L4GqV08wR3zsObzbk8NAlVHnjVgMeD4ddxlq10iK57kmgzphozLT8Be7xhS7/cvKoqPxIdCHTrsiU8GhVLnnRK6BR8DlmjmQzP4j5KIgNB0hitwosVqQgIAd1JHb94BaGVl10p8GjRI2BQD0luxCCv2of+Iq+CxFQfi04AYLw8aiTe2WMtC17IIGCOzCIoB6a02MxLpWnrhj9ZyJsbSs5H0n6wU0X/2rxQUK6V5fL71AOl4JQPfO7zXldfVGH8d6ITuoBNoTTroaYdoZl32DLakKioEOZDZa0IZ92o9TZMrbIwUl3otiO/e9NmlJuXzS1zT3ace2Hvy5IP7j5NPv1O+QY6fvkdm5efvnnmTivxF9S6DE71OnhH2g++YA9GjJ2D3uAkfBh9J53Tbxdw8pw5YxN+IbqK1BZm8JRNenoLYg+eKW94RvyrjRRNAiWmvWpyh5rw8qQngiQPHrhrYc8gtDx9//KExQ3vVrRwVu3Xu+Nmzb53Dn1g5a9qBtLRHFz/X8OSzSw8HPA/OWbDk1nsXbbvjzrsX3QuwEyDuj7BnRk4Cz9dsEwTRBFR0OG08U6s2m6jTWZ9jNNSBkIhMk1wzi6TNtaepJB21xaEy8mPDLuVfm9D9Dz+x6a+XEXqX37vpEWUF+Xz/pmeVVWwPPwQZCmi+0KCobEbI4AAm5SwWq4E3uD1m7MAMEAcdJyGdTbo/Sa1wdTYp5XSb+Z9SIr2lA69HPaskt/2qfLoJvfLwE0unIdvpvyjvosjoWaAtdikTyOf3r52+Q1YG45ceV3aNVu0PwEn+zfziwqgZnBgeY9BXvMA/l4QIa6ThUqvkUWI60tG7lEaSLgy7cg+ZMU/VHx+A3v0FninRuleLVeCtvNNh4c+2MOfF16h7TZkpojZXwLecfm/TqttW3rnpQ/Txa8fxovi2OzZuvROPi9/X8A677/9PoPPnsJabuykaMBoskl1AnMslWIhJdru9ZpPJ47IIdpmYqJxakJHJaSRSQy9eNRcMNHfxVTt90MCRqiwUcVJN5XR7nBHy0aFHzFYbPOyRQ8pv977uDTy89hFH9qsQWuAF7eoGBW6ti28AxXFi9nww+Du67SN9VTlyAT0+5X9md8GmRaVCCDky9fn5smwjpKRUbANiE3XGRJGTbNagtdhKbMRqlSTTGXQTqxorPeXN5rKZcGUGEoomdeawFtq3GrGmErQ9BMjJJjaUXRh9K2V21TlsRXms9g+iZJA79POsmbsOPdR3wIA+upWZSLdhU3q+0x1p16OjwBcvjt44udPaZWO7oI8XT1m0nJA2o/tV15jfun2Z0lhVJfQ39ek7pPfo6PQbOmPSf0BNV1WXfQu4N2q4j41KBZl6vctqKyTE5gLcC3QUd2OsoICTWqBclEC5AVCmOJdS81x2jUHLqRlNqlnUJECixEGkyU0pWc/s9kQ6I49W6MCOeP6qYdyvj3FlpvJbKsZtlnXpNrkjxZj/OYlxeTeKMeqlYTyw7+guM6qTGGNUCPju5X8CfsziekfNHtA6gYAkSuFs13OwcVZUwum5THTTyZhJfwawIhDtwBuOMA+EzTtkf9W06jui5mPYnLhI+8qITnJ5wrnlKOUCJAmFZw66azWyDpoVRrr5PD9fVNYPqJ80atTEkQPx+N41L55Hm7t0j/S4U2kzvkObAYjsX7/9wR133cXinRKwObthn/K59lxHbnc0vTxfpy+AWIfrmBEsdDqDlnBHfb7uhk5pHXI6NFKQCzzsn/xyuoWeWH5+sKC4oKaAFBSYQjlcBrKSjIwcwOpUCW/i6WesMbvFNFMbI6czsT29qrRFYm7itcpaUlpNqZM1WD7Kk0hKtdhz7UioUqtlB+ZWO+JX4ko8cVTtGGlqzv0z/9qzcvOtc+bsfuxgn7q6/sZVmcpPj3UdsEs5g1ffsXJit5oeU6riV0y31A+5VSCrzatvvzGSOXrwk7fWJXmhoqv5rbFj0X2SjEldv07du0y7YcPiGYtnJPlA5Dgvl831jFqCgt1u80HUn5PrTmd0c7jPAQFsqAw8URosZtEfCriZDWpSC91U5raHqMy6rFgOMwWpizDsW9z83av8NGhmmE4jW8AvIYTxxMoEG5Cpyuya7o68LC/pMJ4sVt6fBmzx+oObtu3dsfkuLhXuJP8GOPD/RLvGvxTe/9/8W876uF2ffwF8tORa7Lsl2h0cxxuurEvh300q3EGA+3HgXyebmGz3c/QsyuV06iyEHhhQ/jPH/FGDuZffb7TbPaqisaPSBlE0Gon61sisUkq3M2/LlH3q2JdEgjR11Mu+yeMobwV3zz505Mg+1G05cE9sokD63r4ZmGdE7NVXn3tdmSrdwpikGWbanXhm1O50iDrO5zObdQ46CtxJYbbHbI6go9gBJsHhsBlsbhVQGyqOWm1iUCwW4TcieKMaBgYqVKmZ39T4tAUaCZOgXUMDcdESp6SdikX0W4qE8mwCidUMiQaKA7C8igNCdYDDUsAhi5sbdfuJbLTbgpmZNo9opMfcosfr8aq091DaezzgADmYJbPbLaABokYuiGwkGOS4gIoB17wHFINmR/KaXeeaD0xpAjgxQjQiZyXT2Hj8qnsmDO41ZtOsv2fMkFbVdH3v077R9dnTMu5AHy+ZcvNEA9aN6TF85mnr+BvaLxmzKdp1XnDEMLV2M4FbmJsRdfPEJVv9hlDIn0HH/mbnBGgtEMXNFqNzhHqZzZzH5fJ4wJe7idXWlrL4EpzjMTwEf4kQM2VkJrNg10ErccIQLi8rb7lViQqhSXPvyJiWvT7a99P3utZEb9bNyPj77LvG9hg8YRv6eNiI4Lyu0U1jlrS/obzEenrm8J6jddgwqfeUJUzGubNgo37kglxbbkLUnmvjSaas1wcCwEvtCn1nwEY5uDAVa9lBZdzMFdA3BvMZlmAEnKIGQGoWjxla7ZNoNYt/a08kR8OoEwo3dywAS1ZRGbEhcPScqU05Jizf4Fzq39CIez5815ING/rNzcQ6PAeRHRlTh40aUjcmNu3spMGOGf+19N6Xzr1xrnf37JFEXh9/ev9+/Ohde+/au3ctqyfEuA33Nj7If6HV0BoEhETq3eoogpgGxSdHYJG5U+cTYXFCXcnhcjpwAh9cvHgx6rV4MXkwLuDLwBMdwF++D/SjiesS9UB8T8N7A4d4lgMx6hCQRP8cPF9AZc2ufE1yoKKjSqWImrEiKeG98NvwJUtQ17uVv6CO4K+P7Kv8yLvjc9EcpVHpq/rqy8HX7Qf8mAMWRbbq9YYcLpCezhlIbp5s9VohkniOsZ4D9syESk4GOEPC261Rc46tj7KQpNIdwMiLeGTVnHgiFYlhceovcdsO/fqNXELmCjh3fJ9Bt7hw192zxi/u0L/fCID0v6cOWzJX6YGHHRwT7te1x81bV2xWePrThQuUHkyOaoDfNgPcGeCj2z2S5DAAZRwkmOlJS7N0sTKY0wBmF2U8Zgx1Wua0vZbDrmnlDFA1nOjIdS0UZLL5XEGbtMLaG4cOnbiUAt5u+sClM9CWd4zzTJNw+bShSZBru6zYDCtlgKwfBxgNEK9BzG1nuVG3R0dviN3EYsRSgMvJXuNrxtz2kGbgWpjj40rDrsdQ76MPrBwxZdqYURNmjCaTlHkvvYY2vnyedrLffv82RqNqWH8brO/hukYtgig6HZzZYfb6bG6mLZ1OG+iPBkG4lqZXlWQLc9vywC45pIg4h469071c3j5z54GDu+bvtC41DbvxaTL1wTs3GmcseOPcCxfWzND3uYnO4yaTGD3MXNuopUW9SOryf1A0AntQTFFeSZEnkyiuFGeKK6M1mQTPLo7aRMEMlIZnc2YBY8OZFhSGp6dcFE0QOaJ6DSptVzbTFGj5QLN++4n5XuB2Bh0CyIoPtraV82UGfjMAj2nOF/8Hzpe2dl6YyUUxirgysHxt7+vRG3iyhKAFBFywrGlD1t+xctDwqSMS3tftYk/lMbJxnYx92W0cN9Wcu3Bg7Y4HdmzaAnRpQJeIV9jCZoRaTFarXuAEt2wVdSLjAZNBd5ZpLkdLLjwfaZkjoLMww1k0YxmpjMi0jIDZQuLt2GXb4OHZdXfemdXWX4h+kI6ieP2RI/VKsLKdgckp7Mtm0JcyVx01c7IFqCYb3B693IhKTlkkSVMvEixsTuYEWtxYbJ4qRN1TT5gGmOpQoaepJC7h5/G4zYxBS2fwXyjpMwYvmYueiR8+uLpPtxWb0RWm477FHvIZPwFgiEQteo6HmNDC8W6PDIam15MxAMpATw1OtKhSSK38SJQlVMrJYoRv0UW6ljIcdzu4um9X0E9evLUlPJp+/QT065dcLtcn6swIyByXS7WsITdA8vJz9QFKBj7Ll8XCUtlh9T2TpESkuYgtRU1pmZpUihQjlSRJyiTzHXi/pmV5hNuO7U3VbOakobPHMT3Lf6mkUz3L6DUmPLBzj5u79qNEoz9euADRGebIBrbpLOyfAaydjWDECQC8gInRpMfU5glqvjxS0/ook6Y5IJByRvBjW5X/WX2gxOp6ajX6Bl9WbI+074pDQJuP0SfkR9AHecCbksNtMPMkQPILAgZ3tpsD3VR6yifS/ncgR5maq5Nybo+KtfPGZt+mBuXlpp7aN3vVRSjPitGmyMC2N7TvXJnZfVJs5epVK3Paj41mtQ928nRsWxfJ69i+201lleiTcFldl4KhK2eMm7hw4YTCW7ovHVqUHagrC8vt6se0dYKMhEAXPAb22gWR7ZioDG6OIcuexnF2R4ZBKGjjoFU7LIMZDBKLJaeLgbG4Baw31QyE87KwLCW6qfmD5peINdiijRMkDTNdBtJmsdHeb1o4KsrksYfuWVrP80sf2HXnXTvGz43/mDv7hlvHLZg5tG/dzWOHE/3mPTdu/jPPHd61av6JGnnzlbTcGfUTZo5zjh3SrXbqIthHP+B1CvZaz3WIymAveL2eA43DcQYjzeKx8xHaoLA9Zc7E6UKSLcvUEcookoYiSMK5yr9Xv35htfKvs6gQ/x7fgBfEBeU9FlcxXQ30Az8d4kG36IV4ikvnHI6MdC+fGSJpciAQ1GxkAKgmcyoF5RQbmZIABm5IGIo8qxqxk6w8DyjTZCI4rzwEpqNn/3nrpo165Xik4oORXbJPbH/g+O69H6KfSEW/AwPbHJ696HYyWfxi3JRF3Q+caTy47nzV94PqWb7pE6DLD/wvYEczuQFRyZbB8w5B8FoMIBWhLDntOQ06qv1LT2U4RAfjWSJSWRZUcmmjn5PnixFVr5appZqg/1m4UekRQXQ9kj1hA2SpMyI/PP7IvP1HdqyzHh0/4b1Zt6/qWDF2xniy6IV3DHSOuPja2X3vu8fkK79t3ySinShw4fj6e88q44WdVH713DnyMv9voGHvqNeIsOSg85mddthY0e2xEyfHYwloXQKWU8fwABzg0xiVaxOja1qUCqtJAxJGLD5VA4ggSDlBYTz17ytRu3nFRekOyZNVXNWrakzDit+RaxW+RynEPX4aV6Ebab1x8UV0m+KKn29qwm2aFuGDZLNdR3LxhPhmdu/tjaZFJB+vsuvwPI7TftataQrZhufadcJCTtB+ZoPPnWU/W6J+DiDOUm4hj5HNTC67Rb1XyWVGBghkjuUZ1A0YKnrSS0WwRnVlWUGGo7Xs5fxfZW/JrgfWbbp/wpz4j9kLqsaOnz9zaJ9BN40dvp2K3nPkn1T0jkfluy/782bWj2ei17MviB7Vs8oY8hyeo/aRQJzVQCes82aOt9kNVivPQ5zUBUIODt1IO560PNrT+l473UzfIlEXrqhEttWPZFlI0aFVyq+l7tWWYjxHyZ7QxbYTfRRvs/HEuDM0hwxrNuJVrEtRr6jDmJHBSXa7FzyE7ByLy6WTGlGXqDFktOmCumIdgRinhkuD73WlnFEfYUOhW50jAM2Yn8ayShnM8w8XMf2LUlwa5KIOnNJQOynHse6he8fqZwqVK3btuRFL1LsbPX7G6F/QxvMvK3PLS28f1WGwbBv/HQpSb28HeLYgj7DPP+CVnI/LgojJbs/keSd4sX4Qx3B2wPMMAGhGXRsynU4qgjUgglFOna1Xk3QsHNeRP6ZAPFJz97ukBO577P611oHDxk2YPBVksLoSZBARKoO/IZ34yvP733OPcWxfu30zyOD6+y48ocrgLsqreqUveRmvBl5dmeBVdg+f3vujFfCTo9VGHWcv8Pud9sxQG58vZNfxhUVybm3MKcOPa2MFBUTS2wIWYqmNhcmlzO8z8cpMlJnJETbvoJje3kvedS5WI+bW1/eSY7CTJVfMf9Cxmnc5JDvUQdKgMbXRU7hX5oJZc1dUPlrdo65mP6J38+LfJ+7vzd3w77p6giYbYo9Or+2+Yz9+J1734KI5B/GxhRuVL5SPvZKyaVSvwiZuJFml3sbDTS8Czn2FN7hCrorOVQ5mZrbPFnw+r8PptHiLwLWu7ugM0zHKQbfbVhtzp6e723rbltbG8travcgo48ramMAmPDS706wI9jbmtl11gYw52c0+fl7YRUWjXFLjCXC0PeVq18rKCAh6Hi2Rod63g6Qeb/ZV5iw9GMF6fEz0+/PSVuOpgyob0l1Bv7h6+JhKni97aMmbLzy3aN39G+/ceedinBV/PXZrcIWx4lFyRV9SPOk2YfLjuuKSOXPEeV2GTRqufKt8/vc/Xfz8LxdeU88yaP/zvwFN2nEduPpoSaEYaWf1+XL8or+qukB2ZQeya2OZrGN/wBPw6H1IX8EGXpCS2pi6+8n8CLuAlCBEc5MdSaOBOgJdUtOleeXXIQLNoQKDtEiiljMc0ealh8owvgYRxKNEF//bonU7N2zYcefiY5OGg3x7ccXwsYsvtiTBlR6PVtjntUGz/v6n9y598Opr4ANugLD9ZsC/hBsWtRQhqzXDb7PllJZlFdDpLcFYFuLSA+nADCY6RdnnqI3pfTz8sRUFbLbmVvDA/s2YJ+fEJooFIs340RFRzajT40YtbyRTNUUPcUIy7oaSuKEGv09FuEL5HYkvfNbrkTYZTxVPmlKK/kmOKotUxJSx6FMVVdRts+/Noxb9VsFcNKneCMJOmiBA5X8DWS8Cvu/K3R7t3gnUlUX0c8VFRVGurKAgixPzxfxu3SuqPdW1MR3pTAbEciyds0rblg6I5RkLUXGUb9sZ/ogZfqfHbrcVaLfAWJCQuHimnt9pRx/NwpBIDzUXXrLSx9ww1XogEJ1RZXn71EwN+yeAgGBMMeqy8nzIHanUTB2duV5Z5qHnXM71fds+6tettvfvJt4n4qzJfYcNdeL8mYMXTLDwtwcXHO5aO+O2Xp1Ku9zYV/myUz++YuTMUvRuAVZE1OhN6zcuGH+uzYqSCfVjxk0ZfvSdhQ5pW5XSH63D6cpo3C6XP7Rr6eHDqPb4Thys3bUU9MdnQMdvgY55XIQbF43ke3U6u74dx2Xm6fPalxuAhqAd7fmZ7VC72liuBeXDn3R9OigQb7rdaeP0rO61WW0Ua7RK/NPy1jujUhHJAxKAUQjTlDCQKQM3E4jVG0jI7XF7ytUGMmRil9UrllY3tCtcveSW1PL5fqtn3hIfNPrI8RpWWo/6GvOLCq2KF/1k6phbv87+1+Yq/F+zly180KucwLNcnWosH01d0P4U4P4nZSh/M98XeKgjvcVcka93uTLlYtr3v1O7stpYfjt72Bb01saswXRJMoLlcOszeQkMuoRtJCgFJSyn46raGJ9UoIxvRo+qB9ZRqaCOnmqR9klJUgRQUopow98UBSIxusgpylNzwyv4m5U5vw8R+ExNnLzhBo8mThHxGOIFvmTPqlfPP7fkjqmLa+7cuXYp1Z/P6g8c1VOx0i94SkeFiievPFLBl05wjqtX/q188vmLw8/t/MvrL7P4uoLOtQSeaMeNirbPESGGcDq5wqKAuzZmDoAq0dfGJJeYwdtsgWAA20nAFrA5c9q0wXWxNvYsm5OqEJZzSFazNpMjRYMCFdTu8ik0aKFJ6PywCBUeHCnz8PKscfvP+4Iq0unhBq9LRbo4zfdYvl4oG3P76EkTyHbnT2fKDQxT5RxaIzJcT/V569YNs2ZNLpfUWn7W24P6CYOjxRZqGfxibl52ADY4O8TMpDfNksO7bdnBbEAvG0Jn3i/zhroYb0+5l3odvNSGfgCx/MfYoc9Gnl3ZMSf7httmNGP1RBIrfGzlMxOMDxk3Hj7eGh2KA517O56/mavkbomWlVTkc/k6UcwK+VxpFgvHhdJIh6oKn6e9RSrM50l7T3tPBsnIqY1l2Imx1fBMJrQeVp+ZEv2x1Lc2Hw2lZCap/SpGVDBl8IgTBwSJ2sUMHEzgq3PzOV9dfP2j0F7P3SvXrxg0ceXgtW1vXs2vDb77+ql30w/Y1sxYMq9t32ldbt5QnOYRV98SQm13PnzHpuDQAYMGde4TyPHnTz5ZUN773geWb3T16tv75oLK/KBDzs+IPNLuBjXPflvTD+Q3YRD4PtOibQ2Cx9MOZ2UFiorznU5zbawtWHl7O0PYzbe1tQ22hY10tnW2DaKgn1pBCzhEejZMSSDIxmnJuRSSqLtb1jZVi2llYuURJxsMKKkHcRGVPHJzvUYnlJeU47NHqhehJ5RaIYLVTRaq8eBb1h589OEDB3LVvS4gRzcjv/LlZmUbZkKqwzv798laX7T+3u8EuuMEtaH4HtLu2YW4W6OVMtG5eK/OmxX2ym4Z/Dumobg00FZY73PynI3qJzsBdcWJbpuOiKQ2Ri1cMt3TEseW2podbuXROvNylGTZMo96hybB0WRw5JDyAz5zZSmKdEjPy1iNZw4uX474+DbSQXm/dxuGLzqepzy5cT1aaKGYZKJOG9cr9zlLAEvmqx0CHdwJ+DgIu1gbLch0GwwZPMmz20kGKSpOS7e0oV1GLP8Pa98BJlWRBNz94uScZ3d2Zmc2L5uG3WVJO+ScwzJkkHwkQUBABMQIR1Awi4piAAVUBsVwYj4V9PTOuzOcd3qeekHRU8+7U/ftX90vzJvZBe7/v18l+La6urq6qrqqurvajdwwnT53AbluwnHIoZ4CTWrPJOp3s7KnTKhoRp3epHYNNeuzOtweLe4E88qsePTXkROujfOkb5nF3/7y6dfeWH2ohjFwDwnHh26bsP3ytbsnXTmUG7FjS2jEOOnlo29L/wGn/GPpq8VzIrstTYfZXvjVn3peeWr+qx/98QWIBck5zw/Y7dyDyIz6dD6DG0zZ00UiLhJbRUYUjQJ5X6GhNtlCHgg63+Fbl/TgunV4yqX4AzxA+gXzhvQuLm9PUl6uAV62gXxEwXKPS1UlkMts58RKCH7sogXx3Wq42Ni0S7RyXKG1sAy83wK7xQqaYs1/xwaEoyprC5RdsGZi1WhE10rFgCf6zpGHqmgoqjsQuObyP26LVlS1PNr+EFsi/atbnxk/m9Fny+e7dn+yEX9527333XL74UM9rn1/fbR3aUXv6ut2XPNhorCgacCkS26bv+uDS9d9gD999L4HMo/fd/AxWc8rO37Jm/h/oHp0TWpIqKjUWVlZFC4oiBcWIWN9rc1WZa+rr+c5zl7ENiTr66txhTFWHBuXrnQWhriAucrB2mtLE6jYEXCDaYcQiLNTT69WPtn2SpKcK1NMOT3fkpOaUcq0aNEPvcoQwfK+WxXEqeRvrKr7ZWK8uVSf0ydnd0WcZM9eNPXB+n74KuOD/wgPSAxMzxhWV3PgMsumKxuXv/kmNmYYPOMAN9L08Mvkwt1tG1/qPbZ9J/5JOlRquyoQHvh4t17Mr7d988229iN4G/OpdPlM3EH3oyAIZOtoDY6alI8zGLDRCPJFa4SARDFGL6kZ0aq7GqMtUnQ0XuK7x/H+ZZlVqzLLmMX4ban2KqkA/4XE2Apul8DfRs8e9QP5+jn4SxEaYc9I1VbEjeEwLiiurHQ7ChzdamBO3BEUgdjaQYoEeYvGpv1enxVibqPVwdlpzk6vs0mF4/leIi3z0qjzgMAJ8MYZbV8nnvuec7+lmt/z9MuW0aP80nbiIGWWMv02XSa2/8mwY8+ua8xMoXEjs/g71ev5x3+vkgzgFklpdqe088grzz/Gjjv60BP3gB5NJG98KfVthqUSIZZ1M0FBMIOiRopCcl0bA3DXztjB8Np9AuFxsut7I7qrmElFhWEocha1DyYD6QNW1uObuPAEPnti/vw/n3nt44WMa+s6ybVOng46JRufeOXlkxulvdt3TJmy81qgsRJovAdojMNMgAdQacYxzuC2W8rKfKGQ3RDjutVUBOMoTqI8hCJCBMxnxOe2G3iBh3VRsCtvqCWTXVx40T1Sp84GRDRE6W2YMJykfoH9ZFL8Xg95FFw/lMoZvmmLpf/gV0avCzOjwutG419K/1443TdrJJa++cvH0tfDmV67H2zf+wCzeNzuBTt2lN6/Yf0DpTt2zN89/iqX622pHaN3EtLNz95lsdz1LLFrx0DuhkI8m4CIdnyqrMoVDocsLKnuKIY4CGvLYWjFjhBmrFa/114DNs7u4030fSZeeZ9JljunEqnkrRIOUfeKrqBfIch58C7yF0Nnyo8Bb2odquYxMp2zFtLZ3ZKkPBDsURIY3JdSusucxZUwxpUwRmK7p6bcMQEiDnsZstnsIF8sON8O+lJwodcTJO6LO+0psGFDpZy3SHTKW+Tdy8tmEnMSFvSr7gHh/CTFRfokRUZ5AXnT5HNlJvDzP/xKexI5NyeB26Q2di3/Ovgu41NFRRi7RJuFDbA2tjjuC49L+xByOB3jwIux2zAdqc2bN4WK5VCTEcrAtNvxee8gy+eMFBc86WXunSh93jSotnXTrFtuueLqEd27xQf1/Q37xE9/IQTb73buW8c+sW3Dviss1xkGT5+zjc5JDczJGfBN6lBftC5V1iNss/JVVYb6Yre7wmCwhtnWVIm9QiSpxEAk0jg2HYs4ahgyPZ50TU3AFOg1Nu0JeE1O8MlspgL1EpBq/vL/rq8dkr3ELL/REpezv8QFjzob48osurTDObAIKa+fsd2z94j6YvYDiy/kWyr1UlwbbGWSj63T+zbYPL1/MvpG1sO5WagMfLRA6kH9HNzr6KLF2IDDuAg7wdHZJzYdbn9SWjN+uYEdpfN10D+AV3NAfv0gvQEbz1vNomiwWCFGZJxOq9fABYJuRFjjTLsLbGZe4DiL3YgNXs5OZ1ktgEDP4GgTnHTmnqUns6u7a6POOttrU5l0w5WZDP7gN9IwPPViKqnSv/atw2eXSZv5Mz/NYaxSrdSgSCfI470gjxX0fmdjysKZzUajXRAcTiuZvsfT1gIRC0ZKmODV1WHO3sPkFVFTNQjfW9W4eV6mTfq8W6rDsm8df0bWBTPw5iLgzSsQbybR9JTHbjAYk6giGq2KRBLIyHVvrIpQga/yFpfJql1cUMu5ubHpkM/udljsyKjkWNS9a71u60Qllj1h0zn35M1TEfXIkLu+X2rMofxU01xF1eeQPBNxR5472H6AVAbIppbaX8++fn6UZJXadxJf7RFix2CspWhMyumzWm1MNMrBSG1sWXmxIgDFBbBGGWF8DtB2LxfJE4BcHdddRqF0y9Itj1FLHGVHxw7ftKBzpYWpmkB0XVhCHYtsi4/CGIaAn1OCGiAmKe1W5PP5rWwpWW/8XLJ7vAKirbgjZPcXOOpgsbExjk7LTVJ/OiV/tfFqjwPS5UZxas6d8BlymfQPMh19Uk3N1LE5R5pHenHHB3QYA8attFLXhhe6TvKAuw7yfxjmqQgNTtmYYNDk9xdynCMaC9NJsqXDBTb3+LTJ5hDtnD93hpL6M1XaXpk8PWVJnzwG2fZmJwZfv2mmcNjAVa1ckChJ9F65Vn6inswJ23fV9pMlO0i24/mMtFA3Fxg9CHNRAja4O5qbqnPY7VWRkoTP1L17gotwjU1VtSEfZ4nFwANAJdjFlpTEHBZw8h0OkyX/icakYn3VC8p5O7A5rzYqboA+48HkpzqwP8J6uRJFU5beo6U6pszdevu24bosR93Mm3dfPqx8q6wuNyWVJEdqbKi4fNTysVqGo6Z3ZUmiz/A5fWHcW2F+3gH7VIImpxwBs8cVjZYIhR7BU1rmC8sJDBe41z6XzxU3xhlqQeIFRhsdshHn5XeqchKQ8sVXuj40EldAnaqYzkLE5EfItjbGmnqFcO+26vr+o0bgZ6UvK2q6la+VPt53W/dkB7JVjVvG7cZzXfeGF2/56XXpQ+ldw37TzTtOZ46Z5flbJk3mZoGf6gM589ltVohJGa/PxwguG+8PeG12jpjZlDnNWV1WK4JgVE1ROF5S7x3lVDQp0duxGN2hJTd/mI6zKm0PSuueO2vtES/7/tQO6VuZInDn21PlL69Zy7wg07UG6JoCdPnRlFSQ1DxmRIPBbzJ5LRaHUUAsIwaCNjchzZu2+QUjizg/5zeRgEbk7AzdJWmVxYhQmrd2K7dC40a6SmUXKmp7menk0fut0vXKg/fX45KLFdp7klfvmWrGRh69b/9OmqHRT/M/QHMFrcnQmvIJyCWKmOctDOI8XrdA9jVNZC1NGdOmMMuMTbP2zm+TqkW85UROzoQfZG4kiZv2JczTCjXtoevY0h3X/fS+jgpiH9ukyXwT2I4K1IQ2pvzdWZu9VKyp8cZDoUiE3pZq7hErIKRUpWNhoW6ccmdqhe1Ptq9sHTbeLN+bGpt2OvyVCJxYiM6957ospaPepSvVJNcWybk25ZKvTZFI3COH4+Ar5VyeYsjlqTvvPfjh99+uvHT9cvMzNfjKM2/OCMXWlkO8JH15t1EY9MTUi25Lv7x52+BZnodvejAjcL2uXDV+qhMnnn5Uqjkgnr3ZtN+Ay9eb37hs4TVT90+g1VHHTZlN9h1hfv5D3wuvAS+oosITtMbjUXKIlot6orV1hQ4fhMJBn8NZDXLu9Jlj4L57STIIdFYM691c3fnsltyBkwfutMHFyzRfMKZzBZM50Uo3ZXDjGK7pzs1vPgf+/N1N4PsdEQf+Z/vN1126/upbt18qj+qKdb1+Ng37sI9papsf2cv3+qJ9Cb7rN2fO/OmTl96X91bBHv+ef5+OcXzKGRcjbnegAtntATFQWxelpsmfjhY4fePTTmSEgVqMDg6GjbicACX3WG42Ponn7qiq1kmZVjLonAilhdOHKDjcb3DPXus3pCpb+0h/7TpIeQCX2x/07vvh43322+y4nLlLjVFI/fE2XoT5K4RIc0mqMYGQ3yWIEWtBgehnS0BGx6YTCU8oFCOui8szS1ghMEjATlYQPB4WfH2fXXYD7AXZ2v4BpRBw/t1/3e0/5aZKdoiNguLe6+6s9L5t35qdwTuVsS068PWPP/4Nf/iUfc81224V8L+fen3m0G7SrfKgHh2IIziELTjS/nxg+0P7j91Kbd5bMHcfw/hqYXTeQtZncthrKorjcXtINLFCXX1VKZm9WLqqQAiGgiEQ1SCyWulyanXUoOJihKL6AqowqNz7wzo7o6/CpLv6EXVnyxx4tSJG+pEz80799qbLfrbz7fvwiJp7LCunzrjopnsfeGDF/Nca71IGf5HnoZuW7rUyxqsu2npAkjyDh08e3jbpugVzJi44WC3dLvPgUG91zGw7HfPiVBLWJGNhxB93VFbGS3l3xCjW1Zd63B4YogcUtFs3KyikuZuvsDAaheFHHapu5swnHTTZ3OrqcGGOggaxWn8qfs4KsrDI4i3KwO5qfG3+igce0BWSPfjrXUs23vzOc1dftFEeFv5Z9cH5k+YsyJaUvfuKi64yMtYblt30UG/ZPk8BOR5KfbtS8JoS0YgggvMa9NisVjECfngwWgTzaC0qKjCRkyEFPp+TTLwl7Sugl6zGpk2O7P0qXUUU3el+/T0/ZVzUc3UnndnR27DuvhLz49aNUy/z3Vl9eu+vPjQ+Ig/5U88fnpUmPWVdu3LpZp4Z8PRrbWO6bdsk/Vf6oX2goqC9Pv6SaSVSfPQ2xOB2mM+vlbo8A1I+xmh020TRwcEa6HSMn+bEvJ0TqTcE7qqZzh7SJRB0UZzithIrSkcik00eZGMvkf46KzONUCiNzEhtuHwr1/OnOdLfCUXCaw8/DHJ1BHQpCjyOkzgHBYPFFqvgdkesxVyiRLaCPrCCAZ8PuImQzwduhcNINAnlSpE+maGwM7snoTJVLp/pzTIWX2TfOnv7NVt3LV5le7LwvQc++vqrT3YsUKQIj1666O3f//kXS6babn6YbFBIX0ofDzmqyM+L8p0pM/DxeeBjDPVJkeUYeb3h4nhQDkWDYNPoX5xes0B5aM5751zb6yyh5QGyG1+KV5nNvniZxy/bzNT2IrTt2Ny7BdT95r0/o+7km0cOmfv3BLK27z0cKBu9kL32yAnXA+BJkveSQIZJ/akEGpcqQAmIJE0FRqPLlDCVlBoT9oJolAcF9QXMlM6A1yOnETw5dOpPvevLpzmVfR/dvNPVtIbJHoTvKUeR6Q39Eq09pL+OygaT4EqOp0Eks1oVCpAQNZZk3pbflAL5GA70l4CtrQT5SDhNFgdIiCNqsiaE0rKg308lw292Ok3j0n6n31lsKy6UfeHiAofVBrbIlrsxQz15ut3cRb07Ohmq6Gjl7jha+qs4uzlJhKfRffOOq+6/9+R4vLZ9Erta2oIPrv/99l+tHdhXFqAz29bsWrhr6xY8aedNUqZQ2rXwsflLG4aNkAWon3L/9AP2bu5bcNti5P5pgddms/sEu1Acd5FrVXZcgwyoSL1/SsrhBNX7p/Vd3z+Vo2Ol+D09WkbPiJKAMuec48PFKyb+fJv0z4krihlmI7dGxGvHkuunC6ZO4paQ66fSytSgSTFmxpWh+uHST/t33XzHzbt2ZO/ufAc+/+iUFVncLhcvWIRAkDyjrt7dqU9ZEO/gmUKW3OFh1Es0ne86ZoWKxPS5V01JmEjfun3qqf6TzZfZbl53y30Hbl+113O577q5k9ml0m+HjTQsu+q1l55949Klpu3XAj974MPsPqCtEJWhrakC8sCCwW4rDoVspRAsGcTyCkYo9XEBLpCQ72jbA0UBxsoGAshsdpJP5rTdXmSHT3Y7ubOdIfXOI53uambj32ypLn9Lp3KXxWUCeetaPxivh5TyJft9ZbQWZrxY9DFbl46KBycOH3DgNjI69445bf6t1zzeun5aj1EVE1deVIs/7NHcvd+aBff+4k0y0m0HZg3acU+fmS0zI3WFI7bJb06Ap/Ihe1zwoTCMfUmquJh1eR1Bh8lqsBsKCoJBt9nO8uUVLqvXxJlhkoQiGO4TaYNgFszI/iy9wFeiG6d6PkOpIe3SD4+ea3cpVXWUyfKXlomNzfSoSbNX9LkKcd49xzn7Dz9478zU8Mln9rUu2N299a09KzceKp+xbPmsuXNXzMMfnnj4oROVt4ydMbZ/Y69A3Ywx/RZLnz3MPXEKz7lq09atV2/aRB7yAX3ZyH0D9uC6lE8UQmFvzIJQLO4IC2AN4k6H00EmsTg9xjnLucLJFjlrna1O1klurDqdbMQewjaWxFcB+dpqhN7pNtIrnilxLNlDVi4/6G+uqjEU3VPu+hpETo3MTjUkSaG2jddfcdke83rLDSNGjRrdr0/rqAGD1ng3WLevuPTam8ZPYTLz1qzbYLpzUGufgfP6NTcN2mNesn7VnE11trn0XRX8d7aIl2gNdrPLQq92en0mm3qRu+E4KWIiX/biyVUIuYqJ/tShdiDBqc/slymJ/T0bFy6cMr2lsKm2cjd3Xfsc5q7pkxZNN8wR6vsNnK687YLeZou4TykNVlYULcjp9PoE8PuoILEejwmbbJQGEz4JNLS+lOfxtOh3GuhNLeK3Nfppar6R6aOjgenAn0mh6dI3ChHt0+nZeuUur0vgl1KaUsCXn9P7+80pi0FEDodTdPoDrAXIOAFmkhXd5BavA4kg363JVrUusO4CV/7FJLluEeutWDFx3aqNQ8ZNWbBxo8BeO2rgpj3k/tElYzYtwi/8+HfsWBmR9e5d/HfmX/SOrB0NTlntopmzkEclHE6r5Wk8FE0j92uOmxjyTviwTFpkWV6+rEJmSNlRVufIr81Ro7qxzJK3basmTFg/btz69fjveMkU3CL9cop0E7t//XpSK6wS+pfv/QZPQLccj7Poc16mrVxPLjm18/9vbeRxQhszSqYsotkMhtFiPf+wcivoaENShqMfDGLxBHSKXQ98dIAFKyLVU4JsgddrFYusrIk1RWOFBTI3C4GbVp/gk621SUgZbUMFARnIbUGEnIoJa8y+fpZ79tafXeep5eqFtc3kMiqI1GC5Cdd7L7vsop9t3TBjxvoNvfpu6l7dfP+GU3PS6anMk+1D5oaWXDNv1HBHRUVZDTePzASRx4/QKeZLGIMFlT9BrhGZrDbzs7SIhFyUzKDSpV5PUuJW6veB7DHTykoSxdXFpzbiW1tqTatMb3EXE7wfA95/AEL69pt+n0Wph2kFvETEBaXgkKCrh6nfb8HZ/RYvuVKMP44WTx64ofep8jhuMiyayPl+anv1LZGOZQ/oVh+Yb1JfjcMYCSJDWIwRR1mMO9dXo882sn2kCZeC40TEZjnx4TajZ+k97m5oSsrtAw0tFEVDt0Si3ODkampLq56mFJfi7ieihb5QyKJcSguBaXbT+jFO5Vq5bqM9v5Jvdsvm3Be8tSvU7G/J1cP19DdutUBueU+Y42YH3LFy3qnKhpLqcewbS+l1bvzJ0ikbV+Ve9m4/9LZltXUxyS3DuEYCf+LgubkKgi5cDEphMhUH2URJ3BCi1yeLfEVUO1x2i49cuTLLV666vD6Zf5807jzX1cl7W0YB6ZeWzh8BdDPRxW0r560nn8g102WTybXJH9/DD4zsM2hE/9GX74JgD77Ktyblt3qfZT+E+SB7Flbe5wsV2axF1mgsUNhPFp4AEGkDnhvJ1dvH0rzxKXIbnBj07J3A3OvXuqvo2TnQ+I2v5y6hV9I3rNjYf3LbwlPljcW1Y7n+uz3yfXSJw5+snLhxVfs/3rassiwmNH4LNL6v3KG30zv0PHKhc16hF4E8ubRZ/hV6vXvp0fSsyzv0/cdWFVZWnuo/acrCDUQsqpeN37gc37rYconpbaYvIVB/hx7jfmTt4f5C31m2m0mpMwPPCzZQS7P9FBDGUiYa4BdPeafcRG3Rb2MZsc9Pzg/EcWkZqdCHn8B9nD72klXSL11RfjX3F6kwXDMFv9Mu4C/CqdVSNfMDLXAo39//DqbIQf1wm8dm471WKyhrIOix0SueHg94M86cC/2mThf68+u/5d7tzz0glL3dLx1fMFOUVouz5l00W8Q7xWnsYmn1i6/jHa9Ilo1bN21mpm/ctHUdoRNs+jFqt3yoAE1Pufycx2i3BwXksFgQxxZGxJNgzt0hIUQdB6NA7tZ6gjhI/9eGidJQY676MtkrJNmjC7I1J/ekHCXwjTzjyzvB9yxz9sUlDj/oEVO19efYunLPldIX+4aOHDFMWrFz2MBTOOZ4/gk8L4Ed0te2F5+QbopIf2IO/XyPtf2ofc926acEM9qzi9rCZvQcexP4nfVoccqFysqCVo+bt7rrYnWxhmRNhWzCoP+UKVhg5DlHaSLB0mgIoQSJ2xzIR/7P43EodaDkPTSaAPO3BLKXL1t09TJIGEpO75dld80Ud7oIK1dItWwGCDW+1zG37Xisz6ULpzfsuW7Dbvdy760TxjT1G7u+rfvtu1ePmRBNVBX/gsn0aVmb6FYULWga02PRsikX2RYnm8obXL5Y08S+S9dUrpxvWGV4C9vk9WwNzF8bzB+tzGj3kURRIGhV6xdbadDAKyXuGlHee0pkhaUWIC+V4fTgt+or66KJCvf8BcMi8aqmhlPWi52RniPZ5vVbLGvdI9I/naHvHOET0H+A3wN2YFLKYULIGwy6OJutKBqQPf3jaa/b2c8K+mVGBVS4zcDtbEWNxmwe45U8LzS3rgZd+LsoIvBwdV1JIl5p3DspTUsJVEfK8dW/tFxsLW8ZcwS3T3/ooelSUY9qE/T5H4i/fgvrQQBi+WkpD3iHnkChhWUNEG4WxyMGLylxC44yj30+MxsgV9QdcjhvcchrQ412tI/4qfkH4LJLhHr8Tas4QNznpFM7Ooafxm0bhg2jVnf5uI0rhg7F7ikLpUP9YYF4Eg+Rnpx5/J4rxrVevqttJh7SPnXzanvf5ZMovz0whpMwhno0JOWpjDkNXK3PwpYW1LK1Dckyi9VC1TJhlX2tYG64mH/4Wb0A39i9L6MGRhAM0e0jGiJRue6Fvcqhd1LmZ8EtTyUqE4WFPSb2HlFYXLhqzuzV8MeI3hN7FBbCD57EHx6/qW/bgMZCX+Hcwa21g/sNqrn4qitX1QzqN7i2dfBc+Nw4oK3vjRkaG3wI9vlTsD3kPXLObOEsYJo5mXRDHuld1GUkxVZoVcYFN+zb+NBDG/fhD3fdhT+QCl98EX8ildy1S9eHh/RhFGzggHl9Tlq4gkUW2gfbZR/y/W9lTXeSGxoQIv78wN69V20c2fZIRcmWWBW76Zfv7b0H/0aqWLgI95rxwsihr6JOdQ8MRox48pKzkTWZWSMJdngAqiNXcTtdw8VxtsyG2ThTfD02K3UPuE/befzPB7oPaP8T4O4OuG+luFMpm4ERRBYL2GwSWE4phMKBV4NFJKoZkZpsai3/4LuSO4P/uuMXpDRTL/XFH+C/z2Za5s5u/+Vc6ot8B+v8e5R/bSmn2241Cx6PzWV1eX0uu8OuVi2rO251W9zKSmahOTHVne6u21LIp0EmQ3OvQTdUkth0YWmsoD5xr+TWkXZrS53hYuPb0wiFc9pfJbGdFS9jTwF9PvCWVqcCpmAQDKPg87kchYLg9Dq80ZjX5VYu1fvl0l92tohlrCzL2iEwrssEHT6lqo2FbCwTV/Yl5cAuaLn8kmf+DS/tGQKs1rSpwiSTFFcGUFIsKkVjLYM39x8/deaihyOhmSW/ws9LU5k6GMzG/uPWdK8rZUauXzFl6MTJPQdUjZ/D9CB837o1WlpQROvSAO+PwdiCaGbKY7WwvgDjEgTGF7TwobCfZX3Ui2BZIzLa5VK3VuNJ3P04E0RBdfrrtFdqz/F8ihwXkHqE3k5pEhzDfZm09OM1Nz11x7UH7esjD85ftXFlD2yWirlPL5fcR3fe/sJ1W42P7VizfPN87CB+TxX+M3uPwNM6twG0LGWze72CzecDvQuGvITMVCy9wrvZe8x7ysvZvUXeMd5Z3hXe3d67vKKZ9XpZg8GlCJIBJ0FJzblKqntAs7NbxCh7qq48v+ieg7fvvQ/3OXiT9NycNCftZKfMnTOFw6u5Sey/pG+lHzCH7YxD+m97v+dff/519mdPvfYa9cVZ6RHuBTxWqACdJS8X9ktFiTLzjMFqMtkEg8FmMO6ZZjCwKRJKmvdMM+1TE5ChNxpq9S/AqhVh2Mak29sMwSsPv6p//eyspnvbZ98HvfQvkZ6KHTt58ujJk9DvlfBlk75fhuWBGXn9Mime/9/6ZRvdSS9bovT781nP/hqH720XoeMYHlwiPat0TGvYXiWNRgs6DqNq8spVBVNkERMJZGE4nzMU8nWrEIucXDVyB1Bt8kwDiBFOqhVrlSEWy+sJWTzIn0qpB3ldIYsIXV/8U4/HKmLwHywa9VW1xt69F0dLooWwsiQKyxqk0SmHx2YSjAaTw2X3uhxGp6cu1jdQ6LYaBIPF43S4LUZRdDBAr3SI+wTP4H8rv+FhMhrdHjfanXa7TSSpaBIE6660cECp31Qlc0d9XsZGLsrIBZz6Mr0wnlHcY/bshallV2/u39J96ozFA+L81JJuJVctaxlSXlcOfb3CvYOr+XdgXmpTAcxxDPgVglyjnzWyPMOwu9MMfVPQ8RLJSuKk+toW5kkVIFwt/VM6hHt+wS/at2UL5bf0DuDsSXGWpbwqTsztpoaqFuwURrVvzKjS44qVNPtjuKd0SPpn6gvck3tn39ItFFeWPgUXzzMChwEXV8TVciy5fpOLy10GdPFffCG9gtuwnXtny5Z956KJB7YqY+VhkC/l0SSWlRCaXvkiBUtgGz9xy9J9lKa5gOsAzI9I5IkRBVZkEcchA0Q/KjaBDhJm5aUZDfTQq5K9pojFMhGG24wP9Pnoe+mdPl/8g++3bMOGfctU/mXx16UCPMIc4kTowyBgddBALaptaHhjRkNDLm53GRDtb/av/ccXfXD19x/1IeNftm/DhmWgByukNrS043WwZAUps4l3OpHbCvrIotp3ziQJkQ10AWPpMVQSpKrnsHexEznG31yfcBX2aZTacKCvb3hdjJ3KDWm+A/Bewm1CO4UYmMTilA0miEOiQKq4I5ZUKn+zga4tgF2m0Cv6vSWNOw8flj4XYqtmz151aDxipL9Kk/GRjh8AhxWiy4RBNJuNFohwQfxtHM0+26zgeXBmzmCEf8FmCTJuct+b1NtRy00nnTmHj6FHP5iI5rJG8EWS/uYklj4/fJgpGH+IdH1M/kO6DwcPH6bv+yBydpwf5CpFCYScIvMZQx6Wtz7BMshj48QSXNXYSOC2SHXctdxogBuowA3seA85HmWZkx3PZZrq7KwMSmDvQYjbIiwA2BIKS27l3Ia8GbaYL2VPdvwuEy3mEQFHVRT38Y4vuP78GYAfhJBDYG4bKb89dI90ittCaaN4DP9mPfAD25OI7fhCw0HaA5zWnsAx38hwTMfHmXiJSYW7R3pGj4/5htmi4vsqE9Pje0aPD+CaVXzPZBJZfBdLA7m1wu0AVwp0lxmH4dMEHm3AxPcqSMEizZcy4VihBfi41h+yUHbKw6Zvn0L7HnwG2g8m7dFadEBpP05pH3aWMrGSGPKU4BXhCPlD357weT7lc5nM5453KZ8ZL3R7Emh1e3P4vL3jM/KWBMAPAXjg8zMIiY8xMPGtjSq/51P+lCl8/Js67l9puAgegMviIXBnAc78OMMnSgUX7VCZv2f0+ICPU1R872Q8enzP6PEB3EQZH1OSh68lB9/nzGQV31sZX1iHryUH3+e0X8DHlVXn4mvLwXeWma3iezcTdOvwteXgO8tMV8ZbmcjBB/MxV6wCuHICZ2SYDSSGe5zBbpgQfLLjvzBqbJYVRdGrq0D2Bwu/hDZDqQwM6HgRu2FutoPF86esLFPsLGUZXByzunPa5ffFMlci2oLBZPYxLNH6nlBXfa1Fff63vmD8cymfypXx30THj+1uq9yJgh/gBlMbMVSBu0Tmk7G4wOrJ5bse3z+ZfTI+lzd2Pnz/ZJbK+MREXS6+gdxc4ZCMD8a1Aa+h8OQ02b+IPkSpPvwlE69CJp0+XAXtBlP9G6q0k/XiVlhk3SkzWwvs4Bp6ytxQ2rwAfO9Dda5CsW31oHMAja18KQ6YraJRhaZnnGiNE2EB+NIFaEKquCAYZKxWHzXwhRGypTg27YMl3hQMXT8taEqZnPSciIll5EfLQgHHm13s8Tmzq7b8bkLnQibkgBAzMNOpcIk06VW25KcP2JLcWiXM1ueeI+O7GGRkjDATxldJx7cdlWIzHV8YxldZUMibsuMD+N3SFC7Cjwf44YR3xrGfI8Lxeifh+L8zsAYW5MATua2k/KvSrQ0Evx3wY6udN+fw70mADwL/PMDB/qk443Z7Al6zyeT1sBCP+K6f5oX1lxPNHq9oJ7fLRIfy2BvN8HQ6tAROtEdMNiWjwezdkjhh1ZMnjOziv+OZJxavvuyuDB72Kj+oo9f2N6Rt7bXME9deeeL29p38/cAi1U5WUvmtUuxfuyy/SCOfwj2p2ckROjiwL7ijPeMLeEzqukR5crWKzzgSx1VdpoYDORW0qi5DICHz5WrKlwI0NFVKOFMQlHkT9HCFEV8oGNqT9gZ5hTccsIbV8l+tyS5P5pyTP7FOPGJi97b/5r4u2PQmeUeUjP860C+NTw4BbXDJfLkRvmt8Id8jqh6v0vOV+Yr6IoSvdn8uX1fp+arAKXwNRDW+vg72A1N81Yr9UPBhb8wsZPHtpusAwTdSgdsg2xnkj3NMFo68q4ipzaX4DD9SfGFaGzPIE9OJ/V4ZsTxVKn66Tp+Edt/CeEvRkvfJKr8WDQdPN5mKQTsTNbx7bHiLDa+04dk2PNaGUzaMbBaB2JMZ9B8NqyIzp6nvUUNlZhh+D1GrhZ2gR32tjjw9ou/bCy8iM3jDU1I1JozN5Ka/zW53WkjFabPZwrEut42EXDYLrz4sZefB1ZevdSk+d+sbVXn3UbL33mLZO29MYzOEquwNuutub7bf/96vpNfxt3OlFfygn/5Krrq138y/4flz4XuaXp2m81Wj+HvV6rz+KaOqFsB9Qf0UMl+jFbiACveeHo74Hzp84FfcqML9MWPT43tGjw/gNqlw7+jhvoR+R1J8tUq/FSrc9xnRiHkZDpsBbjrFN0aBC8ty5zZb9fJE8VFbW0vWHxmfZnMNxxkTXypPIIuull7jpgszaTbBicakKq0mE4/JwQLeZoeJsztIaGcQx6YNrNk0fpqZTZFHQMemWeWeCl1JUJeX8urrSkgBDfq4HDkM4YY/mY/wZT9V4vulP+HfPp65p/09pmzXrl1cxa7/Xvnww6Jvs0z/M3p+AN9uV/khZQx6fjyj5wfAXS3zw2PJ40dbDr6zzEEZjrGKMjIKR86E5uA7y+yQ4bxOsx7fVrr2Eh2pU3TkjKIjEdCRK0KF9kDO2nQRwM+j/sBYJGvoLQp8N2cpvq2i2hLJgZfxL1Dx69ayArKWhQq6xH9GwS9QeAJdBdjZiqosdoIbZGME5UVd3hqjoZVxAtw86iONzYVjNIR56259Hq3EXmC7U7Dm0ErqllXzZ8BajXPTmKwQ5a199Xl0aSjk9gBXzY1W2hMdcGoxga49yIJq4x157Z/Rtwe4DZrvqG9/lvmZ0t5rz23fltP+LLOZfl8A/s0CasMbqExwtH/q/UaICUeRSgHl+c1XQJthwn3QZjyx38x+LEvTr5AJNLEX27ClsHBoQyoUht/8fvjN6RnasMXhgL9ZrfA3iwX+ZjLD34zGoQ1MgBh7VFyb7cdZpf7TmKVxgkYjr64zHMuU8qXwOyptUFrr1xmZzj15dBJvwoQaUwmObSL0NBF6mgg9TYSeJkIPpydIo0jFm88zJsuzQplnRefg2c9UWoxUOo1D0V86foV6parYohTwrCgVCA8t2gI8K0r5fPCbxwO/AXlFhChYVAOCGr86O/EnSw+bpaeI0lMUOQc9S/LoGYbX/X+gh+jWLGpnkgrWa2XNZsArYOLegAHl6NZxkM3+1M5MIHYArZ0lQ1dAH8NLyi36mF3GvUDFreVSGD+NaT7PeP2GnFwKxX1Gxc3cViDjLgPchpKyTrhvpbgbc3EHKe7XM/4gb9XBf0PqrVHck2TcxbL9CoL94v1Bs1ePG/T/Vqqnjbm+L9PxmoaX4AQ4L7VfkxS4QnUNYTMqThUfXSsb5bWS4NOtlWxYWStVnDQmmaTAFsqxCbjVsKqGnQRSsUU6GhVbRGl8NRPI0ngJwOloZL7B12RpDGRpHAMytojys0nhp1OxsXVgYwtq6vhcOXgA4BOUn5NlfrplflYCPz3llYJ+rsbAmBbxU1XcMCZJtntmDa2ME+AS3AgFJ7G7RhnOoiGkcDKtT6n4jAIzTY05mkjMMaW2kc/XIZneV1Xc0GZch01uU0fUY2BFbSe9k/v5XutHZNap/TSQfsLde3bdj8Bq/YjMwg6r3Kaa9INrunfuh/BH5T31pRidTMOs12flg/JI5bsmSzL/AbJKlY+RWh6zOW/NNJM102jmxZz5fJbUeaPwbQr8DAUeFAov8gexPQd+pJbfbM5bSzXUMl7pFKkfp+IFuEdU+Xs2o2Kl+J7R49OtraY8fM/o8QHcHhmue0AlUaGvLQdfdq21G3PxteXgO0vnGOB8hX49vl3Si1wfiq8HhfsU6FuKrE9AhOv3ik4t1/wkwBVxPQFuig7O8ShJof2QKSoMWrK55l2kLpsOZzbGC5fJKNWYsS0H5z+zMeOPmXitjLILfNkxB93nwyfDUXw/ZGLhLD6Q5T50reqR628wOETkH4dK1ZFrsvwktCmi68mUHH/jcfjx+FQj00L8jRbib7QQf6OF+BstxN9oIet7C1nfW8j63kLW9xYcctLk44+ZRH3A0pXLgbqg06CLbcNybKsyIMfnkGmdo9Iqr6toCeLRZ6iUtC5OFRUNLSZEsDIV4ZBChUyGMo8m0LUXhLsATwvtfxQOKN6xB3QHeWJMbt5pEMBfw5OcX5rqLvCIQnvBdiJvMaPP85lAz16gc9qSp2cWmwIo4wS4a+icps8LRx5iOkPzjT3paAd0vEzzjDgApJ7seDkTLDD6df17Af4kXe+n0vV+wLUkR0ZYAtDXZsIRMZgztnz8a9FCwE9GRzpYGAhnsaOu8K+dKfOCdDAjVJjFruGeqeFegjD6RJbHAM01FYRk7Dp5lPFv1PAvwaoEE8lCkQK5By1fLPexQO1DZzdJDhEHu6b/jIpfi4sKyVyG8+iHOZL3q3rmzZGGVsYJcCfpXE7Ng9MQUrgE9H2I0torb80m+Uin1W7gcmgF1nLLKK3Tcmi1O2n2kjXraJVxX63i7iqvJ2PX8VrGv1HFn+W1m658TqUHjdekjwcp/b3z6LcA/S6ThTPk0N8f7NZ1lP7pOfQHCP2+gMmpo38Y4N4mPAiwfSj9w+mdOgLtANylTjNjzMG9l8aMRA5nUNzXqNCAW3CasVGPG+ZnG53HPoqfYlD8GbNVQSvjpHFkTwUngbMosb7ZinVww2Dt0+GDNW2Vgs+Sh+8ZPb7sGilYcvA9qe1JjVDgVipwfiVxq1/zZ6trH+iTBX2K4ik/gwtT5eVDC4n5KySz7QsriyuwoCpXtwSzJvu3qxJSSHUrGsrTLTp/FH56LjwNUFDYa3LmwG8B+3wt/62ybyswm39N8/N9aH7+7UyfnvLGrZonxHuU/QoH8qC6lAthj9PgxKzX53RdP83J8xa6P8Gz2Ivyi7fV18WUtzLUfQivW96E0G1ANL7KnsnuO+C/kZQ6Oad2E9C5iZ8M8jwiVR4KFztc9N6ZQwjzJaXO4mL77HRxcbioyDsrXcSFXZxxVppzZ29gnOtglHyrNHskqtmtUOaM07oFbhzB3KYlz2+6Zn146tqtl910ewU+W3LVwNnrepx69zscvV+SDjyO92w5NT96Z9muzVeuvxUXNPWf+dgDP7WzLO6DfVKH9EvnW4rd1mxTIsfmMMju5HT+0haA0+2lA9wXatzxdqY+Kc+Iakfpmizvzb/OblXiSiJQJk+Ay/U/5bn+Xtujf52dLZ0ms91KZ/tMpkk32xr+kIrf2IN5Q42jaTp7YdihngDQ5JX2IZSqfRhTzCm1TS+yxPfq06AeBdDa5PfTgtvpvqjSzcmOWzIur74naJOi/US1fvrhLzt+oG36OGmbxZnuLfqeuuinJ3NApS1BOupV6j/HeBZp/fRnHuj4Vm4zhHQUH9ZywfH0yuYfymj+wVd8jn4+1foZwIzp+J6Op1kez5lM/2T+eIg8UfubyIl5iV39DnlTFpbyT5MudV6pfFE7PJD6j9d8J0vZ76FdaYZpdJJTGG+njL36QIdMtAm8kLfIEQ6SOp2hO1+QP87e2XF6aMf+onOM82ttnAOZ0cpc18njfD2TvNC89WGW5PTD/Q/9DGKG5/bzyoX76Zsdj42Oxxnsuh+qg3I/g+nev66fdy/cT2t+P8W15xjPV1o/Q5h0bj+/7aIfKh+HVPmQ97s1uwPy0cWwupKPW7+U5eNjpRXtUUz2ChVprbTcr27fHtbiUnlNtFrtufv2p/T79gDHy3bQUBDJ2bfPPcMA9mqv4jEQPxG5fNicY9/o+QVq34Yq8OvBvhF7WAkGjo2VKMhz8At3avj3wzpD/XQf9dM/zfjiWO+vyfgPKfi1mIJJkKW1pCGLXcG9i85xuWI7P1ZXYpKZw7OCti7PX1xFbedQxXa+q8pFKWH5qvJCuQ9dmyWUR9l+WhivcqbEL58p2ZdxuPPOlEyi5zyy/fQj77hRWSqXZWl/piih70mbi2w/PZnj6niKSUf1CW+X4xkjrNH66c88pY6ngXQ0qXui03jy++nFrFXGUyKP518ZT7TLMzJfaf0MYJYh/YkVQ7dI536IrFLbSc+EyDZT24vznyDHNUh3f8m4LPKhEJ2cEfnVzoWA/RRlKXYo+lFA9SMWzh6T6XJ/GORzba48K5vOVTn7wuDLGf6rwksfEfkM0sjwi4zDo2xnyTL3OtCl28/OOXeQu599Sr+fDZQHFf2DlUK3P7YA4BbQnGJDnr/iD+pzhVcA3DCqz+Pz4IJhPVxeXj47fobMLSqICrn5Tzknb1bxKuNXs9UoUpwHT/Avo7LToOjcc6ocxIihmxoPdJn330B1Ybyic5qPEyfTuLAk1KnNMDqObD8t+DtFf2Kyv7I7EyrUt4I2U+hYsv30Y3ilTYmsc3dnCmJ5bRbk9dOTOarSVk06GlrT9b7KcKpz4xWdO6G2IceVmLH1sU5t8vvR+Su159/z+krrZ0B2TS4i/fCV4c79EHmiOteQq3PaeuSn3RX4sk01+aL6Ju9bXaOTMtIqSDfMIrrJzY7rM9IfOW9J8yRzwS+iFhvkrTgaF5z58sazpB98kZwnma/bG4mXCvrYNx/3gI7DxOfKkB0mmM0lmVgiBz4f94CnaJxVTD3vpzOJsi5k+TOiKzJ+kH1yfg9a1FD8b2ZKKjrjJ7pC8RP4DdRWKCetHsiUV3dB/34N/37ZZ8ww5RT/c5mKpi7oP6TST+EBuopivzdT3ZLHSzLXn/FbVfxgY4Ts/k60WIaW55Znie2Q6dbvAx3MxEs0uF2AT5d31dk2tzc373pKn3fVn6n6IRMuPFfeVWeLY8QWBwrE3PHIeUyzls99nV0h2+IKaou/zUQTMm6FX4CfT1D5uFiRvcmUv2S1BPhPMpGYS9TBE/zfUflYxVPZm0T2GshWD1LpzcE3oOMuGV8hxVedKSruCp9DxTdgP8VXkoOPytfFynjSdEZxNcW3MhMv64xPMCv4CPxCGD9g7O7U9k1kGu/UcO7veF/2p8oozoWZsu5d0HhIpZHZ305prNVoBNlIUBm6WJnLP6pzuTwTicq4lDn/jusp4yFnCZi/o2zu65Ca+wKePSXTY6T0PJUxWbPZLy33lVFzJ2jAy5QjXjrDr2R8QVOuTCSg3wepTPZWZBzLMslpabVsTo3KJOAl9HEVWfqoDPZW5uBieQ7kPPGPGbu7M31abofAr5ZlMEEpbM+Ei3Lyc/L479Twy/4tkXE3kXF3tMvc3yEtd6TmzItI7q+oOgf3Vpi7PUKdq5Sl+i1ej9rRvKxFeCNTVcbbzwN/Gn0rw1c75bPodVXnhb8b/RfgyXpZL6+Xv8jUKz1o62V+myPoC6VNg9zmkUzThdocwPW5/fyQqS+/QJujuDS3n68yTV22EYdrbe7BWGkzUG7zZqa29wXaHEPfK20GyW1e7NyGxpbUtyMxnyBef50uJ6H7fnov/S515HwHPku/7fL7kXN8P3CO70fl7x0emuv/TPt+T0dJl9+Pyd/RMRhzP8rbBbJc4XIYs3rGytCtwpSbb8+HP42tVK5wDdWJzzMN3bItuoC/W5k7BiflbbAfMkmlD42n+W2OYKfSprvc5tNMjwu1OYAHQBsaL9GOCpKVpvzcfn6bo3i82oZ2VNWjU5uOISReonwvp3y8XppIcRkQ4iv5M44y+P4q/cnpjgJE27Q/l9fm7vabuvx+5BzfD5zj+1H5Oz1jEqTjWKTMYbEyhxFyciESsgQ6nXfRw5/GFQo8sTyeeOQC8HfjkMonGoqjhNKDjrf5bY5k25TQNhUXbnMAe/P6CV+wzdFsG6Wfc7Sher5IsQ1OtU0zbVNce8E2x3CZ2qYHaePr3IbKSiWdryq9rHSk8r6flr/T+dV/V+XkN3nfj7Qf6hJeLyf674qctN9Lzxx+pn2/pz3T5fdj8nd0I+jHDMrbJcqa8wdZ1+UV+pmM12kTdLqeD38avSvD+yj8o5mQ97zwd6PPFD0Py3r+ZCas9KDpeX6bI+jPSpsCuc2JTPRCbQ6gT3L7eToTdl2gzVH0p9x+nshEu2xDZURucw96T2lTI7d5PBMsvUCbY1qb2nO1oXKF6fxWd5Ir/Xe9XOm/6+2P/vuRc3w/cI7vernCVH6qO8mV/rsqV3IsW6fGsmCvbLL9YegmW2Gwy7xEFv401XECHyHwxYUXgNfslZJjQPHgOeLrbJsj2TYJ2qb8wm00e6X1E7pgm6PZNko/ndp0PETyBZTvDcp8n6TfD+Z9Py1/lxJ53+9u/6HL70eU79fmfT8gzezy+1H5O7oXvg+kurFWsQuSrOfyCYpPMiGfqD8rlw9/Gp2V4cMU/kymKHRe+Lupr0t0IirrxO8yUaUHTY/y2xxR/FcGx+Q2v86UXKjNAVyt2nTakTHqF/PnL7/N0Wwb2pGx5BxtqI6v1a03Oh/o20ykqivadG2O5ftAndtIfyDxB52v3rI8tH+t6a3+u6rn0/O+H21voN9voXHMZ9r3Y/J6gxqBplvp2Dfk6i2xVRjVVoVyz6znw2t6S44nYtS99gLwst6SMTfKY+7INCp9aHzKb3NEa9Oktul5oTYHqP9D55B25G6s1rfokraj2Ta0I3fPc7Shc7gh388YSv2MZOqCbY5l2ww7R5uOh2C+9pJ5ZKfm2oe875p9yPuu2odi+H4DuWPATu2Q5eQ/sh3Ig9fsQ953xT5IafKdyI/y/R5pSZffj8nflfhO1OKuU+hhfbZrfaa8i1iV7DtReIHtEdNBS5mySt7eRcwian7+KfQ7Oe7vRu3P8UxlFzELxb9Axj83e+tkTEV1Dqzsf4qaX3gKfSjjjii2LazzplV4inuRjLsNaZ765FBhDqzsg4iab3AK3YV0GZKNGVcX/hTFvUTGHciewSMFvYXc/CKsQ6K2Dp1Cv5Z5Xki5+IKWUdfD072+8RrP1RU7GiwQOttvUbNdp8gt3ez6cDDj78LeU7rXyrhD2fNyZl8wB1bWQ1HTj1PoKRl3LcX9YKZaZ1VUeIp7g4y7F9IsVktVTQ7sVpgbLc/gKIN17Qc0zymyAjNQL4+dcy157U6j73LbnSvnQttVaO3uRt+iGVq7C+Re8vo8ktPnBXIweW0PYHde2/PkYvLaHu3U9jw5GdJWza9A23vQv/Panic3k9f2GPo6r+15cjS0poaaKykVr98P1gdaLkIIdfXz07k/lzpyfl4m52xUiC5+fuQCPz9wgZ8fzf15h4f8XMvdlMk5nfP8/Fjuz3NjZCLXJGdDeEfP9BqOE+Oj5pTzYU+T9ed/hL0bszpYU4aG7WQSuoA9gjr+Z9gDOPo/wx7FsfPDigM12HsAZmYObFMe7HAN9lgOzwhsswrbMYTegVPj7TI5HqP8ny/HZXk/P5378/bn8n5O47Pz/PzIBX5+4AI/P5r3c1LXIRv/A18u8PNjuT9HjfBzzTei8mVTdHM50u0wdAlLfcL/EZb6gxosmYNGbb7yYY90gm06J+wBnPyf8R7tBJuHV/XdqHw582CHnhP2WCfYYZp8PQSwWT+rTPbvKP/Xyn5e3s9P5/5cSuT9nPp75/n5kbyfX5v3c+r/nefnR/N+niY/1/y+MtkfPM/Pj+X+XPH3Mqq/R89VwapaSlfVP2Yq6vP8PRl+vApP7kAQ+DIFvrwiH56uaaK2tpwip2K0tcVwnPSkyiSFJfunsq+qwND9088y9dW8eveHwqk+KnjUPYpzMGp3mmRaD2ljI3tAQGudQmtdn65oVeHVuyhZvHUq3uydhYSu9grx2Gzk7Id6BC3vjsNMDX47YuQ6I4ydwDucXcKL2n7CqY7Fun2P79XvbA9pbVd1rRQ5Nz/ONAQ92llcUgebuwo/y59BJlSYshhoFUCLgTyajlrfaKnVFZEnL2HF++LGeCN+tqjb5m41bfyZUW3LG5Mj4/eRuq5SG/6uYyuyoHDKYhHMZqvNwI5LG8yo9g21YC95cStbKzOJb/EGbLHq0l1X/hTzCyvNt9zw/4+ejr9xjzKP879AfhRP2T1er8FoDHh56xaXEe0lLxiG3qCl1LR3VGoY8oxTvC+TbIjAr+akDeMvKieOHlLU3GScZq4b11o9cfSgyDzndOc87tGSbiV9WxYs7gN/rtt3KalP4OReZG4XnoO/iagIDUxFRQ6xHOsMFxQ4nM5o0GkwFFg9XArzHL9nGuL2Ke+6hwKOMw0NpBivSk22bpxS7NCtEYc14hh86t72z+77d+nIwf0KknWGCdYZo8tHDk6Fp9knWCqHci+dPInhP1NxeXGP7ltXwR9LZ81syo+fqO49IMuH6m8E8/wNqnuLZPtAYPJjKkcZ24Pc6zgfDqo/i2R9M8nxQBziAWO8rotY7ZCGl+JT2uh0TfqenmsUtX2ZU1IVtcsNdL/me/U726O9jdq772m+XdTy7Xr4SgpfpYfX3bGvUnRnhbzvnfS7tDosiEGV3FXMcpBVHjlQSwriPcHBcxyDHdjpstl4bCKvDVuOT3PwSJlt8hZd7jtXRJLjbGMylpVnZvmqX3wmvSULNfewBUdsmmBr/V6a2y/LcUjpF7MmrPSLz9tv0svGG1mdHt3w2S9WTVR1ySb92YKjuo6Zjq+4jcwzwmcogOJocModCwbjcaPX5wPdSsRi8Ug8At2mjNNAx5CPt8ZP4iGoVZFu5Y5CVsidXSteE9E8UUfUN1klrB3fWj1p7JBIU4NhuuOifQqlZwsThd1b5lzUUlRS1Nhj+/LqLM1ajJ5RY3Tm1idp9Oqg0ev9GXfYlnsmUYYfr8Ibx75K4Z0U/vGMy90VvPBvGZ7UtvmlHCXfAvGS5QTLkJ7odUEN9rMs7OtEunogz7lgqS7IdO9/SxfR/yITKuuSjue03MWNCGIaFEkZAa1fuXv4WCZWbdOX51HPbNIza9XauvWddn8K2f15ZzZl+JkavLZu0fpf2GbPhZe+o/CitidxSqJnQzrW0b2N79XvoHt3dKVTBr1OGQw8UGX5v9CpuMfnj9fgPljWqTNtNSAzRbJO3RcfmWxaPnlUlzpl0OuUwYBZC7b8X+iU1i/VqSlyt6pO6TrO1alhqYKwXqfC4XgR6FGK6FM8XvQ0tqBpKE6USi6Vm0zSVczV8j+rVZauc6rVLQqxndRKR7aWQ8qoOSTFR1QyZd9mAlExd49Ihh+vwis+orJT+W3GH+gKnurVWllXsKxX76u64s3qigz7WS4s6NWgLmD3g22fSOOLVUpO3S2f00lQD/DbTCKaUyMiH/40TAKFL6Hwn2YqEpbOubVDGl9k/5Ju9BPsRdVdjvM5LXd3IylDrehtgaK332ZK60WUq7e5Z58E4xjldB85+oUsnpxzVTLsTO2cVFZnTQTanHdHUnqawovafsQpeV9DOkv3L75Xv4POurV90Fk03k1m90ER2/F37i3mef4T8v4ZsqLGVFDgeaPBYAaWmMxmm4XBzJ5pZqOAiTP0plyQTSfISo3jxqRItRkUK8k8f+TI39c899gvjhzh3nrqiBWLFunLp7rsi+N5sVNfYECgrzeT5+6rhGqwqPQl3fjYc2t6087SFum/VutTxGc+zb2A/ySIYCtiKRPiSXV8QeQZsA+PTeNpIWvdq1S0Xjbe99qvBkGraIn0h5gu1ha1ePQUOq3z07WTkVlYboyag9V8eVzfWBfS1fyhcGrulcRAQ1HnSF/L0R5Sc7TaObjudJeoX24+l+I8pOLU4h8FZ3cFZ0cd2bukMtOg2Hk5F7OO7ml+r36X7TyBp3sTorY3ocHTPY7v1e8qPOpFY96p8nenEqsSHrTUVoZN+njmIWYg/wLMDcQPDEtu3ggiu4U4/aE3dPPiJvXExW+v+BU08GC28Ado+wXEHk/Q2KMiZWXk2INhkIAEOrUkBlHdGF0ckrWpx1U7r5lK3PE76StUyYskQjiBGYYjhZxlcw00OOPOyom8+N+/CgFStzwKsB/xVyMbeFfFZmSyWMxI4BDPsdhuZc28jWEMLA+rIMtio4gBESlbXgv41AqG4KE26B5ed8edYllzWbO/2S/6xbLKiZubDx1S/tssfcWntzQ/+ECPw4d7PPBgs1yLuuP30lf4ONBgQnUpr5HhkYFlEeIFMydi+FcwCYgUYG6hnUI80qA+10jrXDfHSTnOsmZ8/E/NV/5nPB5+ZTN36IPmTT8s4/+8qQepdT0SxlhO8Ven3AZOMLKsICBsJtXHjZgOSn4UMouc4IaRxGEEMI5Y+fj/XNn8J8CPh8MQ9m5q/uDDHptoXbTR+C32cmalQ4A1nMjMYfwiV8yMdAnib6hsKP8Pc+EDvWU5HqMn0/gZRWFJL40x72H2UvziddcRXnwP8L9T4UGSuCw8VorSx7wm7qPO8F6w3yo8qu0SHNb+H0Gm3+64ksaMTSmryDBGDmMDxz+d5k52PJeyGR1DAcfTaUyqEhJEVSgAv2nV8evrREDJk1/c736s5H73h9mz35g9m7y9sJOdybaCLLOwlthY8oofw/EI36FKsc5AxTDbekj6N27mz7TfQBUb2u+G9v3U9tBYfsOPvWMazm/vjgH0IWyUXmNnMsvbb5Dbz5BuZO2YhfbRlENrj+6YxuHbp6GqThhmUAzSjTIGjHdB/ym1f8SS+hukCvod05i8/o045mZell7DxkPZ/hn0KDuTC9H2IkqmAiLH8YLAyIwwGGEkwAqRVX053RN2OrbE4BdzEWUN06DjkMwlBj0GfYSVPmpTPl6g4xQQxxmMIkuYxeNOPaieIgw6Br+YxXTg7W/qOCiPAvBL+7gwZhT5CCv4RSSwpAdwThHpwUAZCl1o3fgv1I20L9sN6MlRGAdLzlKK73dEqTV+H9Hnp6GHxzuqOB9/GplhhH4T2B5RtFjNHM89nzbxIv/CNBEIrW3N6V/lYJzlG3k2yZZ4mSO21TbpFrwo9GIIL2Y//HE095jzoBsvl25wH8zpx4vGpiqR08naRQtnsbM2m8/vMlvMz6edFpvlhWk2hERBfD6NBU54YRqHatWeA62deKAS4i1xx91Ailujp4R1cz7pZqCGEFVcrJEm3VxcjCsPuqUb8HL3QSeei+dqdDqlO6U7iWyOxdezG9lngCfeJ5AgWKzkCZPaZK32rqX89g4tBcBufGDVinvvWbn6fubwmoMH16y+6y5az3IN6MMU9AGdWzOqSfnMBpIxYjkDa7GCfCKYVZL2qm1oUF9pyr5QEVMK0pJf7OGj7U8+3H7y2Af0H82Gc2/DGuh9ggOZERDLINmk0iwcWXdi3soJ+A/cFcQyjwG7PArscoXSBoN8CUS8yJiw+thODFpJo/AfJnBXjPkhwu+V1wsXtDvLb4NRRFIWxDA8a8DgEYFqEUOumXHZgpN+z7408SX8B/btHyPcn/FjOTjMZE0w8QaQfZ6BiIu8DcIaBZYudASXblHQYfTGVKzSGrxDxTxG+kcu7pqUBwuCgTWbIbYiz4vCDBjpiwW1GnJdKMfScqC0h/hZvANQ/wH64Iqwd4w0mnRBxi8q+ddtMI92FEIlqB71QUPRNakxoKm4Oh4vLSzELGsd2KtX30ZQLJ/VCh4hN3xYQ7/H0z0anpjWYwj8GQxXPJ6Ohp+YRl6p4KLRWvi/oCn4eJozPTGNc8OffwCjV6U9H0MfGKf/V5VfjNaVU9fUHcdJTJ/3kQVS91yyu8HZxdemc0DvvZ4ZsldyrFmx7uJLLln1h25NLXUNTfMOfLru4tVrV31Y171HfV2PZAO+iQCsol8IwHy8g9mM19+498Zbbtu7b5/07typbfPnt0mPS+/eeMstN5Iv89smL5g1I413EKBb98mfCBDo2ffsKOZ31L76STxEFjBEzL9O0+Jsknl4Z8VHALmZ1u/wsqPYxxWbHIOVj2FEmHQjcQNp02Rtg95GQXvyi/35rvKPJK+CqH0rQ+u73s+O4iqoXfyb9Ajdqf4bJtbxb3gCXeOmop3sDPZhZEANKT8yGIjaYGw0MSBnsLSwX01DZxWXsU9tMmcJqK8rwY046TViL3NYegSPfVR6FI/biZe14tVF0s+l6wsB/3LAf7GCP8AaBB7xBpZ0YBBZct1M6KoDv1rSNt5oxI1JwB99DI+XHnkE0BfiFfiSImlnKxVb9CXQ+BE/ULFBdtQ7VciQosjE8bRzdofTiDFj5Tl+f9rCmUCggfNa6kP/oJRfYSUpnqv9efu+wEuvvMAE6R/gjzzxwzOvvab+SX39H/mHubcFi0tE/WEw19J14Ax5tIgfBDQVgD3BDCyjsO4LKIB0T9CTSisg2P3XMqdWAyyMhdw2ZV5V5p2MZWiq1E4qPFuIEXU4Lda7phkNd02zGC1GiNi4u8jSjO+ahly6V5lktVIf8KNPP8q2ltX9YvgX5X8++ID75wcfSNPgV1q2u6qtsZP8v2AyGSzgAtktrNWKTDyLrA6z3Q7GjbMSJtPXYqjlUU0PMXL6dYtNOuPg2sXpi8bECr0EJu6ll1QrBAZOs0OM1jerWDpRNIIfYjSZgAHAAZ74r+exdKxTNnX7yfs344ipI31I+/FjmrHDHQ7o42vog64rYN5gDcZqNJNsoAaZjbGVE1/BH70CrnkpWTaz7baDZwRrhIBhSRIRedmH6bRGEBrCGDB8/bVix5+UhtDxOQHHVxA3CBA5VKZcnMFkwiLPQ/gAdJgNlBBtXGSJkDecgCQSNDSXif7KiS9/9dXLEy+//HKgjT/x4YcnTlx88Ur9vFkh5vEZBBNrxSaIt8w2o9UKasaZs6uEwjy/+ryqPEf6GQpoEyTdoc0PxvNBs7Zx+8G/6Z2KWg0GI/IavT6/1enk/pJ2Ou1mbE6ZXUPNRgcoAaqd0VBbNSNZq3u4TfHncl6WVV/EZZmmwUMnbeHWCUz8ouHL5zAi3jV18LyZ0j7csWNFv55L10tjID7CHQvZN5jLHSI/t+PL9h00ZirqWMIeYbbCt0UIte+i3yIdi9ljzBb4djF820m/hTouZY8zqyEir2PmKXBFAHeEwi2W4YD0JuDXbv4dFEFLUi18AMZn8KCI2eWyRzwBvijq8Bq8s9NWg9EyO203YDtLnvfxMB7n7LTHhVCYCc9OE0sjZzizekmescv6d7oXjSlXlHXKLzsDyq9SxtndRaoxMf/pdnz/dT+/lZklTcJXSpfhl9qv/eYr6W93vJXgHr790WdeOonxiR3Sb7dLT+7Av2LAMPD/xfz124ifdnHHbm4t2JUoIpnq61KDy8L+gMtdFAVPjbjCVi7qDoSFbjVBX6IiZuQZn6fCYmQMyGKwwMg9AZcjVWpymGalHe7KOIrPSrNFEbC9rQ1vNGTdVlKcvIGG0aBOZAOwxZV9liCnVrkmCD5/c1L0QUyMm9x+G46XifHmUvjNXep0uFpx0l1aBjCsx+8WGOatCYPqdg0dVfegV/rp7aV3jf3mQFl4V/Hwwc270pf+47P4roH9x0tf1E94z/z6yvn8ZGPxge/HbejX/afrWOzv9/xxPPMSX8MzuPYEbsIpPMW7VnoiKf40fnScMS8cwTxWJXXIsQJ5O2MtPxVVoJmpBhQxeL0sk4jH/YGAnYlwlVUW56y0wWLh/XwiwfvZcDRaNisd5Rhv2DsrHXZnH3p0IT+Z81onXW/yq+2Th/L85M0qn/yysvpqlcyHKCIP6AFjSKErBvd8SThs4KpWLkiUJHqvXHtqARm89F/pUyZw/+eDHizZv/Ch+5hD0tyL8H2rtp8s2bHAdJ/p+czTHsyTgS/BE5hH7znS7+JtkiSPkZzZHQlrjhNNSHXjsdFoMzkYE+tyGyxWEGneirlZaTs+hRmw+9iKjXY7gg+s0YVazyfNipdNBJf8S6xJYxL+D+9hDrZPx9dI608dO8Zu5A5JA+88vVVqx+xW9vk7ZJrGAk0LgO/V6O7UyNKieNxSwXEOo6UaoYDf4u9WU2oym1an4+Zim922Ol1kbzWvMG827zZzdju2sGa72V7h8YRXpwMBj8hXcBWr047qaDVTfbLjueO+0qHkz8cd7qHV1VyAPi1cNSPnTUZlRDOc8oCSnZ6bzD5HjWGGYo19MX1PtpH8Ut4dJrMlkHdb5H89YqyhmVvgfGRP++CFQ5+Cf958ae+rxUc9K4auWolvkRaRX4fwJ0cLcfNNB25r2viz4K5bdo588bX1y1paR67eNHHnLbvE3095hPLnoo4e3Dw+hSrR3FTSbbE4rIXlBRBKhyorORQuiBcXFyDWyldVh9xuf7nBbxibxlwFay30O+IMspLnH84kW4lrLY/PmWOCqKa6WlSXMtbIxnFj9rl43TPx7qSoPWBehVkn4z6yHw+v75cac0i4UWCKF49qa3M/fut8fu2CB+v74V3vSrNZz9zbNj53sP0AO+EXlZvrFsyYNRcf/+bht9trmaO3bZQOte+D1TgI838MZDKMilAclcE4b0tNwrHiSq4clVdUsPaigjIuYbNFWfBIWC5RWooiTl/Iybo4V1U1EypjBVGYlfYXRFkxXuQDYQGJdVew5gQnlputolk0c04rizgXeQgjqVopJ3VXaHSalP/iV6bdr066nIlQ31akz/XGWEW4yew7k271qWGyhGL4yCfLyFvlcexPsgOfkV46fB3888cn8aCHr4J/pBduaJdOf7dkOzPQKI6UDLZB+FZpIb719s9vx7uli8kv+Ku0kOn++eeft59MXc28naG+breO77kM8MgIWtKIhqE7UuNh3n0mp8NRXtAN9Wpt7TG0gecFYSgqMPEjhvdtam66JF3uK7IWlV6SjseLino1t7Q0N3Cr080NzQ1WsZ/b6r4kPRgWOGtQrF+dhjBDLQkI8YmiA7JLSZcyYEStqi9drWJZC0cTCFXkYaNkFOe+aVpWg/UKQ5Y8HybCBD5Pkzv7tLT2ZDcz+PD1fQ78Gg9hls+eOnyueamjT6i4W92ofjPbBk8xLOPj7ubG5Lafvh41rkdqxIjg1F5DbrxxYLdwsvuD7L/ve6l9FT/ox0UT5k0Y65xSUp7oG+s+v8eYyZOHWqrjw0pa4mnmffAx5q+S7piza9ccactocY75AL6B5jcCsBacAX5bkQ/1QjtTIy0QuLiJ32u12oyRwsLGqvq6uN9fV2Xk+N59GuPdQt2Ss9OofmU9Y2br67s5QrHZ6Ugk5LYwbmZW2u3meN41K82rYqgrehjQnjundpVwOJ+7uc+0sMRbk5+9Fd2syj+V1/pX0eWlpFRmdYTBb/2mx5FfP/3ivJln31+w3lewbCnr2r/7iv/D25vAR1Fkj+NV1df03PeRSTKZTA5CgIRMQrgkrVxBBMLNcCUccomAgIDcp4ggGDkEVETBC0RQIMT7vkHwWtz1xGNdb3Zl3ZVkOr9X1T2TScDd7/fz+//+k3RPd0/3q1ev3lld9Wp71lZXVcUd4V7jR48qwt6FW+w73Nctq7h+2thOpCL+otD75SfWHY/Eb+NOzZmttr0x/qdddy/bEho14GBJr9I2OYNuGIpz1y9z33Hn1de0aztkEdBPZAHaqaRM09WoOqC7lNH+SFYBn+/zeZwOK2/xWsz52aFCxPESbwga5EBmRi6fk5YWDOYU5nuFomLJlFcAgZytOsanZ7Xj7VwoUsi73K7qmB+57fBnSfNyOfn5soXSlK5uo0t3VBfnZrFm5AQJpi+cfck1uHxddLGGWDYiwcbpf2UgxmVRDuTbFcXRchDr8giGr/KIF0vRfP42ZVTO0m0VZ2Y9MueMsnVxzogePZ4tJT+WPKuOvDXjr2rFLcpfyQpflYo6D/DgjA5jQlwdE+xW4t74C5Xz2/7+97+/Q9o8v1Lr++0ItNvDvw1xWAiNUuwuuyD6gxZrULRb+XBWoB4POCE6RIfdZnddacbD2ArQA+Fu7diGByArnFe0DAwrWqfWLMmkWTQpozBZxfQyW4g+6qBZN/HuQy/E6jvOnX2oHnevPzL7huInx7x4kH97xndvqf9u3HVv34bP+bcbysif4+/23bed3B8f8vb307T3eLeqf+J3sPep77N3wrCPu+hKhe19dKVCZtPGgHxNApvfBt2sVOYgZMjGeVZfHud0FmSkp0sGg7NtAYaWnxfLt+d6vJ55sWxvhR3bvGDw7V671xQIhObFMjICoNvnxYolCBhNAWrcx2mS9D8x7LqiTyyfSuWmU7mPrRdPGz+/tBz2zoQEiRIYdskX5qarZY677ux/64RrJj8349OmjDULeX7hqq745Rl1Y4bcevv+bW58Ss2FyP8v+PSjdxdesb5nl/Pnb+9fmLMZ/6msYtPk2oO3Dbya0oAu//M2yIgbVSkFTuS22lzYbjFD2CuAH2ZzC16PiyOSQQLn22wwCFYjh4SEDSuKJkzXJf41W8kpIuk+GPzhKHVMMPeDmpO27fn77nt+DD53TrWQK9SO+D0ye7daSGbvJZ3ib9Ftb7wWMGO58wE3HxqhtPdRR9HttBqN/gBye9zVMZPBzNsEK293YpGY7eCii3Yzb/RwRuonam/1tEjAB6FAl5Su9US/BHbkegQPbICmUJZbBhvtsPSQV3Ff9Um6Pad9wdabLwXH8c+P3nvgAdjUcVh5ZPfBB2HDG+9mPqSAkPoU/5pQgJyoHPUEjzIGfDWgMxpYKhs75laGvYOHp6cPDucaS5E0ZnSv3MLcCbGOhfZuE2KhoRNi3srBYT4UUmRXpb0wFLIXcoEOV48KjJoQ466cEBM5zmUMQL1eoyawUDOHrIpLgc3AqbpMYNcsZ7maVpZEKdKp3MUcKQznjMuYLfSVp+FyK5bKOoGbVe4TJa/T4yZibmqnpghsQA+cYEOxps2jJfxr08ZGytJz/O4bI56rfeMHDZ0cb6NM7uwd3KlL9ytLox09eSO6D7q3zZJXiyvzsqIl2w5MfZhYOxZ2BM7pUBo/OLhnceaIsQOWXL1AHdymY8/cjH7/nr8+lPnOqo5j5uDpS65bqO7r2r2kV0+la+/sTbgNHlIjtE0v7X/lgLD3irGC+sP3j6sf7v5m+NDRA4eOGscdfkidq54fU7MdB+5588fGidmV+bmgy7qrI3n6Hi+M2qPRSseABzzXNAhC7IKQZkz3+MQORS5PgPMVkjQu1+/35eaGamK5nM9psNTEDG4Iql5JzREMZKfauxXLU4+Dc2kdv/llmq+RbyJSBAcx0RwOKUFOXw/MV/ztqG/3psqqob17KM7F5x5Z8TDO23do/z0rl+94sEe0WCkrKL+Gr3tGHRvfMVBZvsF1V3b38uhV+EV1DHZdJJnqn3Av/OPtK3fumFvWp2fngeryVX+jPhr1Y58HmUmHKCufRTNXOyyZ4dwCPqNNfpbR6LKZ0niSkYHy5epYnmCxQhWziDUUdDgdNbE2EGrnZ+UX5x/JfyH/TD4o+yxrsfWIlbdZQec56QtVt2yuzLc6ndZ8zuR2t6uOuTlTIi7TIs5Cqu7GOXTdkPguxH7WWwd/mvhR7mVUoyaPhjTNLm0Z1XdwFSJz0BmdhJLysMcRBheDr+Yn39b5q3vUb5+nLi0++dRfi1dNwC9w8VdJZ1F9Yf9Q1YTVIXW/cY9nZa67YUlcJT+vm7juh+XXr3N68iem/zZ8OH5xiNYn0Y4fBDzhZZSappT75EyPlecDJiGMnA4HEmQ+kuNOM6VVxzwZsHlEE1TaZIIA1cRnBsQA9aNE4I3oqeY+COqjglosbO2c6htIIhtBVpZHHHa6DnsmBrWe7wgLdsFhxdgBwufgB1z/0pil5/6J/7T0tte6HOx9N7618Sds2bAWb+g0u3BdZR/Dyy978BxcRjZGblxg2XN355czVdmvppfzhZ64ulidJual4yqoY8L/8YEHlI1uVfpLgbQMPksUfRyPkYd3C+4sk9Xm5F1Gl8EfTOezZNluzhKMgjEnYuAhGAcfB1uCyO6wV8fSPQ4L/BmzXJxoTI1iWjW0ZtycXaKab6O7OszNiSYcHdq4rggHTqQLmrscdK4LvByPEM4Pl0fzirAkco8Ne3vrLW+ujP9l5Zvra98cpn6Fhz/22iE8svFp/GyV+lXZsQ45BkM78sW57eoOPINu289tx2fU4u3nzm1fvSKYztYdRzaw8c+BjS9Dp5Q1bXJD6XwQIlaz2e3Jy8gIWowC4ZHNFizu2DHoQXyn8jYcz1XHcvmQyWyCOpsreMybeXPUj4rtxUoxR7+y4KCquKb4fLEkc8XF0Wj76ljUFXKDuQy5i9yz3SvcW9zPu0+7P3fLNs5NBx643X4/yJefT/TKUSG5QT+mh1q/VWsvoTnoS/rhJRoJXcwx6EEqMBAPVE0YfIN8rSuTyRORmK+gK+9yHwln51TzwzZnj1+4e078Bu5ag/rNstv9z7T74oNz/+Q2vhYaPWfF7W3IN43TjQ/cu/2x9CevVst/V3/Fc7Mzt7evKCrI2J6W+eG1c8JHtj19qGx7m67twjnW7Rl5c5cuWJmr7j7FfMYbmtysn8+HMtH1ypV+pwSBStBj5YiRWJ18KEtM96SDKHlrYhwH/CcFbcHqmNVmttnlLLkYaCmvlG+Xz8hfyIIs21zMlbrBEbXrEhaNtpKs5IsgzLsgmMt30IoKunw5ISrDbqfPAY7B+9g9/+HMhf0fGXPvLeo3S79v/O38UnXqpto7bxZGZKtnrxy93NXwUd7PV6qPhz/52IWnYgX3wyNt8xs//bf6Dx9f5FYvgDxtbrILZjEMdqSAjsQSImURKIv6N1RnQdhItywHBETg1rr5QqyHlVku9h0u6UTerB23vX7v3hdvG1prxOdvX/rQCfXnC1fgjnfe+fk53G7wE0casfHwA+fhcwsfvfUT+KhPLt4fcD6x/tgb3F+vG6PWqKvmLlKzb6JjCbfyQTxb/N4OZI7fhUMsRkdNF0Dmq5ARNFsHwHKtck3HkqLikmIUcYiiCaHStunpBRkZvkgk2lEs8qN0e/r5dM7EpadnZaXVxfKy6sfkta+L2dqCwm/bNk+SrXUxTq4fw7nhO5B4haqFiYVJ/q2oSLw3SAnEm2dhJF/mZ3GpLgWbyeJrdkP0kJy+ceVPbV65csO6W7BxW+ceV3XuUnFFt8ZY7y5DPbdZVk9cf9um9eMXe7YYC9svO0JfYOFtb549++b776ljHqi9Y//undvI07c/8Ih8067PX33ro/VLTZXDG8L0JRfBmU0/cvcI20Hr56GNiiPDC6GeTebA3/Vy+W3MlnrsPx4zm402IxwplpjNFrIRmbPZAjkQ9PjrYjk5LuTKoj86YjZXhWuQa7ZrhUuQOZeI6nHgWIznRS/SoulkLK3H2Ik+S3qa5GHdRaPDiwkQ4gosghtWri2CAE6YBLTSXyI7OjnJa9GBjt5tPp63Ljp4UNmaJdOXH9lSeXdleUl0yvKB065X33xw2+FgqF8onfTfunPfhifVF4ZcuHYh7560dupNqtAbuyiPeGH3JJDDivwoB6Kfa5UyZDZbckNui1u0GQRBDLSxibaCts7supjTmevNzQN/yOlNB7bwYq/NjCVORiILd+n/uGSQp1WseTi3M3lIwwEf67eL4jwa3zGecNhT3SLKEuB94wPqPzhu0wvYa7iNVC5a88/fVy7cXtCpc7v8sq7t1VfwUT5tVJfrG78Wejd8tncuZ7/4NHnizAm8Ht/89Nt3rli2a8eqm+I/3nKL9n42hPL4Q6CTbNDi+agY1SilvvaZmaE2OfZQjgEZUMeSjPZvxDLaKe2y3oihdrTTFqShnc3seiNmxqFQGp/2RkwfI0NfpkBVaSvSVbVPFSZsXRed60sorxM+kp0DLp8zB/xjp2RHUDvisaNoCcqlYy200QGuRJcJf2iz+vsTR9Tfb9+M5SNHsLx5rNr47Z0fL0BN332HSfzWFTi6+c7bl2+pHnygrmoY+f1r9alHDuBe33yJ+xw8oD79NW6P+9aq37yhfqjW4cqP1SNcxfLZCzZh1LtSfX84HQ3BXc2/IbyN7NDeU5ROPGc2G4wSxLd2l9/p9Lis4Aq77IE0B8S4b8SwKFplL7KZQ2ZiNtj4EA8m0vUubexx8F/BtG6rl2paW2sjDfVOeImLkHza3C5fuQuam3l3YQ9fLb4R21U0/e56yxUbdzaOmH0Qv8ldTZBTdeK1S1VEVqlFkT14RHwFyY1/THLHjtVi9W5sTOtoFEF9lQi4X6aAKQxyG/SEuXBOrtnvl4NpYExMaU7krI7Rl0NMTemeSTNTpkwNK0EOEK9O3bAnXMaiGsaFTh8dElTiyyNldkSm/hOHHtt3Y7s31IybVz+6/+EDa9apGW+0u3HfYzgkjFafUX96Vj0x03T3FxOx4dEv/vbjJ4fU3yd+cbfpetzvGezGPZldrG76jF/DV4JdDKFhissSCvFuj8cPbkVW2O22OEIWpllCITrBDQ6PxQx25ICDJ2IgqxUtpQtdZsqEkJ1H+Y1qDKcn7Eh2IrgcVJ1KDjJ3z/l1N/9rx85fb258tWTf8LVPDqyc+Mn26P0jj96YXYulex5ETbdvVtUH1Ls79Zm5vO1di8mt2FN25Y3q91SGxKYm/lU2nsAEOqMMHVImWkTgH0yMslUw87zJ6/F0iHCooE3QZmuDIiYzMRg6lQc7OPOcgbqY1+t08oa8wroYKri9YG/BkQLexhUU5AmiRayLQQRiwRUWbMizWPIMHDHLHMcRGlJU6ENzmztPmjVosnulRcCb1Dopw15lHJFxfkSKgIuJuejleihZCCxp7Q8ueSbhxzbGr+dI/Ey393vM/LrmnPrzoL3cmBU3Tlvmnmjt2WdDoHTUqMo2C+a8lTHJObd7RbBT5dhr2gm9Lz4t9I57//xn8n3cS2LqZ/FeU+eMm+rtpszOaZcVzIj2LZ0847j12tIOobYhb3rZIODrNyEYeYPvimQ6OlHiiCwIBPwlE1uF2cAhffllG6porWFZRWmnoSOx7LL7WByT/vFPSA7fteG1jbjiVq0vzNH0C12j0p5vOK/+yMbgnD9Pc8z+Az8aP9bU1PRX9vtg+P3vl/sdYfApXtaf/0T7/Qeay/Y3/Gz8GMpR3DxH2vlhV9wOF7XD7XCNHdsd48oc2nLjFWX6+mwyg0PL+UdTSIPT2BpOHwanHy7qh/shBQh0GTi5SXwuNIU1OIZmOG0UH4DozOB0w0XdcDcKp5iBuhRWF4C1j8H6Z9MVGqzjGqx7AFaxkg5gCigsVrFqMzajGgTRFdZwYxDpfxImXD4EMUcWPxBi8WlKttslUjdYcnFpQbuvKjbHjWm3cY17jnul+wW3KLtpVJ0ZzIQYwe61ibPFFSJn5EQFroii0chVxYz21KiBcj4EDIUtRjNipr20CMDpsJMki3fiJq/aPH2u9cmMPz/0xflfvjp4zlNnW1Vz63qS/eWzM0Zb73xUPaf+ov6knnvqbvPMae9S/A1oMv8K6YUsqL3iNttMEAsTIghWDikmdFifj8wMoD6KmulUiEm8vkhePjgvURp7fNulR+WKLVtWVPbown2KC3qu3t4vp9/21T1HsLEcC5pe5kbwK6CMPMUhm83EYoFAAJnk2QQTARW9Mq6kS2KuslZD5hZFvT4PBMwR0q0ZHre3uaTGSAv8CxSnCRFZFG1mq2xWLObDMWJBRe8w7N/RsS9hA+/z8ils1kMWLuO+SQWJV6Qi3wp3gpBsMjHcSY2MZfEyuOd2KqeQgTZenyNKapvB3Z9KpFTa+1CFkmF2Wj0epzOQaAG/1WDyEK0VoBG0NiiB/9R20A5atUZK7VLahajNxyktlDxIqauPjWxzu32yzWY2+3z+gNlnrfFgDxA40WYnWb3ZPjG5I8mfqa2XQo2UdkwepLZnnDQfs7GJC5oqGT4cCqKhSoGIAoGgBTuddnswmJ5hDzpRANu4gFdB3OEYQl4bb5ktYlFOYBfVqHYSBKkFmolOawGCZtcfIIsX4C/UrFcvxXhaFT/qj3FG05u+4ScJr0JU3A5NVMoDKM8Qsrtc0NbtO4Tsdosle3DMZglZiiyDLNWW2RbRzlksQnogkJ7urYqlI6GgKiYkHQGkdzLpltDR7IfpDY/dRqzFW3TmotcX7aT5NlI5mDknx0YJEM3ddvKTxj7yQ+3xV4ZtevnGybtzeeGO2u63luYvXfze13/23Dz82v0zZk+ufuBG7sBRdbX6zw1v1i1oODp50rCKTq+8m5+ztYf6Y/xfsbnr1N9Xzbt5O6bD2M3gMLwgrEICRKD9lFyOiCJvwDKPeZM5Q8Q2EVt4kSM8D1cx+N/gqzkT2s0RLQLvkr0sSVTJqbmT0TIcxR7M4TA2408v4K/i+yeqb3Gl6mu1/PkG51b+ovpD4wmun+YrTle70DWGkISyFTvHI4mXDLJAaIcdGw1eUZgyChKzUXthB3cgvvx57ne1izjj9x2S+d8XNFhBgPU4wDKhq5UcieOwgRAjJ2PRiI1mCwegq2MGOumEwzKSoTZ6pFBB34608JKjzqS2dtFhpcBoMg57gmRJfDt/VeMTpDL+MHe/2uV6LptzzdgZz4hLOzUcbiQ1/Cjyj9Q5N4di+GjLOTc3cl+RmjvuoDZNH/9pF6XzTNeex/vJx+Q0PJ+reNkkEjoynr7Zq4BritVRSbEeV5gcEUzDs/M/4P24UP0Qyh/Y9A9+mTgM+LVY8WEkigaBSAZikI0CORwTBCkgMrJ2SfFN9IYTIhi8fheOkg0z1G/qsPUf+LFVVs5/Y3ygsJ72w2agt/mD3FnkRlmoEI1WyvL9diHMmzLpSPb2nhxrzqGYPyyE7ZzBaQ22NbQ9FOMqDNWGJgNnUILtKg2K01tpoNN6xkX1Gb2styyF9LQTUu+D4Jr7Glx0WFtuNu2r0cYFCEwwtLcaB/cufnJh5z1Dlu+5b8mJeasfW7FLfeeKqcXtp1xVOX68WtNuas++Y8f2u5EMfPBTnLZ8xweHD36kfoM9Hw5Zvnrlyi3zrtt6ceXKO+bM26i1XymQfCf/OshEUDGDGufoTEcgHJ3GlqAYNCIdqhQuHc+LDXfzrzfcOZ49e3eTyhfzBuRCYcXmQiYjMro9gg2eNlGaF6Wyss9RytJbYG14DOsyuHv+u6vXvL9w6it773+BELTjl3Vr/7ENwizy3NdfvqSPx/pB7cKdE76CWCNPcbp5XrZafX4n8JhTMh+KSYh1ZbSYbUQhJ190lLG+ClCW3Kyhscf2DSrv3uXAYw+ObNdRGLVwbkP7R0+4tvq/4999tM65Lcj04UxcxddwF8CmtEdLlWvyDEGPwdOhqCByKJZWoPjSKwtol2lBppKXmek/FKvOxJmK01OJMu2ZIHuZbpNJOBQz0RtN9EYT+HfOQzFDhT7qU4/NmzuntKFW2sWSFrIPXhLTjGU0dAphygrlHivm2D6S+qsvE3Nje9f2WzesYm7fudsHbO1jiw3MWD23+7zesLtxKPup5/wrZ++csm7rSPJbYVr73Ojtw9oFhEzb+O1t89Svxm5tn9suraig6LZhHaJuSvf5qJwfKdihbTcoIy12B+Kx2SiJHG/CBEIos9XAu6y81e2xG2TDoZjFVCxXyTXyHJmvgt1K+Yh8RhZs4HNwskPggSYEhfgV/L38Yf55XuCpZNCOixuiryVJMe6G11pqJd1lYC+0WNc865IPu1iXPBem4bUH/7qz9s6fcPlzqolcsXvLTuxR73+eZOBR6uc4vA3P3IZz1E+2qdu2gTzPRxf4kXyVPoZ8kFJk4JFJgjjGbKF1kGUBU0x5qsJm43vxYXwa/4KFKoxtOIQJhgYcN07nt1b9SVFN0WF9m8991Zihbdwz27bFO2/bhicDDkDXpk+BrjeBh4DgAe3tAhf1hNnLc1qlCK1e+Xz89dj4C2TV2tvXvKv+NBbPVqvGEnP86JLaJWoD7jOWjNp2ZhsuUM/C15lt6nfYt+0M4995dN4Rf5qNox6kdJB4ZCQiEk1mCWooYTYu+4yIi8QKkYjcHLKSHCGcjQwi1YROIho3Lko3J5tvcGkNMZ3QIGgavfFBbnRjEDT7wlN44271YfXhXT/W1lIc5gMOI3UcBijtW+EgCoRwc/iV/BGes/GD+Gqe4/EZhItA49PZs+PGlVAULotBOTVOWCfxaMCAkfjHXXgUHrVbvfFUfAPFgOIA4SV/Fd8N8RC9guYQ6ERb3mgiBvCykXCY2ULkb6Giog4ZO3LDsL8Vf4I/abyLc6oL1YVkCX5BVeLrhhOE56qboQ3noWP8SLB5AspXvHTipQhMdChm4yq4XziOq8CYskrRuGb9iR3QrB4sbsXUEqrDSI87ECaZ8V08ER8BGUtTjAaaZMljNzHNe+pUMqUSjmijnNnLW5b1wUMO1+7f3ufakkh+YUbQGy2M75Iyv8Nyv875HXMKc+58iM1hj+8ih5Owict1WdhRh5skjA5LI1FGMmsf3JoCW3zk31/+pDakwm76jRTyZ8kzdBTYcQIyg1E9Rk/EcGPrmbPnSKHWHqyuDB/qJ8iEo5M+VHRRn/ShpdaAyCmztlZ85LfzOm1oGQL4SUZeEEQs8SriWEGoUfM3oazE2BQ6opZkkifjH9WSZ2obZrH5DL/RMhMwOJ6nMyvVVGRTYXBsMpiRPFkLSF/8lL9Dx5vWFfAWUOgEmEeRk4gAAI7FSCNDv7AZCWYjoQqkTbyv+Eijq1anFas3wwE4n+JwkYF4goK4FIco4NCG4sD91LA6STuGgwQxoxmcVkkycLKotkKkGVAzNoykgM9HtQyhVLowePmKRQCAMjIIKnexFWkS4JKIRRhqGm6/nefv0GGxdpJQW8UqgPtFZAzA6OzCFKagTifjjGQ92RBo4BDaYMAkDbMYwXXeYrhReIQYRIDHXRTwf4HnoPVllGvD8GPkT+AH8EyoTHEJskyMRrNowWYZ6mvQkDwaEyhUfZZpM9xoKuiwXntGzEQJDGvS9BteyJ/l5jC70kExJuZ5CzxrHyGeQL0hESY1z+/mdIMBlGgIgbx8Xlur7tR1GJ4R38VNYjIjoSzFSjiwv6JBlgiQF5q8pCKa6i9A+7BtRm0tnqbJkWxvliXAT0ZdFBtvMMiy0STSWTUqLzEU+XhCshIoIp2+jiQ/JQeua2LG6MDNqT1b25hN/fgZOh/IqL1ikQw8Z+CMyEREWQTAx2Nyo4FTtWGdLDFHc0+3R5+D6eDPqpsAHBNf/o6GWUJEpwHDXYAW7KZYecFkFCC4gQDNIsoA+kRMjJuaNYOOfzRB5OZyGO76fgZ3fTwHqEQEKBIqcfEpfrZWD002GK3KFatEDAajCeIyo6QmWrMh0Zrxy5FKa9KysK5MgEigUPBCqNfFAu4zDT43idGpg2LX6GRCRiCOeKnEtCAUl5is6jBy11M6aVpKExyiwW2mkygRLGHwa3jebJQZ5sY4q8JxqIKEtbZoZsZmOtGAswxHWKftpNp4DhFq1U1E4OZcLBD6sFrUMp1EeR54k9LJQlUI8JSB40yiVpgYT2inhqR2KmzFUdHEZAhdR+l683WonDanaoauC2TQBSaDIBMBXGw4AMB1MWJoFHUpKGzBUJq0wjF5rxbPb9xae5bpPn55o4vyk463TiciADyD2WLkOIvBxDA2NDDUj8dIXC/gsnRixej7GbXkk8atIHV4frxBfKShulYogXpoOSMWMl3L+EkWCTEZGT9d/F/zU1TnpzYaP3FdLr6j6UumIxg/gXWiL0Kw0cBfhKJws5W5lJ+wBhP+uEmA+3yNpaha437SdBqDq9PJYKIvWICfMNb46UTM2CDyFxNlxP9Y7mgx4ajGT41bySe1qlQbb8DzoRb8fY2dalvaOBPqAfUALW0ygZRDqxjV/8RSrfRUC7ZKGr+EAXxd11ZJvcLsjAl1VGxGk0REk2jmLCbdsEL7Nxqa2z9JuxbWlTktlM1Aj1C9rVtZpne5ZBk0Z5EN9VUcVkFwIGyTZbMBG+wOs43Vx9zA1LAigx42kosyUhlXJ96tpb5O0+Y001kVTG1q3NdQW3uWaTLGfvFdsh0YsDFbtjMWTLH3JtRdcciUuGYLMCHYwP/Mhql82IIRI0lWTPDib+e5z1BSDyXp6gTvwmQUjRZkNgmq4RIXI5rKkyl+BqWrEXiSWbKkv8EvB7IiLllGkq6i0SibOGIidodFkuxWC6uTNW7Q6WpoMDXbzMuIc6oBpREZ037QrrRNKavWMhWoWVTgWE0JEs23AJ1L66ooNvB+LGbOZLIYKG0NWtFyQ6ozFE+IYooT4GjpE+neAHBs/CP+HJAXmpL7jNIBpfpbJlSquGSjKBgFYFpkNgJ5L3G6dJl3tLAiSYMLpWgWV/e/dB+MS9ZLYDOt+ylOhE1GbHTYLQaDw8pxdpuVqWBbg8zxHDsU+bhJ59vEiMOU+nVJci7QNapJjgesTAOjq8a8RGgIQbt+RusrnK2tTfhVOi9R+hJiMZskqSV946nOYcN/pC+TF0Zf5sjpDhfXBeREd7qa/U9GX+BemchmE9BX4i7Klzihl6WvXiqUwpQqnp9Uq5pPyiXrlaSvwSQA8zrsNp53mGXZbjEzolrigsyULVg70LZJa/eH9E3apLIwrSbTTPEGnYnVTfw5pgS5t4CHQQnXpvrHLjRCSbPIDodInE6P22Y0epAguB2gIsw8UxInYrLQYE+4zBbKyzouLTxnR7PKaGW+mqc+JrRHUjnrWkTX0EyVtMCtn+J1Go02k0tiatrNeyxumQ4QpkxgijmJtRH0tj0h4YnRnsmmiaZKebME6CYwocHPAjvSNtO1uCYRrO3YeJ0kPrTdHMiHJippblH0SYLDQeySPeDnrNaAR5b9gsfrYRQj3gab1oSKMWY2xh2i6kwimUK8Vo3ZGl0uVXCiunKiTXs2RYD0ZmZNfPEpTZCYumL9qIjM408xnemsQxCzk4sIFVXo0ToOO8L8qYYofwru6qTdD3WFs+b7qXQXXXI/3PWX5vsZfNcJHb6KKiou84Bs1+8nUxP348vdT6bSW/T7yZQkfEcdRkLz7SUJ6M13I5oRMd7AT9VjJyplLjbSWJs/WYiKUBSVo26oAvVEfVF/NAgNRSPRGFSNJqGp6Do0G81DC9EStAKtQevRRrQFv6XMsOb1GbFYmDXLlt935BJhtpjZaeCtwpQpUqh80EZhqrNtj9HLhblzXYUVY1YI84zZXa/eLEycaIp0679FmDRp3tTZ/HULSVrJkJuFGTO4YHToeuG66273FfWsXiMs9Ha4avxqYeGCBbVTJ1037bp6zINqm1wzrXrMyGEjtbOxo4YN6j+0aqh2dk1lVc+Kvr36amdK917dyqPFUe2sc2lxUWF+Tr521q5NTiQU9Ae1s6x0v89lo44HPXPbzaz/UzsD+7FmxZJFS+hZKLZy6aJpw6p6Fef4zWjRImT25xT3qho2zbh2/pyZs2dqTyycN3vLxvVr18PZsdimW9ZeRAnR8yem3zi1cff655Lx2P+335RdfHq+Bh+bpsoGJOuHl/vqWEyno+bqm/C/PJb+4LrvD+5JvY7/4HjqVLxb2+K7pkzBu7Wtoem/Xz+lXWo8OWUKmTp1qjpF2041333qslfpA5eDJ7SZSD8Tapo/ky49nkA/E8fTz0R2rF2WfmIP4wg7Q6iSyeA7/9/JINqK7kR3oXvRPvQQOogOo6PoBHoaPY9eRq+jt9Fp9D46iz5Gn6Ov0LfoB/QL+hX9CzWgJsxBKGzCNuzCPhzEIc50lJRMfLAeG+uEP/2Ji056qB6bFI9wNnPg5sd+Ez77LDRoy+F/CZ+LnabcX4+tdcJ770nlU/fVYxvc9H72kOVPXBS+/DIydMXRBuErY9cZe+qxs0545x1Tt+vurccuuOl03ojVdarw17/mj1xzokn41tpj1u567K0T3nrLVjH7rnrsOy683Xb0zU/VY1InfP994Zj1T9dj7rjwg/OquTvqcVqd8Nprrp7z7qzHwePC6x3G3/pcPRbrhJ9/Lqre+Hw9lpSQ8Msvr//w9renv3r/87PGj19Ou3rxgX8If/lLsP+Sg78KH39cj7OO+vou3FqPQ8eFl719FtxRjzOPCi+/9FI9Divyy6+/ffp94ewHZ6kcO2IvvPLGyTPCB4ePnnj6eeHgwwe1q48eOVb/jPDw1jvvunef8ND+h7Srt2/befdeYf+KNes3bhF0beGILV259pZNwqKp182et1CYVDNJuzp52sw584WaQUNHjqkW+lf2165eUzVs1FihsrxbRc++gq61HLHSzt2VXkJxKJJfWCTo+soRS8/KadNO8Esmm8sn6JrKFOMNZrtbQP9qaHqSNu5R4dfzv8IvR2MX/t34JEZwj084/8HD+xfVVBb70fnzyF9cWbNo/8MfGOuxQZE/+eLrv/0ofPTxR/DMidjnX337wy/Cx1e6mjkEDJgJG2DjUQybsR27sR+nw1UWEOpzZv1F+kErFedrNbX2//b7f6/i/udf9M2uJ1J+mU34/+F6bqtrCaWaf5lN+gM4vv/l/fh/eZ0qzpb/DaCMT7X8b7z2/+IupqaT94Bm5nZfct+US4BN+R/c09D0P8FBV/oTL1H9NX9gBv7w+oTmj2YexqcYiQkppqKFwZiYaja0D+rM/ElqO3qjfmgAGoyGoxgahyaga9F0dD26Ad2IbkLL0Cq0Dm1At6FatB3tQveg+9AD6BF0CD2OjqMn0bPoRfQqehOdQu+iD9Gf0afoHPoGfYd+Qn9H/0S/ozjGWMAytmAH9uAAzsBhzqFclzZ50QNfC6++qiud/tfVHjwvvP125bRbHv6n8EZmzZL7vhBefDF47U33fyO8NGj2xsM/CqdPXzNz86N/F05mj11xzyfCs8+GJizdc054bui8rUf/Jrz/ftWcTUd+Es7kjVqz6yPhyScj41bu/lR46l9Nz4JlsuEs0Cw+7FPkYfO3HftO+KBt47Og1ixM43iwR7Hnx9bu+LNQV0x1pNCr17+fAx1nALUUhhv82K+Y6j546sxzJ196gzNiMEaKve/U9Q9dEF5/XZAtDg+ErfU4WzF1KOnUtcdVIkKF8ecwj404Ax53wl9EMet61tvzrXfeA0t1VHiNvMa8uiefffHVeuw5LpD6Z154pR67jwrCQwL7STl4+CgYxePCQxUHHnsCLOVR4UHxQfbTrnvue6AeW44LIhiL/TSxviCvl9lP3TfWglWSjgvru916O1gl8ahws/Fm9tOiJSvWMDNoXLh4+WqwjUcFy1SLZgg6g2VpEqaWz5g1VxWmWKdoV0eNrZncKFjBvExqEBx9Hbop6T9o6L+EvtGrBw75Tejj7MOAfwRavx6nHxecZz/+/CswrEcFzwUP+6n4bz+eB4OppAsXyEPieuNUa1/nhQvOvtapxvXiQ8To7QXWEoz2UeF1/Do8URfDahEYDTCuYHq8vzIzkpaZnddW8KKEVWDD4f5fGwe//TVfiZaw7P+ZhYDoKloWucymTyprtUU8UcdlNtzqRh9cy0/ZpFa/C3CtPPUctjBsUlnEkwvfLm1+W3Jr/fx//b1V+bj1uY4jfS4DQ7k6zBbf8DsHG/9OQ8mU5s/U5r/UT8POxOVUlaxfizclnms8ORVHQS+DP54ElXyw9XkzIIJTVDo5xX6bSv/p3Wyj+/gunD2B/kdqcHgi+09Ruy9OVD+vUT/V/sfDXpyR+OmF1vbhhcTBy83Pq59fov6bLyXvEk8lVH62fgClQgETGNCXNTATtUe12+FG1sewEN3Ij+CHabnWBdQy13rYEV7Ifd4Y5oc1hhHNs4r4t/k3WexBsxISIgscZ9BHWRZFU97B0kddjrCD8G82lF/Dd6Rf/LKG03xHhPE0vIKbzC0BOGk0XyWmOUrtDH7RqXHJsQs0w+JklceNeAVuZO8Xmp+TUBeFvvORMDbISAK1pphjDIjMIUJEuPB4jLDhKPZXtEl5zYPZ9NSNGvBr1LspfLUKT1T3sPHYffhXSfYf0sPAP9vQk2SrOXSuMSrhn+UfA7w9J+iQFcTh5N2OLh2Ly2VsI6PIiBJ+acNaOi6w6Rug36NwP8DmaYLhFNgyLuXvbJjOPxrfE78L6XOZvwH4E3T4gEsr+DLhn40fiD/MT2hYyy/VniHwzC69jJZP0PeQmN9Fi2joQq7VxzXFhL1IQDKqUtrwnIiwyBkM0KwSfS9okgUiSZyBE4/EbByW6WjYIyw5e8pUxyuKotHU4WVafhOabVTGUZknm4eo5fjNIfht1aruwRNxDTlN3o13JGXxt+MvkR50XNE+dD/fli9guWeKFaPfYLAjlBU2u6EZ6eRMnk9nDZqclZfanK7EGEiaQCa7Ay5301F9PTCd6xPJtuJ9i969afF7N9307pLFZxaNmPjQpImPTJ54cOKERyaSyfT6+/DTokVnFk98ZELNgYnwy8RHKCNNQyP4a/khwGk2No8rH2Lrcoir+0JMPRLi6akQSy9EK8DD6Fw1bdqwmZ0XLeq+tM2cOe3mZ9XU5Ew2VFaar0GKwveyFxe7S0t7XTN5/tKZkn/U2HT/WP/KVQMXzF1QjwN1savn9lm+eDk7vGpxp1kzZrHDkhmZ40ePZ4dpo70jhoxgh84hYo+uPdgh6Wrt0LYDHCremLHt3MUzRg/p2rZt1yGjZyyeK03MmziFTU2dmJeXDQdPxPLs7N2Q/ZXmrA1a11HK7PP/vE82cMu8gn+wo8NvI9llpdGSfP3bpX/79O/E71Krc/xffm99ntsKfqI87rPSzp1Lt9Hdv8rLysty6JFa3gk+h8rLysrJELqPp9ELZE3y3vhjpZ07dWI34zfob+pYuv8XvXkbPeJ2wK4dnKnvl5eXfQUneCscjKbAFsIOP9kp2iXeC452lZZ2Jun6TSoHB1/Txz7sXNq5LRyArD6GNvAh7iKyIFcdbzRabRII66mkAmRMjSLZqAxYnEyZ9ee5qnqiTlVnn+Uuzv/LjBOqirm6mR8uZGPzcuk6MzzNZeuiupk3g0LyYLcdwmuAWXQq+W6OjskLO3ArKcnl1zTyC95euODUggUnYX8jv6ZhGblywckFcAwXF9IswallRFhGWbc53Z0OJeXiHEMWtvuhrE/fgf9WL6xZia3kNP8yGAyeeGDCBBBCth9wKTrJ32CfihrYhll4HTeeuxFoGaC2wYqQW5LSgpxPtw2cnQPbwBmNDqZKjH9gG9iAQC1fnK/FRGVu/J0Tes3ptfXaqX2vvmZKnz5TJl49oJosu+62K+f2nlp7dd+pfaZM6dP32uk0L1AQEf5xfifTZ4WgNXqjpYo7L6tdSUVJVm8egX7rCwquT4/O9U1fnJAtlZ07d+t2JfOaywoiBfTFhj1WFOmmmO2V3SLdItCYVBM+EWNqEL7MqOhkYXP2ZU1Cdc3YbIT1JBJUQ2ozkz36TOXWGrJcn3pO55DkphxjfV4pI0l+8B5s37MH2/bco57fs0c9f0/Fpl9v2/Trpk3/gP1tPxZkZLRtm5FRgI8mjtRpXZcNrFrapeuc033njexABuzB9nsSD1Ng8NhtFzbS5y9YtEcSjxao/xjYtduAjo+36dUb8Sn0DIIeLkMTFVd6ttfexp7dgTcgQznqFHIFXNq7y9xAUVlZSUk7GrV4YrYAtgHVB5XMLllRIgRKAiWUeK+w1Bv6zPyEgsMpiTcupRlLXaDPqxFSjjFbW1LLrHQpiXDhZcjSof3Iuf1Oz+kK1Bm0rMslZMGdUuhAv9X1vXoVPN6REgTkPK3pZv4JPhPoEEXViqtNTjjMdbDY7T5RTOO40jJfIfAIRE4+nz2cE2b8InbUZICbI2JRtIRycA4qGheNwlaYeLFQmJpoPTE3yuXrVA6OvZcuhcPy84h0RRyRJbTJl/LLWcayTuX5rhSCfLF/5NTKKSMfiD7QR/7uO2NvOBg5pXLqyP3R/b2Nf/ub3Gf/3Q8sWvTAQwsWPMRtfKC38bvv5D4p9/SR//Y3Y2840KCoixc8RG99iPl/3VEf7nZ+G/KibOABr88r2Fwu7M5wmEyCm4vkuJ1e5KXdvzEb3E7SaLVNMSs8aeaIwZDFJN/QLPklOgekLhaRUn2IUBKpI2nSQ5olkoY9qbXFo76fu+3wkiWHt839/vvK79utHV+9Zu34MevxoresB+YsOXx4yewDtrcqv/+edB2/9uax49atprp6P5rL89x7yIPCaKbi9yKLaDCYTSargNLtyJ4dEaycyxWg6AdixS7s4kSLSVJshpChyMDJ4KFxXIhVhkPNiSbSTp3s0sX+SnMyRzYXhqUqSE7YZHoNF+Gwz1GEsS7n5SkV2n94yZTBGH9JcH9fuVttUmjlKpPVunvJYQVjd7lPPU6+VJsGT6FVTNaM+p9TaF5d/iDUrFhJM3tEu8cRFLIjst/s8YT8Rf4KP+f326lT2qVoXJeUvLBU+Xp91D6w+dqAkydcBmglZvCUg8IiKzdfv3r6LZO6r809XBvPqj2ct7bb5PWTbrl+M39wxIcjptw5aObqLoXr7uzc+c51hV1Wzxxwx/XDzw5neE0AvK4DvNpSvBxpJk+aN0sobGfNcKSlhTKKMioyuIwMz+XxYlZLlMoTivFS5KI+yinUSg9f2qtntHz9w7dMuuIWHcmc9RWT1z+8vjzas9dS/uAV1ys91+VwG26YubpbgYZqQbfVM+fewuWs66lcfwWlYVMT0HAaSqNrIrktZoEPpsvMj6codSwWSvPySVmpliA3mjCrnJV4yDUL1/7Qc64Sq80UM+8Ypczt+cPMWCfc6909OOO+PnOVNZMmr1bm9b5P/WrdzQs7UrqshbIqIYYx0XhBNFsgqioqSk4zc7qiTpeHcBGy9vevzF/9TndkOIfTacp79WtO/Vp9DXel4wrTkJ/s5KfQVaSwKx17mpdz8TnIWvctI3qP2TC0a1t+SmMME1wxuVfnKyf7uF5If5Z7BJ5NRzmKzSlJFi5gCWRkii4jgCuKnipqlc+dmq68fEdqEVGddSTOHSmYNTpRXJ75ppEDyouxPW/eldMeyIwf6DVJL3j+ktgDUypviVIazGl6j+8Ofk0QLVf6p3tNJkeGwRBwBLLCG4zYmH5LOp6ajoel4/QNMpYz8jOwJwPzGTjDf1NoQ4iEfAt9631khA/7/EgU3RsycabfWuHGbtCygPs4Zxdwv6I0qQH9Z9/6V0q1mMbJTdZHaFG7XDjjxmtVip9PVI5suqUdqw05Mbjx00TNek5urOo1ifmEzfUKIfSfYOPcMuGy8NWuxB4/r5WCjw6On2tZCvn34EWDtbkhO5s686XCSVbWIkURTTZOSndxXjBKRCJZ4ZDT53N5Axk2Z6Y5PQ3zppBgMDszvLzdYgjxaXxQtluCshy02Hm3xDlRxSuvJRI6alOVWuY4dERLinCR5mJqCZNZtxrNP0mTO0pl5WyLQvWijnKP5CgX4Ae+9I0a9VjNG/CpwdfQb/Uj9Rh+Nqbeja/Yq96Fe8TujeF/0l1f9Yu9eKz6NhyrpthK/M+9qonySrWey9wD1rejzeRyGXiLw4HcCJSXk3CkBiJlqyiJNTGTZJPA8HASJyEZXGZ95iuiU0W7sByhlwZYdIxPCc1lwZzmZMLn5DCfsOenzfB5Hq9Tl+K16hKyF3+9bts6/LJ6BXyp9XczedqDENcB2sKFeikRwJE3uDjwhz0UvyodvyrAj6ImY0RTMGuJ3Vqik4zkUxBJZJ0m5lnwOUZ3xAxFk+z4Z/AVv0BpJOo0CqKBShuny2UJBJAgikaE0jO8tpqY6HXJMlDKK3tlZOJQoBVpEmhcssBY1JEP/jhd0xsk3sESnUXZtERKmEh+cDW5blje8+lpoTRx9eiacDrZS57ki4umLeWIGH9CKCqeO1dQ295N+dXD1t/szXzKa5R8v1sUTV7JDvF+eoZfqI75ZKNcE3Mb/fAnmc3QemZOapGPPuF2Jwyt3mzY3Zzb0BEu4aXScIS1Hk39U73w01r12+dvuw2f/BlzL6j1v+Fx6j51+0Hu8WWvzIqr3MR1ePyHL6mvrntTX5PtfraWZG/WBzFYaevyeu3pCJk8brffbhdNXFbY5Uv3VcfS080epzlI0TRw1TFDevOQU5qgsEXS/Oaszs1ry+eV6YmKJByBv9IClr8MTygq7V7Sp8eqjfjL7y48fQ++/RP1jp+Jop5Rz2P/HTuuH3yNfY9j2y3Cey8e234yLX6QVODNn6ttV7JcTLPUUXwt8GEBKkadUDd0QLk2v21x1y4e0V1Q0JGzWLtFOnTwOw1iaRSLyOWiSfOsHOK7X2HoYoy2zW9bFSst6lY0OCY5PbZuoW4kwHXrZo/gfG9WcHAsy+PCdmMVm0lPiixbLE0WzgKeMDRoBUskp+XwpCNio9r0efCFEpGSMzWRjDMlM5eebi+Imc8RdWlpNpzhEp8rynk9jmaC5UesuBBzrh7kCiwJbp/LinFpvlQ+67kTn/5mWFk84KZZpmc64LWTB9dtfndu225p4V59J48Rxd4n1piOnZ+wc/g2db3y0JKZxGIdMEYdhQ9c9f3Dx0Qc8g4Z7cA5AXyn2m58vdqharA0xz59ztKp6kwSxNW7Bse4v00twgtts7DSr81jtNf0NqDzVKBzOvDIHKWNkJER9FrMMm/w+cTMAOeX/CRIsxsHnVlhfzDDEvDyYJ1s9dioOGJur4RDZroiQkwWOGxjKWf1gZiJJJ8VLVI/pSR5ZBMYo3QmM5txGcEJ6uRzERewVBBHnjvQdRG2PLH5Cc8wtT5/yc37Hnlw2TWvbvk17dg773CPbsZp6l/xHeqszfGAkr2hQ756JcnrPpTcq7bH71Ndcr86jT/O5HSI0t4kSQYzz9sIxjaDze4wiaA5THbTERPn4kwm3gK+sZOnmbudJKgPZ6+IJnInpBpbPQmbNmJRG/UNG3/88V3x355/nhif3xt/A+8ks+O1Qm+aorhhDODyJOCymdG5QslK93i8RroomlfKyPSBL22WBsfMHmOQc1TR7gY6kjPBgBWXrHmtL0ITZQiUajPRGRpUAKd13bfsyEM37lvftmb4il3HjkmYWzVj0uF34k/EvwGkHps7u/TI9vhq4aS6/IrVRs3v3gy4vcXoNEhpY5FlI5KsNpuIMQ8WyMjZHQaLhCxItJo4o1PE1THRyaeSqEvLZVNSiCRjhiWzrTRMJnPxqY2PX6UG9gGhup/j5PidjFbLH1ELgVjV5D6Kz4+Az2SWh61KKTCKomThTWYzZ7XSBNQS4CMYeQtdMchmwJKHswJbe3ASoYr/hBBOxQaw4yfvK1LvWHvsGP74fbUfnjmBrnSBf52ozhZONk4gFrVITWM06gc4rWG5HborISNPIGyUZZGnU5XZYg4Sxxs5Y3WMc2qYJNO8pqpOfcg1nYPhwWF+zeONC7mSuI97qfEdjpW8hU+7e2PDl1DefiivgO8K5V2hhCRsMhiIKHIYyjMGRY7nqmK8DUtIAn7xoJTi/BUtC4wmSoM67yfb41u5zvEZ5Ol9G7i8jRsa/xL/FO/U83H+yPcVRiMrCqCuSoZNMhO3GyxaWtDCGcFGmI0876yOEd6FqSWLahnTUIp46+uElYEEI4cdgdYrj2K7E4TaAYqQ8H2fm7JPVX/BDiw9Pn1dqPHXg0d2jR50+OAD/avxHDwAD8Y1YwfEx6u/qL/cxPVYyRaAwaiG5qXlB4KT1F6xyAZJNLvNBs7jdRJQQSdiTrvBZpboiiFM4SRqri9RRO1R1OX1VWCWyNrH3xwMty3xqd9+qC584WdLZ3vXzW0XTxvak7vf3rVX40m+a1xp82pZHT6zYVkBHROLkOCGNg+DL5IPJdusHEZOJwdmMhiMyAZDNvCk5PdnVsf8YDmdZiyxPIfRZP6tZI9acwp/7f2GiaatjXAUuU4uug9iLQGLlrmde+PM6EEZwTkfvP/s9Q579q2HJwWKI4NN5SMHpfWwFvqd2fkmvAlP27xWzRR6Nz674d37yGh1+tQ4Hk2Gj5hWbJa2iF16M/p5aKci0K8NQuEIV4RtmBWbyXmAKFGXr7Tc2Ynmekkt++QCRxtP3pK3Tzwxjq7e6IvMenF6eVpZUWnJeEHQEWhjxId7Hxq7Wx0OVLvPPyg2PKPmVrxSXfFd70fx6L93ilIcrriS8dYqaMP+fG/kR9lotJIXdAQ8AUHkDIRANGT1I2T1GPhIDucIOgbHxGCQ+G2mLGje4zGT3UM8ialxKVlSmnPcavnbnHryNo72LDV3u/i8IQzVBAOrd1Hw/dWZH742o+P1eatnjr1h0qzhrhyrvetv8bPZ07MzMopoKjQSyVmWP7dyyupFk2IrS7/quL6srI689FnpwG4DsgvzGU3fYgvg0ZwxHZWggOmKn3TFw+pYlYD3CkcEQvOyaWnpAGct/VbqfD427WEDaMCbEkZiL/O9A+B7HwOZl1Ch4sV0cRRikDE/OFaE4SNKNrbiCQXZKimNNlHlFP5WDcDzaqc1qgvAMNrngFw/wg8BPshE3ZSQWUi3eRGyyQIfypIDrkBVzGU32NNtxFYVI96U6Rqo5RKo2B7OQo5SJ00VyFb+okR2sl7uAFgk/pF4vfqJ+u3nr3qWrtxy1+49Dz3/7Miq2+/bQcriJyDkD3yL22bdEvxL/TsnZXLlix+on/zzxffVX+PPSB9p87+GoI3cEm69vvZumoDp5BmDTLC2DjYnCsjGhTjC0e7HokQ2aUeLGbc0JT9s3JL4WVJAN/LN+fvPxy/Ajs2FupqrQ8ea16rk6bxthOhEfx7CjopTXVq8hqaLD9JQoW738CX8vK1bnyXe+PcMzlHuX3i9DifEVi6XaIoijmNgolH9jQlLsCTjfMAr6sHr1a0j8fXqmt3CZHXrCHz9qq1bAZb6M1+NnTqsDMUMgGi9iYZR9CQdTMLyZGoz92gecOykWfvU+3bz1TdNACA4CUOg63ZiuvIyEuhSy/rT2rPAdOrP+KFl8U/4jy6oWykfN4ExfUdagGSUrVjZWrKc0URXkzUkV5Nt8eqb2a4o5t5Rv9yqfonHOPAk0RiPE86Hh6sHNF+iBUxZkniI3UwGnodA/lKYILFYm4oCMO9xqA/gzK04UxinHsDDfYSLxzXe+Df3IPlAOsVoVKA46WqOdFFpjAVO4PeMETgtN07zQvHJtUbZApJ3Te/8l0/O8u+RhoY/79x5KTy6VikdCwDqSJLEPWPYouiXgwf60hMpIx/8pfP00rMAowG30+DhB8gHehu2VRyXwKvH7fRXqF3+A0AAogGkdFT38tNxZ4Apo1zFTuia8KIkGaFxaDpd2rTJZSX1bAf60BpHGHf+ZdnhZWSnMOivf/0rnkRhAcDOcCTTPjKDAPjxmM5J5cGhQEWnWoOC8E0flYM7x6cBrF/wJACltW+6OpJsb5oPcXpbxUkAH0Rf/XPIINH1N6CNo2mnSlpndgqCFY7kS+k/PPrlge13qCNxhvrVc8/RtiUCepPQnJa6LLGVOkHuBZ4jEE5EX2mxemzqkqDcdadPx8efPg30N6IL3EvcjMTYEh7RORQGGRGBriN5siRVRySSwhhJfbyS1JM/bdumZm5j+d+JkcTIy0yO3CcEnpdEwlO1kHypCpazLEpeLhscfZL/IT6L3HFOmytr5KpSnxOl//Scei2+iz3HoWHQELnwnAd8rgw0UilymUHNE28gkJZBMjJDPuS1e494v/DyDs5rBAVtpPm4wB4EXYItDTPDGE3MP9OGVbRI95pY405bK0FPvMSWfYt6XJSWtN33Htu5c/XN/UvbR3r3eF89duwYd6KxH3dizeJtq80bDH3GTliDpz/66MUvqG0Ee5KKs6JkJTAmgbSgD6XiCCh6dRSTGLZwFv8YtcugdQlSjf2EkxdLWc5SYsR55GX+bWceXcraIfG/IqQeR8ZjuMaKrTQpKGj4DOFB7oj4FYQxtqMiMnL1eChdjqEkmXA8qr3J4I4c27Hj6H2jBw4YI35V++iR2waMG39NUxM24e4clGHP538Gto3Y8wVDE6ZrtwsG5ijSXGqjmz7n58I9ouBw03M7kOIpwEvkm9jv5XDeh56DnNDzJXA+hJ1z7PxROA+xcyM7r216n88XV8G5iZ2voX1j7HczOwffmPuYnfvYeX7y9wCT1RWEwPk0kIp2ikXk6HgeLBtEgsF3Hv5EDPP1uD9dr6RFF2JyJnqYv6Yxitc/jTcS8hR+VB3Gygg0/cYfEc4Brf2M1v/GF6Esp2LCad407EvLcjhzceE4Rxnca4B7D6TeG/873Os+xm6tb/r8WFqWP6DdnYT9QuJ+oPSvqL7pcfocoYFqkRIied48nJ/XjpbxegZWMqBdl2TgbRl4dcb9GYR2jJehcePKdJCoNQ6pMBkuRccYSMBF8ea1o8ikgMMZUAACSHhcS5j2pgBr1zzarg6R//kn8Kgex2n1TeOPpaVZXLmFcCe9T93f4r5f4D7XMZzBZ2B6a0YGvXWcfq/OK9q9wMNNm1VQzooL94jgNpFRESJF+kYWRjhPBB6+XzFGIvA0jtgjGoqF4yiSGn4DAdYyJg9IhzW96TDKqcNuF852weN/VywuFzLnYtd2Fz7jAgg6CK0d6KTuT9nzWH/eha5BfZVS3CdUFyIPhLA7hIeGcHYIo1BxqAbcslAokJaLQ0WhQSHydggHwO8O4W2h/SGCKGJJDJM4JmQhj8oCK6NN01TUrg57TXi4CXD8t+IymQiXi007TLjChItM2GbCqBlYWQsZyqMyxOA0UThHSYBW9ILidbk4MZe4drjwAy5c4cJFLmxz4RSsGBy8HOpcALKbJ/BTNDhTgWYjlTbYOMyI3zPiVcbHjS+CpjdiZMwyFhtvN/J9jZjrZcQu4z4jIfVNhxSXERg1F0tbJLxCwtUSHiQ1Y1w9bhz836AxKSsT2px7lv8UyhRCrEz1d8D9SiWAPX09eIcHD/fg+R7s8uDVHojksjxQyDbF7vHIci72V/hxkR/b/KyEZvrq/LQO/P7R/OdAF4nx3q9Qm9I6LIWxNwyE+V0JhMOiFRjodAQ/FcGbInhpBFdH8KCITpsElQHPWtKH685oY7hJo81i0FXzlP5YKpJWQG25UxI+K4FPIRrxAiP+0IhLjRjIFjHiNcajRpJtxC8aMSMdJRynE26fERMfHLrgG8h3jFEP6ET/ErS6ge5vYGKdlL8adQXTe3mCrLf5dUC3QiUTe2y4zoa323C2DdtsNiLm0q8iW4XtjI2/RE4S+jaP6ltKozcOowFKN+z29PLM96z18C978DmN8sWeKk+NZ6/niOeMx5AHLWDJxZ7THvyUB2/y4KUeXO3BgzwtSZcsJ6HH86gep+WA9w3xB3b0dWCPA2c7MHJAm1w85vDxUq72aKKuVqbTaTtatGc7HkY9FScO9g2eCJJAEK8K4qxgTRAI+CclEAyL0n9vU51HcC7w3wpWf1uKnhighLHkKnf1dXEPuupcZJhrresV1wcuHlSHzwWt5aKt9Yzicrl44EMXCFobJlwfuFKZvVqXdqbXf+QnsnLsWh3IYYicw3S9K28Ek0jElZ5L/isjavSYp67Q9YZTgzXnMPiNbhw4HcBPBfCmAF4awIMC2Blofpw+dyPQcQR7zqU9N/8wiig+nHU6Cz+VhTdl4aVZuDoLD8rCzqzEo/qzV8OzvdizHp1OYfUDmmcHjwrivkHsDmIUhAbcrHiCQaqyghVBXBTENcE5QWILpiqtZD1WQD2uYTC9Gj6/fgQcbCLufm7sd2PJDfA+USzuNGTLJRnbM/AcsEU3JKBoeCXsfx61/0k5AMpeVg522HCFDRfRC60x0m3vAQbLr/tQTzU9jtIVxx9bxBY+Rx71OdhzRYBDTyUN+yP4ociJCOkTWRAhH0bw2gjOjuAaar7+pbgjEZlqH1ukKFIRuT2yF5pfRKlqrEz37cDbelnsA/DBp7aL/N9Rio0THtdtnMj/dhdC1icRblp5TDNthWXNMs7u02T8t5P6feuPeTwGS/I+xh/sPo0/fntJvy8EJh1cXnYf+FR0zbRj4irkQFcpXoddNiIBgilBtBntostpE0Xe8TweiGQ8AG7mYU/w1bS/lPbbOKKt1rR0Rdhqh51c5VHJSiQcqbvnqRH45R3p3ud9xu6TpuJp3/FFZIh6dXzrJkw+//i6R3dMUSMUj8bv+OcRL5ZATJemmGVeEEwy2hKThW0QG2q5KBj8bF6KdMoJR3kIPE6MX7cIL8cWv3Biwernjms5HeL885yfwUlXLBC80N5/w5YYSgHEOkOiWbwvkpdTiDk/NuMVi9aNV0/8AAgcf271AopPI/8KQsIZ8K8BH8lgQFYTtyVmMgCYU4WJbgiHNmhQirDe2Jojfcbc0MN5R9YnTy08yzf4CnwdSrYs09fbRPwrnADwrBDRWUTJapNMCoO4jYbSej55mmxAX8EiamV57Cc83nvtave2wPVPLB54aJRwl79tac8pN5Rle2j/2sdqjPzStAfitDzFCDE1DdRZ+kBz3RhE7ITQhJsthnSWuSBKwh8PevWgGgvjnFz1CwpH4I9wXwnHkAm1UdwckY3EaLbIEHNuGoPEzTG0la58lDrwGSBlcVEdUULmq7vl/cLYGdPHCftl/gjmB1RWDlAbWR/gx/x68guLJcPNOArgsJufGCNs1dM4X4oevz6BHoPxNPlFRBoMAABg9Ho+MYZsawXDw0XKXOQXgCGisPpJLs7S8kirI7leEJfbaR1tohkCfofTZq2K2WycXBXjgqhFPiTa1SVoA5y09QxZfqleX5wetL/9jiUrb1Wnk/7pT7+X5tiUvXYh9+pmhmcuGUBeZ2sL9VUCFrOZiOBCEGKzS+LXMSRhmZMkzliPHXVmjDBcqsfOZO6saFGL8beJ8D7qsOJIGaWzI+rB/da7Z7QvmRa8aT4ZcB3B+Z0XVpTF510H9btIBnC8MBiloUFKeiDgckkSSjdbLMjvRzYztnJms90ufx2z12NXHfYjf8vikyPncBFdfbookfCqiL7U7IHpgLPSSPMya24JuD7suRi8bvSQPrOv6Gb4P609CXiU1bX3/uv8s/+zz2QmM5PJBoFMMpMhhCTkZ0kIBJAQFoddWYQgEJAgIJiwBkFBBQEVBQpoXUAsiCmtBcVK7QuVfrYqWn19KVTs02Lra7++An/evff/ZzJZsJUnMSaE3HvOPdu995xzz1lv2LZk5aoDjTUiXEONuWvwsuHls2KrBpez85Y33LNhZXxEzkJFD/5ElVJfITxzwcPSMFMWNDNpXm+GXbRzwMAb+nJZZlE0X47vEOEd4kxxiUibRL8YRt80iTtEThBF2o92ICOdlub3ozX48YN4La29HB+HW9Cia7At2YQ2uSZcMX7G9KXLiA8MusKWkkTdlkg4CtAvJC7NatuIWFEeInwiDTC5Zo63p0Pqq633L9xi2iIMKRgw9Ik+WcOlAX36D+VaDJsXLHpgWOX4Gtozd3XDHENZedmQlYtKhsYiFSX6OcsWTxs60UNZ5hAf9s+pGjqG5EQLTKBGyhQEDYRGjqJEAwMYA3M5rmGVkvj7DWcMrMEAddxpKCIBI5Eq7C9XvCS4q2SyEk4Yy34ohj2aSFJojg6K1E+a5IfggkdW/yPjKhSoLw8enA3/LuvnwktR+QwcQmSWoaqo6wgXD5guZTrsZrNFFNH93IpTt72i40pcFF0uw+W4y2WhLfYrcQsWXxoJEscliN2lRw/oVlM36RohuSlq5xlMVVywNsjjyAZ1fcOKT0KbdCWRxuW5Efu6IHxRfstaNL7hAXrY6g1nTAPCu7akp8NTSz8sfZDI0A0k6zSJXeZLItoqBA0y93oDELTClbgWk4qBFpB0+iv6TNTJSNlDRRZcFZmm10zP27R0j7ya4pnfv9z6xrLD0PfOUuzHgiIl0RySUR2wg35gkRTpmx4EOVwwmOMQvXqH19E/v296umAUjJfjM4UlAmUS/EJYoNGHkOnOpC/HM5FYnnRbL8fdhEYpFJqptC8BJWLPOtSkF0dKnr21iHyLrayapVYcS0aDiDAuzI8OzI3mhwvtKwaVoP82P7hm9bpVcx+oX7xq3tASprmssDQycFCR/Hnz4KEbS6V7l9+3aGc2XdgUv7d+WnM+bZ1C9kxWPtNxoQP3lTCdpAFD3p4plW+wd/L6L+QzZ89iH24FW93xNfcwsGC/K46oA62W46z43ZsJhNsi5neSvTjIHouXwucgdInuhJAdeT3at7rKP6X+q9qpDZUFbLs/wzU7/YnSiTrbFDqd8HYH2innkp5A/SQH3jZZVm0IZAKM2hAoabNSuowgYVI6AVFfwDU3+sLn5DfhN9u3b6fTsW2m5Q/YH8E8Pk+tFVIkOTQCA2iaZxi9oAMSiwzyo1MZZBKrQEVELZneFkk09rMoKaA40zVqz0JQthy6+dIh+BTu0sX+qBX9+WcTUOH8kMDB78gMoERyIx2jGUbLCYJBqzXqeI5HcBh0tSSgom1qQlISUOIpV9TOhmJOFeTgdvn6+msYJp+nf0n7AYaowHsPwYsieBqgR3vbCCnA0BoNh4AKer2B5zizwSAatYIWAUU/hwZBBRspScn178wrUx3cCDofyolFnYk173364rlfP72nRUFBe/Ql/V3yZwoWvaxZazBwFD5XMALHqWumKPYWa+48PtpDWTES48Ag56+Xr7d/dQiaDnEPal/Sy2vVRVPyn9mfQqvKy/7oxIJOBgzLaHhmR5zH/Y4enarwUel2opzWEkXaonas/ZMPnSes+2lr69dNZM632HOwgsyZhk77AQD1TpfLq9PrvS6zWbM9bjbbaMa2PU6jUymtZ1rhCLyQvBS71/nYhOgxtjEZSg39EA6FOx3qsQ5aMehd0QkTM/v310zV5Y2uKK6ryyjI46bp+9ZwLzfJe7OzQrnjq3OzsrOzakeRGK1czPwMvsuuQ7KbJumATo+4CbQcPv1EoxciJOBBkj5DuNsX+YTvTskN/zZMPqew687NRX/OEX2/whynzrFfEx2zo7MtTVFaXnnUiEipHvgS7wISXFLOfDinKUrBCfI+3WH9mTP6wzp03pPOn5fPEr58RPiC5aAPjqZAEnXg0RlIo2Gb+QOgwtMWFUvCyvk5IemE65hezZjjcCAmj8Lyo00qvzvnzZFEGscUNRpByzAcB5uFbtPi3MOE/uCK99lYd3bijnpEd3K68tsJfKBUcqNDiMvt1lhttnREkHQbg45LXrdZAwijIxFkCnDH9xQeJ7Dvlcc01p9Y0y14vLf98/Xsua5MhvP1G7RIlxS86pT4EdZnFmkSB80IwYDJbA549TYbOr0hVeZ3IHNp1iiS+LvpESIFlm5YJqsg4/6DoRjsXSLzDsl/OQRfuAW6fB3WPLmhm1RSHXH2CLyTO03qZBZJHgGHingdwIdeuCOODr68nw/zyMa2wkp0bZqO1R6m5rCiozpSd8yqQEtLwaX35FNczkPy32wQ+v6BePQamr+G+zuaH1sVD0DiJECB1+t5I5BoSTBU07SOb9ayZH4cqIuE8zwXVH1PcggBsRJjFi2O2oe3tOS0/Wn+VeqTBdyih+RXrtm3bbP32B+ikl0jAIbn9UgjcEl0KPHgrFY1np7fRTyqzqVqfILGuDoioShVjkWZzyPka2nqsr+JoErKZAGjMTDo1GCx0jq9blwcoLWZzaZxcbMJ2TPNuDifutuRDJzuGcm4sIyo7H4kyxbvgB98oOyBX3yBd0FqwSb5xe3b4aRNcNh27BtY1/El8yhfZMmm78Zd34Rx3wCR5w9AAc4H7lNUjpjN0FRrx2cnc/uwJuwpiMVAnurn6X3sQRi87bFHwY3bHnsMGr7z2BzqPDUckBUDGY3OlkwMXYKbqZRQ2clp+hSmTCOir98yz0HQkZinCM9TdJvzHAV//F7mOfYd53kCzTOdzFOv0PYdhTq/I7SFophNU7C149RJi9XIdaNt72MPgpu3PfYo+Pi2xx4DX3znsZhu2ao8XFLoRlMhTLcQNKvTPHfSmpYyTa9065znILj8vcxzFLR9L/McA+3faZ5DaJ7hZJ4VCm2/UKij6Cl0qIO/Oel08aAbbXsfexB6b3vsUfDP2x57DNq/81hMt/GKPEBNgm65mG650J6cxhVImaZXunXOcxBmfS/zHE3Ymf/nPMcg853mIXsWn27JBqPxeLAC3A/rgVXSUVYqm5ptsjAU8Sfnqb7OZ+XJTIyNgyAolwIui8WKtji/n7bSGSFXWpphZjyNsdNWC8AZ6+rbjB4ZeokWVcWK9w1fJY2ktxc6g9qj5Aosmilqw8zDpU1T6pvrZ68c+/ikM0wrzzRef/3oB/LkUaPuW/zB/1Lb3n3p3uOzb7zJaGD5U2OuX++4OU1+S1ZqyuL3JH3ZSvJK3mcziqLFqbej/Z61MJ40l9FK2y0WWjMzTnuT1cS7ohhVnYTERzgYluNnpMku30zftavHDynK7V9ov3nB/OJnlNny8ubdjxj36rxD6mYw9cfH3tjFVl7/+NH1tE2lG+IXplsGOhuEvA6HE93fnAZ0RA1lev1+cWbczzidtJvGedk8T1sTzhd06Kvo1pQ6keSY0gy1HCpE9MFUIjKxv7Wf+qTfCde6Jet3dSUiNV7+UD63bW/65InffPYPQsejcIVKRnyGbgP1MIJsjQ44QOB1C3aqOk3CT2ApQCcqWA7U8uvRSLKcgOq9SCkmACPP7tn99BMH9j3x+Oi6SWPGjv8B/NMb594889bP3jyzrXnd1o0til//TrAWPE/PBhwISALgOIqnKMicRrAALMNuscTxv7CAPHeLiv7zF5vWUvGVD6+66VFy0D4Fa2EmwtcL7pB8BqMRpvE2m8+DTpu8CAyS0VKNLsui9kpcbIWlp6AHeK5gJ2lZVydpHr5LJo+xyr0yK+Ej7eYwJF5S+dPM1XOmVVaVD6rTbNbtW7XhsQm1qyfa4Z61w6rWVEl1/QYMHBDz3bmwYU7ligG1lZmLMa4XEW0LEK4hsEqKutw2vz9ocjMASUSmHoDMoNlkNl2Om8x+c9hMa2mzmfa6JJOlGl1avY4rcS9awUlauBLnWzvOvoZWRnyj5URiOn2jeclemtgh1aNYQsIp6lB9osXkK/bpJLzAdgcseOrxDYeMOy3bq8efrjBGJ495eJP+YbTKjTuPnYc196xeNMPTIJXWLwwXzr3bNHVxw4yWIEXqXaM7GOLHEMRT/LS1THKZWFY0c+iuCLEHz8RciWtMJgr7PkvJg3fF9xnt4TogV8ik49MEOT56cbk8Dz6ybumXmScMrhvQu3//BPiN3HcpfCX2n3YcO5HfQ/QtpKei29/dUsBps+Fu8FaHFXAsm44InG4xmZCtom0255W4rRUOIsTkVGIS32cqMZWjeVTscfXqJGQg6VzO7nR/EjrCwiPb5I7CnbY7Bo+ePHJcRW2g0QdvysvE0ISK9bvh6rU733WVxupGDBufmw73NL7qDbUo9PsQLIB9kIzgGgA1UkD0+fQ6HQe4kBOAkEc8YDtuo2w22ijs10O9nihmIKmY4emi6kpO5vRjh3g3VVU7gxM8U0uAwD77Nux+5vldbxe3eGeMneqcVb3isceqaodVj6yqHAuX3L/jpyfO/8eT7tEPrM0obH6gZtio4ZVjxyo6uAaG6GmI5wWSBd3kNUCj4wEyIRpBcyUunIaDAEN4nepSUb23XNJ7C0P71+5qPiJXUlXUjZfkj47uhqHWJdgX9aGqN25Ek/5gkhRKN3isVodgYEAfjssPAZDvEILZwezL8WAQqY2XhESQruRdjitM7d5y/paKgR/Fda2KkA5ppB6EQk6VWJhWBc/s2PHsrHE1d+x5sOmp2tG1dx3e+lBl5UOW2pqR454ZOwoOXbCk4Z7qeXrKNGPwpHvr4+UzjJTubmhbsGBASfugUql4nUT4/RHid1+0NhfIBHVSrtXv5wx6ZHS5LDcAWY47vDO9S7yveM94Wa+XNgvNhkcNlMGA+F6OiEEj7nfheypxE420OwueJKSVvOpPrYogf7Rvw679ew/N3eJtMY3NS/B+dI3Ce2rO/Tt+cvIXv6wb4+6TsxJzf+14aXRV5ahRiszWoTv9Ud4DWBL7yDIZcbMSntfp9Wbi14FmrcnoN1JGDcNAfMWHeo1yvX87ryRsvtDpkOrFYxlz2onvK2aN/uZS+6zlCz6hPpv/+zbeoz+ufcX2wgs2aMQ4TEQ4vKziMEIKYRwwAggNM/FZoXMFg0EzKioJDBBwjAR2jUe6w6ft2MUAk/AXzGq/RD2oIsDN1x7Xy/sTGGAc1iAcNiIczCRil+VxI0tjtVgcTmca2plYFghCmt1tbTYZjRSPkeEd1gQdIsgKehKdr5OtdTtxgUWdfnecRh3hk2hBd2k01zZo2N5hA8prxAR6J0JmyTar30Dn2N+k4vgWwrEC4ehEZqNWyvZ5XS5PwO+32mxBt8fDazRBl9esQdupF9gYPUZS7wkoSLblRSLKk4ZkMnYPjvXqizLBENq8ER9v5Tx7Y8/Tvz538Wnuzq7uqIZh+kd2aBW8zyO8Swh/raBYcioeeMEsijatINgYURDgWQOnOo3aEDHf7sWvp8gTUoREnBtpQvun6+PrjlgWivUTJswXFzoOIcl6XPtfm5YPLx44bOW6XmCzDINEKgmbQrDZfw2byJK1C+xp6z9tD3SBzW3WPq6XtyWBd8I2oF2tQvIanU6vFT+B0KUzNJ3uTUvjdTTNm+1neUAQiHgUtyaRoC5GDslzF+h0ikTlwVgEdsFktipTo0aGatgjCYSgkUhVQVFxqizpkO2qlBBCGoEWbIFgMAuJU5bPphdoPfoIiq6zXCd2kcSzmF58moQ+xB9thMWkc6UiSqTPJHFrzttknOh7qMU30b7OHRo+pDytVpyKJEjKrJJKPVicdH1Hs0fqp9fVzZn9Cdr8y4aUBNAXv08q9RNbxbwKj3LZxE6US94etsoMJYbRGpv1mp2K+7EkTLyPPa3Dt1knLjvVOnWHWyH5eE6nE5BRQAKk2idGopBV4pqNWhWweEvIil1y4ocZBPZCZJd+2/b7+Z9RnyxglyOzVCf/FcPGcO9FcJ/gGoEI0hCPAmkeu91ls1pxICRhk7wUjyySw9PssiXXHG37tyyREgGkO02RcXR5zFMVPzt05NS+MYdKDfZ/+lnHuRoKKoXsGZRFwS1Bl1aE30juGhDQzXKklAEBy2qQZPvS0zOQMRItlgwOeCxadLbQphsdGmYnCXT9KztEJ2nTu3d8tkot2HoLi8S+r6I5v0fchpJPIJzHcF+Tji7FkttoMol6PRJ+wYIwtwi0iD5MHI64RNpUYe9hD+gUSaeRdbSzcOMpS6P3jdO+RvuJv1x6T/4l8+qL2558cvvzcKSt3XepJ1zENL0opsDFyvav4KZqGJ2FpMgOW35kb/SdfsPbaDm1Tf7le5eYV3/4yJNPPvwCHHnJ125LwOXzEFxsg3xonxBFvd2OIRMrlObxCDRttJ5VYCMdL+l+cE7eqrqsu4ckpdJg/PSUsHKSFh8Xu2anbyudqMtdTKcnaXIN4RbCuPkDAYRVJrI/CLFMb8IEBcwulS7dzU+X0EUqbr1HVVLwE24hOklU1/QQHQBBPfscZeH24d6wkg4JO01RHE83K+bRcyE160nhzgHMEvY5wgo0vhrZ3K+5p5XxidwrMr6q23grkapqLEnsESJBJGeNPULt5n6I9C1PEgUNTZOgLsdpGaGZo5JBly6xaxIHIdpUHKV2I6W+Ol8+zP7YtnWr7VqPOQF+nIdUF9FfyzPNHLzlnMn4DfzBYZlEb9gj1/CkOJ+mP/sragq3mcRuciSzEtbXCCwFKCWmP0KN6Xd7e4WjzPD1QzffP8L+Sgkuw46r7PPUa9x+dMbOkox2hwNJiNvBGpotgror4dBPalBU6ZncdeuB8L/7Thg3JpSVrVuiC4+v6Ddh3KhgVq62wTybfT6rf1a4etbdA8jXrYsR/gH2CNLFfaTvU6FkQyB1HAcUhuEmhc3JHfFCpGchGIV3UfL/wM8RB2/+XGHjH3wf40+l16UbwTjBPYvOBiHJwKBDAa0zmrRMc+pRoGtz+M7dn5q76TVLo7ho6tSFYqP9JHtk65JYWXnRshY07wTmfXoVO570XdZCwLCQ2hGHB9WkvEQgfBUOhDHvNyn+1nDH+8yz3DpzNqu7H79h+Vp2KTnDnA1MloyUbwQpK5XhgwC/LPm71M8XwonkTqsTmp2Ss8FJA2fAWYC+Heechf7a7HzUecB53HnWedFpaO1456TTqdFk5U3H+cWd+eFd4Yq8AhcMlHJub+Zec/evdUyktSAo2SFjhgEzfMZsxtnK5plmWGBOfZjSy9jPOxaSsTYKJzwHEqnOFDQVmEiasjJUyW+Wm3DeriVb80dCu6vXAYhIafidISxrLYM5ZdBRNq9sRRnNlsGiso1lSF/HnCwrA2JWnpoKjv+A3ub66ipAFsOOZsp0Z8ItmZDNrMykLmZmqoPxUGXc4S7jvkQabpIENOxD5XdF5fe6v/v63t4GAQ68jXDnO/6MNMeJrHqY9PvJkqxlJWkgCKXggSAVtAtCeY6JBrg4M5LutulLI5FIYYEz5babWvaTv0UJUHvq7yA1eTs/IyO/IBAo+Dw/QL7JXx5GfwsHA2GqID8jUFCAfpwfCIbR9/nnl9yt/HI4iH6IB74SQP8YKMj/a0b//ugX8l9R/y0fLpZJvSMG/EFupq+itdGkMpMfpEnIsviBG0ruA27Knc7j16BoNSVhtJqgPfht2P4BjpB/TM3tiVesfnDvGHTC59FdBndVIvADAD9UO+CjfEFdCnwYI9Fv+7fhAGsXwxH1cEtPJOQvG+vrG0/0iggFlnd8yZRyMYQFYjosyqdyjLTdho3tYEqADqdS7w4nTOfjUoBUMYxlqg8w6QcLK0d7Rm6eVxYauWRMbUOlX14GwxNt0ZzcQumBk/ctO7l26MimF2bJ7dD9+T3TaycdhB9OfOy+SWme2mWPTx29YVbxgJkb6HfkN6Y6SoYP23/X4lMbqoc3vX5fw/GWu4Jw0P3rPRt9APwfXHnEdnjanVVNbxw1GH43mzbZtE0vCImqVAYJKZWykw81EuqtTdMPadNUTT8uXLwznh0ns+OR7d1VcuVXICR+AEJI3Dhx4c6ZXwAXuCEuXHj8jjfZpCEIMprsM/b75dePHxPRnVZFLWr+3tC3EbfoZuuTiOdoobUTcZtutT6PeB42P0R8hZZbv0V8lZbnPoh4gY7bdyJepPfaP0bcoeX2nxEvtdzV3yO+RrcXv4z4OiWd9yO+QVud7yJepltLH6KS1nwHX99wVQG3sJYrEc+hnq2I23SvtRvxPGy+ivgK3W79FPFV4L8iXqA/5lYiXqSV9hcRd+h2++eIl+Z+mZ/mukafLsqIr9Nni99HfIMOOjsRL9O9zq/0iDQN8Hq8x6QoI4FX4lsCpWSopiOybFVgVNAKRu/id5PWaQOvoCewMpgv4S9oG9jCK/yXHNdQRQkt8czl0TaBXsYqnrL3KtAz+KeIQI/0QHt9rDKRSS9FauojqweFFyvpXbG5vrEunhgzKJXYNrY2VnptqmRp+7zZpniJEE+lXxXPqhRxeyioj7SzBQva5V+Dad1XTTCxayoMhBIHNMKCJXzopRqMSgnwgBwKVfDKOJqgLt5/if7AparKlBVd8U6i/1rYG7Z1J5ab6No6noS2MKmsC6abyfp6snVx8AtCX1aJRi7BTPE8E5Y95KYcYsxQful+CtgpZp/DjOKvjKOG2K9hsc9WL9gztNVztoqtXl2QcQ8Zc/inzMSpZcqxA6ObyAa4iBt0gG20XEHGftO1ucC3mf5qJ6TwVmZqKO2hMPlZDgmrBtp5ZTGoK/E62U/EC+lV5YWsMvHqxHEvz3WqeDBV1ksYG19g9w9GVrtMpyGbSy7i0sUH65Q/M6QndC50bMx92GXz8O0al32vxkrsSu+VC8YPYeBi85uNDblGTKQK42HTJmhZaFDBWPLGZxwyHOYqevdxvMWlyUX0lZFAFfNtHFc0jtkCFXL+7zhvhRwCWPLWCK42bFt+rgrBWyuZKA05h5j1bJtivMRzFIVtiF42WftRuiYshMXJ+oNX0/vn+J189DHT8WxvGprn8eCFrCGu5TWddrTLuxnWo7jKgCQLbR8eJedt6iqYzJKpqCI1PVfvZijdEFjwCkL0Ha42yKuKnX0LWe5dGLHp3uxRCjtTcr1uJnbF1WY8Zk46HazKmKlZccnyf3iySzkztOlmxtG6/9DvnHvjY1bDFWV4mn1vGGbgO+JdbI5/w3//Tuck99dEv5q12cdahs1xfigdjicO87YZOV2pVTEpdFqIiXQiU04PKkz3j8TZ4yEwKyEAVWXGOFxjuFmVW+UKXQ2Ek5UTTlmdxxDCF9IHuRgqb3Uqy/IIF9WwhmsfN9NE+yLktxon9rmafJ1Mq4Gm5FBooYe1NWMutOtSq1SFfDKTfV1qj1iFtDKF0kBudOpYSSAgopZVd2dkTa1Q7NsnvVNDlNeokDPlWDm2rpTKXFCxDEst4YTEpTGHYUm5sSgz80V3pu7cVB6uRsgsw9rRMJOOhkHfoDl+WpxMrcFcXUqPKMOgYwWf/pru0xqeCT8Ja8CsuqVR25LIlDU4el/fX1ubTCaJjBKXQuESFLX2/8MGstRM61npskyQEHMI4lya2h/VKpLFuqTww7K5HJu0UxUdzej29Dzt4+Lr8SVVRxV4HPkvzkUICnj+Kt9AgRvhSkI9gcYj1vywl/vPemKvBk0eY49ENFgV0+t+I9k4365GizS+PS/c8UlKuFkDzO+hst5JG0BCXXuXOF0mxg7W9h736G8BvYf9AAAAeNptnAV421bbhg+fozSldczM62rp2I7HtqPTdevarbCuo85N3MRrEqex3a4dMzMzMzMz8/aNmZmZt9+2nkDzZ9fVvEeyrPtIdnQ/r+WMMFL/75/nyTQyxH/e7tUflDDCiSCSKKKJIR5pIMNIIxlORpCRZBQZTZYgY8iSZCmyNFmGLEuWI8uTFciKZCWyMlmFrEpWI6uTNciaZC2yNlmHrEvWI+uTDciGZCMylmxMxpEY8UlALImTBEmSJpIim5BNyWZkc7IF2ZJsRdIkQ7KkmYTEkfFkazKBbEO2JRPJdmQSmUy2JzuQKWRqdf7TyY5kBtmJzCQ7k13IrmQ3sjuZRfYgOcrIxeQQcii5l5xGPieHkePI0eRcciW5hHJyFBXkYHIy+ZH8RI6lkhxBFXmX/EDOI1eRX8jP5FdyEbmWPEkeJ9eR2aSFnEBaydMkT54gT5HnyTPkWfIc+YLMIS+RF8iL5HrSRr4nJ5JXycvkFdJOviLfkCPJnqRA5pJO0kG6yAWkSOaRbtJDSqRCymQ+WUC+JHuRRWQh2ZvsS/Yhd5ALyf5kP3IAOZB8Tb4ld1FNDfVoAx1GG8k/5F86nI6gI+ko8h8ldDRdgo6hlC5Jl6JL02XosnQ5ujxdga5IV6Ir01XI7+QPuipdja5O16Br0rXo2nQdui5dj65PN6Ab0o3oWLox+ZO8RsfRGPVpQC2N0wRN0iaaopvQTelmdHO6BfmQfES3pFvRNM3QLG2mIXV0PN2aTqDb0G3pRLoduYHcSCfRyXR7ugOdQqfSaXQ63ZHOIH+Rv8nH5BO6E51Jd6a70F3pbnR3OovuQXN0Nm2hrTRP59A22k4LdE86l3bQTnI37aJF2k3nkU/JZ7SHlmiZVuh8uoDuRRfSRXRvug/dl+5H96cH0APpQfRgegi5jB5KD6OH0yPokfQoejQ9hh5Lj6PH0xPoifQkejI9hZ5KT6On0zPomfQsejY9h55Lz6Pn0wvohfQiejG9hF5KL6OX0yvolfQqejW9hl5Lr6PX0xvojfQmejO9hd5Kb6O30zvonfQueje9h95L76P30wfog/Qh+jB9hD5KH6OP0yfok/Qp+jR9hj5Ln6PP0xfoi/R/9CX6Mn2Fvkpfo6/TN+ib9C36Nn2Hvkvfo+/TD+iH9CP6Mf2Efko/o5/TL+iX9Cv6Nf2Gfku/o9/TH+iP9Cf6M/2F/kp/o7/TP+if9C/6N/2H/kv/Y4RRxhhngkmmmGaGeayBDWONbDgbwUayUWw0W4KNYUuypdjSbBm2LFuOLc9WYCuyldjKbBW2KluNrc7WYGuytdjabB22LluPrc82YBuyjdhYtjEbx2LMZwGzLM4SLMmaWIptwjZlm7HN2RZsS7YVS7MMy7JmFjLHxrOt2QS2DduWTWTbsUlsMtue7cCmsKlsGpvOdmQz2E5sJtuZ7cJ2Zbux3dkstgfLsdmshbWyPJvD2lg7K7A92VzWwTpZFyuybjaP9bASK7MKm88WsL3YQraI7c32Yfuy/dj+7AB2IDuIHcwOYYeyw9jh7Ah2JDuKHc2OYcey49jx7AR2IjuJncxOYaey09jp7Ax2JjuLnc3OYeey89j57AJ2IbuIXcwuYZeyy9jl7Ap2JbuKXc2uYdey69j17AZ2I7uJ3cxuYbey28jr5AN2O3mT3cHuZHexu9k97F52H7ufPcAeZA+xh9kj7FHyFnmbvEPeJ2+Q99hj7HH2BHuSPcWeZs+wZ9lz7Hn2AnuR/Y+9xF5mr7BX2WvsdfYGe5O9xd5m77B32XvsffYB+5B9xD5mn7BP2Wfsc/YF+5J9xb5m37Bv2Xfse/YD+5H9xH5mv7Bf2W/sd/YH+5P9xf5m/7B/2X+ccMoZ51xwyRXX3HCPN/BhvJEP5yP4SD6Kj+ZL8DF8Sb4UX5ovw5fly/Hl+Qp8Rb4SX5mvwlflq/HV+Rp8Tb4WX5uvw9fl6/H1+QZ8Q74RH8s35uN4jPs84JbHeYIneRNP8U34pnwzvjnfgm/Jt+JpnuFZ3sxD7vh4vjWfwLfh2/KJfDs+iU/m2/Md+BQ+lU/j0/mOfAbfic/kO/Nd+K58N747n8X34Dk+m7fwVp7nc3gbb+cFviefyzvIFbyTd/Ei7+bzeA8v8TKv8Pl8Ad+LL+SL+N58H74v34/vT87nB/AD+UH8YH4IP5Qfxg/nR/Aj+VH8aH4MP5Yfx4/nJ/ATyen8JH4yP4WczU/lp/HT+Rn8TH4WP5ufw8/l5/Hz+QX8Qn4Rv5hfwi/ll/HL+RX8Sn4Vv5pfw6/l1/Hr+Q38Rn4Tv5nfwm/lt/Hb+R38Tn4Xv5vfw+/l9/H7+QP8Qf4Qf5g/wh/lj/HH+RP8Sf4Uf5o/w5/lz/Hn+Qv8Rf4//hJ/mb/CX+Wv8df5G/xN/hZ/m7/D3+Xv8ff5B/xD/hH/mH/CP+Wf8c/5F/xL/hX/mn/Dv+Xf8e/5D/xH/hP/mf/Cf+W/8d/5H/xP/hf/m//D/+X/CSKoYIILIaRQQgsjPNEgholGMVyMECPFKDFaLCHGiCXFUmJpsYxYViwnlhcriBXFSmJlsYpYVawmVhdriDXFWmJtsY5YV6wn1hcbiA3FRmKs2FiMEzHhi0BYERcJkRRNIiU2EZuKzcTmYguxpdhKpEVGZEWzCIUT48XWYoLYRmwrJortxCQxWWwvdhBTxFQxTUwXO4oZYicxU+wsdhG7it3E7mKW2EPkxGzRIlpFXswRbaJdFMSeYq7oEJ2iSxRFt5gnekRJlEVFzBcLxF5ioVgk9hb7iH3FfmJ/cYA4UBwkDhaHiEPFYeJwcYQ4UhwljhbHiGPFceJ4cYI4UZwkThaniFPFaeJ0cYY4U5wlzhbniHPFeeJ8cYG4UFwkLhaXiEvFZeJycYW4UlwlrhbXiGvFdeJ6cYO4Udwkbha3iFvFbeJ2cYe4U9wl7hb3iHvFfeJ+8YB4UDwkHhaPiEfFY+Jx8YR4UjwlnhbPiGfFc+J58YJ4UfxPvCReFq+IV8Vr4nXxhnhTvCXeFu+Id8V74n3xgfhQfCQ+Fp+IT8Vn4nPxhfhSfCW+Ft+Ib8V34nvxg/hR/CR+Fr+IX8Vv4nfxh/hT/CX+Fv+If8V/kkgqmeRSSCmV1NJITzbIYbJRDpcj5Eg5So6WS8gxckm5lFxaLiOXlcvJ5eUKckW5klxZriJXlavJ1eUack25llxbriPXlevJ9eUGckO5kRwrN5bjZEz6MpBWxmVCJmWTTMlN5KZyM7m53EJuKbeSaZmRWdksQ+nkeLm1nCC3kdvKiXI7OUlOltvLHeQUOVVOk9PljnKG3EnOlDvLXeSucje5u5wl95A5OVu2yFaZl3Nkm2yXBbmnnCs7ZKfskkXZLefJHlmSZVmR8+UCuZdcKBfJveU+cl+5n9xfHiAPlAfJg+Uh8lB5mDxcHiGPlEfJo+Ux8lh5nDxeniBPlCfJk+Up8lR5mjxdniHPlGfJs+U58lx5njxfXiAvlBfJi+Ul8lJ5mbxcXiGvlFfJq+U18lp5nbxe3iBvlDfJm+Ut8lZ5m7xd3iHvlHfJu+U98l55n7xfPiAflA/Jh+Uj8lH5mHxcPiGflE/Jp+Uz8ln5nHxeviBflP+TL8mX5SvyVfmafF2+Id+Ub8m35TvyXfmefF9+ID+UH8mP5SfyU/mZ/Fx+Ib+UX8mv5TfyW/md/F7+IH+UP8mf5S/yV/mb/F3+If+Uf8m/5T/yX/mfIooqprgSSiqltDLKUw1qmGpUw9UINVKNUqPVEmqMWlItpZZWy6hl1XJqebWCWlGtpFZWq6hV1WpqdbWGWlOtpdZW66h11XpqfbWB2lBtpMaqjdU4FVO+CpRVcZVQSdWkUmoTtanaTG2utlBbqq1UWmVUVjWrUDk1Xm2tJqht1LZqotpOTVKT1fZqBzVFTVXT1HS1o5qhdlIz1c5qF7Wr2k3trmapPVROzVYtqlXl1RzVptpVQe2p5qoO1am6VFF1q3mqR5VUWVXUfLVA7aUWqkVqb7WP2lftp/ZXB6gD1UHqYHWIOlQdpg5XR6gj1VHqaHWMOlYdp45XJ6gT1UnqZHWKOlWdpk5XZ6gz1VnqbHWOOledp85XF6gL1UXqYnWJulRdpi5XV6gr1VXqanWNulZdp65XN6gb1U3qZnWLulXdpm5Xd6g71V3qbnWPulfdp+5XD6gH1UPqYfWIelQ9ph5XT6gn1VPqafWMelY9p55XL6gX1f/US+pl9Yp6Vb2mXldvqDfVW+pt9Y56V72n3lcfqA/VR+pj9Yn6VH2mPldfqC/VV+pr9Y36Vn2nvlc/qB/VT+pn9Yv6Vf2mfld/qD/VX+pv9Y/6V/2niaaaaa6FllpprY32dIMephv1cD1Cj9Sj9Gi9hB6jl9RL6aX1MnpZvZxeXq+gV9Qr6ZX1KnpVvZpeXa+h19Rr6bX1OnpdvZ5eX2+gN9Qb6bF6Yz1Ox7SvA211XCd0UjfplN5Eb6o305vrLfSWeiud1hmd1c061E6P11vrCXobva2eqLfTk/Rkvb3eQU/RU/U0PV3vqGfonfRMvbPeRe+qd9O761l6D53Ts3WLbtV5PUe36XZd0HvqubpDd+ouXdTdep7u0SVd1hU9Xy/Qe+mFepHeW++j99X76f31AfpAfZA+WB+iD9WH6cP1EfpIfZQ+Wh+jj9XH6eP1CfpEfZI+WZ+iT9Wn6dP1GfpMfZY+W5+jz9Xn6fP1BfpCfZG+WF+iL9WX6cv1FfpKfZW+Wl+jr9XX6ev1DfpGfZO+Wd+ib9W36dv1HfpOfZe+W9+j79X36fv1A/pB/ZB+WD+iH9WP6cf1E/pJ/ZR+Wj+jn9XP6ef1C/pF/T/9kn5Zv6Jf1a/p1/Ub+k39ln5bv6Pf1e/p9/UH+kP9kf5Yf6I/1Z/pz/UX+kv9lf5af6O/1d/p7/UP+kf9k/5Z/0JuIjfrX/Vv5DZyO3lE/05uIbeSR/Uf5CDyEDmcXK3/1H/pv/U/+l/ymP7PEEPJfeR+wwwn9xhhpFFGG2M802CGmUYz3IwwI80oM9osYcaQ38ySZimztFnGLGuWM8ubFcyKZiWzslnFrGpWM6ubNcyaZi2ztlnHrGvWM+ubDcgxZkOzkRlrNjbjTMz4JjDWxE3CJE2TSZlNzKZmM7M5OcNsQc4iZ5LvzJbkYXIpOclsZdLkHHI5Od5kTJacQk41zSY0zow3W5sJZhuzrZlotjOTzGSzvdnBTDFTzTQz3exoZpidzEyzs9nF7Gp2M7ubWWYPkzOzTYtpNXkzx7SZdlMwe5q5psN0mi5TNN1mnukxJVM2FTPfLDB7mYVmkdnb7GP2NfuZ/c0B5E5zoDnIHGwOMYeaw8zh5ghzpDnKHG2OMcea48zx5gRzojnJnGxOMaea08zp5gxzpjnLnG3OMeea88z55gJzobnIXGwuMZeay8zl5gpzpbnKXG2uMdea68z15gZzo7nJ3GxuMbea28zt5g5zp7mLPEAeNHebe8y95j5zv3nAPGgeMg+bR8yj5jHzuHnCPGmeMk+bZ8yz5jnzvHnBvGj+Z14yL5tXzKvmNfO6ecO8ad4yb5t3zLvmPfO++cB8aD4yH5tPzKfmM/O5+cJ8ab4yX5tvzLfmO/O9+cH8aH4yP5tfzK/mN/O7+cP8af4yf5t/zL/mP4941GMe94QnPeVpz3ie1+AN8xq94d4Ib6Q3yhvtLeGN8Zb0lvKW9pbxlvWW85b3VvBW9FbyVvZW8Vb1VvNW99bw1vTW8tb21vHW9dbz1vc28Db0NvLGeht747yY53uBZ724l/CSXpOX8jbxNvU28zb3tvC29Lby0l7Gy3rNXug5b7y3tTfB28bb1pvobedN8iZ723s7eFO8qd40b7q3ozfD28mb6e3s7eLt6u3m7e7N0pWuwrhx6XGozV5xfr6n1FLsyfPOSqyhs9DaWiyPHTcuptOduZaeYpfORVWlZ/fk5+dVrl50uthW7MrP1bmoDsu2FHpaKp1zOvJ7DWvpHzdkq7vLtbTku8oNLX1D1dySq+2yNSrN1f3nyjoEMA9gGAHz9dIQ9u8o3zfUIaaRj6oKoz3m62XY+AGTahswqfH9+2rrGzaObyl2duaw0DZgYdjWA/bT3j8WW8/O9Yj26g81oVzoaM2rQr3oCTiSAo5kQnQkhejUTcCcC1FlE7ZhhT2HbTOAsWf/uHHbgbOau9hCW08+39WR62ottKiJuZZKOa866qVx4sDtOgYsqInRCeqoFzGxevSio/pDTYqe3xU9f9LA53cNfP6k6Pld0QnuynUXS+WeYnd7noddbTzf1aYn4+CLOPjJ0cEX62X45PZKV1uup9LZkauUhxcHLqkp0Rx6ojlMGTiHnoFzmBLNoScqU6Nnlepl2NQBp7E04DROG7i38sC9TYt2U47OyLTaS1quvaTTo5e0Er2k03FUFRzV9OioKvUip/cUutpkpfZz+PTFjrAycElPx0tfwW/NjAGzXTBgPHPAeGH/WO0cHeuiemnYuf9tvKhvKDuKXW2l+q93rGkcagzVRw1QLWocNYGaRG1CTaGmUTOoWdRm1BDVRTUFfgr8FLgpcFPgpsBNgZsCNwVuCtwUuClwU+CmwE05Obm92FNthGo/o3VpHHMa7DTYabDTYKfBToOdBjsNdhrsNNhpsNOhnF5nVvqZGRxvBuwM2BmwM2BnwM6AnQE7A3YG7AzYGbAzYGdw3Bmc7yzOdxb8LPhZ8LPgZ8HPgp8FPwt+Fvws+Fnws+Bnwc+CnwW/Gfxm8JvBbwa/Gfxm8JvBbwa/Gfxm8JvBbwa/Gfxm8JvBbwY/BD8EPwQ/BD8EPwQ/BD8EPwQ/BD8EPwQ/BD8EPwQ/BN+B78B34DvwHfgOfAe+A9+B71IN6dq1JPo1z/UNdTqMai4fXe0mlzpypfZoXOwf1/fijxuHGkP1UQNUixpHTaAmUZtQU6hp1AxqFrUZNUSNzoYfAz8Gfgz8GPgx8GPgx8CPJRunDrxalwYsYAvMJIaZxDCTGGYSw0ximImPmfiYiY+Z+JiJj5n4mImPmfg4Ez7OhI8z4YPvg++D74Pvg++DH4AfgB+AH4AfgB+AH4AfgBuAG4AbgBuAG4AbgBuAa8G14FpwLbgWXAuuBdfiuC34FnwLvgXfgm/Bt+Bb8OPgx8GPgx8HPw5+HPw4+HHw4+DHwY+DHwc/Dn4c/Dj4cfAT4CfAT4CfAD8BfgL8BPgJ8BPgJ8BPgJ8APwF+AvwE+Anwk+AnwU+CnwQ/CX4S/CT4SfCT4CfBT4KfBD8JfhL8JPhJ8OF/H/734X8f/vfhfx/+9+F/H/734X8f/vfhfx/+9+F/H/734X8f/vfhfx/+91PgIwf4yAE+coCPHOAjB/jIAT5ygI8c4CMH+MgBPnKAjxzgp8BHm+OnwUcW8JEFfGQBH1nARxbwkQV8ZAEfWcBHFvCRBXxkAR9ZwE+DnwY/Az7ygI884CMP+MgDPvKAjzzgIw/4yAM+8oCPPOAjD/jIAz7ygI884CMP+MgDPvKAjzzgIw/4yAM+8oAP//vwvg/v+/C+D+/78L4P7/vwvg/v+/C+D+/78L4P7/vwvg/v+/C4D4/78LgPj/vwuA+P+/C4D4/78LgPj/vwuA+P+/C4D4/78LgPj/vwuA+P+/C4D4/78LgPj/vwuA+P+/C4D4/78LjvwHfgO/Ad+A58B75zXltPbn6+KrzZXt3ktVH9sWCc79U7kQFrLGocNYGaRG0a3l4szs3NLs4f+Kw0agY1i9qMGqJG5yKAxQNYPIDFA1g8gMUDWDyAxYMYZhFrQk2hgg93B3B3AHcHcHcAdwdwdwB3B77fWO11Zuc7igv6DwoCDyDwAAIPIPAAAg8g8AACDyDwAAIPIPAAAg8g8AACDyDwAAIPIPAAAg8g8AACDwLwIfIAIg8g8gAiDyDyACIPIPIAIg8g8gAiDyDyACIPIPIAIg8g8gAiDyDyACIPIPIAIg8g8gAiDyDyACIPIPIAIg8g8gAiDyDyACIPIPIAIg8g8gAiDyDyACIPIPIAIg8g8gAiDyDyACIPIPIAIg8g8gAiDyDyACIPIPIAIg8g8gAiDyDyACIPIPIAIg8g6gCiDiDiACIOIOIAIg6SoSwXu4ql4a2FfE++VCjVlxrSHd3tufrQy3UVy/mOfCHXGHaXCtWevb7ahGU8PqGIUePkzkLtE4doYfqAjRsmd+bboo1GF6qbL8aSdZbI5Ms5OT5Xzc8aHLFzdRWvcuS09upI1EBy21x3d05NzHXObs2x7SpsUoXtVNAgs+0LfEp7UU4ttHXm+LRcRWMWfPv2As9W/21fKjROGDCDkdigd7kh13fgjfmBh5vvPdxC7+EuWVn8qdHB1J8vZtcOpq12MLI131HOaexLLKodUu3Bcv2QajuTc+uH1BEdUleF7VXQxeh4eE97UZVqBxOT9cLL1WMCl3dXj6el+q+6KIu1E9w48NyOHDS9xuLAV6cy8NUp9r060XsCkgwgyQCSDCDJAJIMIMkAkgwgyQDNcYDmOEBzHKA5DtAcB2iOA0g1gFQDSDWAVANINYBUA0g1gFQDSDWAVANINYBUA0g1gFQDSDWAVANINYBUA0g1gFQDSDWAVANINYBUA0g1gFQDSDWAVANINYBUA0g1gFQDSDVwEd+iHbZohy3aYYt22EKnFjq10KmFTi3aYYt22EKkFiK1EKmFSC1EaiFSC5FaiNRCpBYitRCphUgtRGohUguRWojUQqQWIrUQqYVILURqIVILkVqI1KIJtmiCLRxq4VALh1o41MKhFg61cKiFQy0cauFQC4daONTCoRYOtXCohUMtHGrhUAuHWjjUwqEWDrVwqIVDLRxq4VALh1o41MKhFg61cKiFQy0cauFQC4daONTCoRYOtXCohUMtHGrhUAuHWjjUwqEWDrVwqIVDLRxq4VALh1o41MKhFg61cKiFQy0cauFQC4daONTCoRYOtXCohUMtHGrhUAuHWjjUwqEWDrVwqIVDLRxq4VALh1o41KIZtmiGLZphi2bYwrEWjrVohi2aYYtm2KIZtnCwhYMtHGzhYItm2KIZtmiGLZphi2bYohm2aIYtmmGLZtiiGbZohi2aYYtm2KIZtmiGLZphi2bYohm2aIYtmmGLZtiiGbZohi2aYYtm2KIZtmiGLZphi2bYohm2aIYtmmGLZtiiGbZohi2aYYtm2KIZtmiGLZphi2bYohm2aIYtmmGLZtiiGbZohi2aYYtm2KIZtmiGLZphi2bYohm2aIYtmmGLZtiiGbZohi2aYYtm2KIZtmiGLZphi2bYohm2aIYtmmGLZtiiGbZohi2aYYsPxy0+HLdoji0+HLdoki2aZIsm2aJJtmiSLZpkC/9b+N/C/xb+t/C/hf8t/G/hf9vc5OXmFAqxcU29VyYkAIsEYJEALBKARQKwSAAWCcAiAVgkAIsEYJEALBKARQKwSAAWCcAiAVgkAIsEYJEALBKARQKwSAAWCcAiAVgkAIsEYJEALBKARQKwSAAWCcAiAVgkAIsEYJEALBKARQKwSABxJIA4EkAcCSCOBBBHAogjAcSRAOJIAHEkgDgSQBwJII4EEEcCiCMBxJEA4kgAcSSAOBJAHAkgjgQQh9HjMHocRo/D6HFcOeK4csRx5YjjyhHHlSOOK0ccV444rhxxXDniuHLEceWI48oRT/VyMG9cOeK4csRx5YjjyhHHlSOOK0ccV444rhxxXDniuHLEceWI48oRx5UjjitHHFeOOK4c8bSTpfb8/FxDtXfIzSnl24od0bC7+qN9WH04L9eZK5dke6GnME+WS9VULusbyvo2qvfhYrURiHaaSat5ldmVckm15trypXbZmS/n22Rnbl5ujujJzclXn1nKz9Ol9kJX7cZ4qV5MqVillirzvEp3d75nVm1VR3FBvqc6iPabTQyLYPOq4C6R68jP4dWGRbYVOvMdsrW6XGbteT4/N18uyi0sdPFqq8LL1X8Li61mTqEr1zE3N4dX/8nqVPNY1Znv5NV/0UJXpYtX/6lS9fG57aK2E11/oDvPuvMN9WG5VG1VZP0nn1esHlD1CEXtUKo9znxVhc+PShWqqv9qpa3WybR71VJqr+6zfppizdHvSrXGUH3UANWixlETqEnUJtQUaho1g5pFbUYNUV1UY+DHwI+BHwM/Bn4M/Bj4MfBj4MfAj4EfAz8Gfgz8GPgx8H3wffB98H3wffB98H3wffB98H3wffB98H3wffB98H3wA/AD8APwA/AD8APwA/AD8APwA/AD8APwA/AD8APwA/At+BZ8C74F34JvwbfgW/At+BZ8C74F34JvwbfgW/Dj4MfBj4MfBz8Ofhz8OPhx8OPgx8GPgx8HPw5+HPw4+HHwE+AnwE+AnwA/AX4C/AT4CfAT4CfAT4CfAD8BfgL8BPgJ8JPgJ8FPgp8EPwl+Evwk+Enwk+AnwU+CnwQ/CX4S/CT4SfCbwG8Cvwn8JvCbwG8Cvwn8JvCbwG8Cvwn8JvCbwG8Cvwn8JvBT4KfAT4GfAj8Ffgr8FPgp8FPgp8BPgZ8CPwV+CvwU+Cnw0+CnwU+DnwY/DX4a/DT4afDT4KfBT4OfBj8Nfhr8NPhp8DPgZ8DPgJ8BPwN+BvwM+BnwM+BnwM+AnwE/A34G/Az4GfCz4GfBz4KfBT8Lfhb8LPhZ8LPgZ8HPgu/AiTJZLIRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnQngmhGdCeCaEZ0J4JoRnwqRTM+r3OtWCqMyIvtq4oF68Gb0fsHsLekfR8+CZEJ4J4ZkQngnhmRCeCeGZEJ4J4ZkQngnhmRCeCeGZEJ4J4ZkQngnhmRCeCeGZEJ4J4ZkQnglToZfuvV/p5XpHDem+O7MNub7hqHT/Vz3rp2FUbvCKAVvUT9vALeorlhywRd+Ol8wNsXLgvup3lgfuq75izIAtemc+Jvf/1w2LvhoefQ0tN2Acra/PC+vr45HR+r6ZjMwtvozn1eeA59XHI6L1vdgRucUWvbBv1LeuIew/z/37V2H01d5or6PCwSc5P3hFOPis5wef9XCos54f6qyHg896fvBZD4c46/n/v65hQv+xFfqG3oS+s1DoG03uGxX7nj25/9nF/tlNHnzoxcErJg8+F8XB52LyUOeiONS5mDz4XBQHn4vJQ5yL4hDnov613+jrksX+YX1tfVLR2vpwRH1t3yRGFBdbjJ5Th0fPqQ+H19f20oYXBy550/tGlb75TO/fYaV/OL1/apX+4fT+WVb6Zzl98VlWFp/l9P5ZVvpnOX2xWVYGLqmZ0WV2Yb14M/vmvLBvzjP7d7+w/3dlZvS7sjD6GnztmuaQ2Rwym0Nmc8hsDpnNIbM5ZDaHzOaQ2Rwym0Nmc8hsDpnNIbM5ZDaHzOaQ2Rwym0Nmc8hsDpnNIbM5ZDSHjOaQ0RwymkNGc8hoDpnMIZM5ZDKHTOaQyRwymUMmc8hkDpnMIZM5ZDKHTOaQyZzfy8PxIZM5ZDKHTOaQyRwymUMmc8hkDpnMIZM5ZDKHTOaQyRwymUMmc8hkDpnMIZM5ZDKHTOaQyRwymUMmc8hkDhnMIYM5ZDCHDOaQwRwymEPmcshcDpnLIXM5ZC6HzOWQuRwyl0PWcshYLt67X8wfmcohUzlkKodM5ZCpHDKVQ6ZyyFQOmcohUzlkKodM5ZCpHDKVQ6ZyyFQOmcohUzlkKodM5ZCpHDKVQ6ZyyFQOmcohUzlkKodM5ZCpHDKVQ6/u0Ks79OoOvbpDr+7QqztkKIcM5ZChHDKUQ4ZyyFAOGco19fJwvMhQDhnKIUM5ZCiHDOWQoRwylEOGcshQDhnKIUM5ZCiHDOXQqzv06g69ukOv7tCrO/TqDr26Q6/u0Ks79OoOvbpDr+7Qqzv06g69ukOv7tCrO/TqDr26Q6/u0Ks79OoOvbpDr+7Qqzv06A49ukOP7tCjO/ToDj26Q4/u0KM79OgOPbpDj+7Qozv06A49ukOP7tCbO/TmDr25Q2/u0Ju7LLhZcLPgZsHNgtsMbjO4zeA2g9sMXjN4zeA1g9cMXjN4zeA0g9MMTghOCE4ITghOiOML8bqG4IbghuCG4IbghuCGOM4Q/BD8EHwHngPPgefAceA4cBw4DhwHjgPHgRN9BuKPi3xYrVnUZtTex11UI99Vq48aH17pasWfbbbO7hg+r1Is52tZuKeUb8U2eG7knmrNoILlg+WHqrPQVf8DunxLsQvPDqyX36ulI9dZ3bvXk2sttOSqaSt6LI7ZJbDnBPacwJ4T2HOidzvndZUq3fmeQrEnWpPC8UTXi2rFcUXXi2q1UU1juzS2S/uio9CTw0IcNaG686V8uXd1E2pKldrz8/IdorXY1SbCSk8RD2B6aUwvjROVASwDWAaTymBSGUwqA24Gz4tuavqxKOz4sSiEVGsCNcknt3d6+VK50Jkr4+WJRSqs1tAUu/Ll9kJPq1deUKwPSl51Vb7Q1l5ubyy39+QxLg2bU5jfO24sVV/tLixEu2qyXq6np7igIz+nrOujSndDvfbUNosebC0u6IpGs6swD5u1djX2jWaX6inPx58D+X4s3lDsKbfX/mIx19FY6CrX3mUt5UKxa1h+XqUwv/rO6GrBcxK+bC9WSvnh1TdjR7Gt9rbpKpYbak+q5s6OcnffcHb9tpmPe7I+7sX6uIfq415ptVrUJlQ87mM93s/xAMsBluN4fpQxqhX7jzJGtWL7KGNUawI1iQpelDWqNY2aQe3lNKOGqNHbIp4APwF+AvwE+AnwE+AnwE+AnwA/AT5+2+L4bYvXftu6Z3cUW+bq6mtWqzJa6pgT1Z4ylsul9lxrXtZ/6ta59erNKXR0VC8dxeh3Gnd2fdyZrdZMQ7RFT/WV1uWeQq6t0h3VHiy3dkW1Y46q9WMd0TsgnsV5yTqv0DV/dqW6k3JtFG3TUOzOd2FlqbNQfavmWvLV99T8vgVeqnSpOfnO6rtK1H7IUnd1vqKlozJbtudzVXprIdfZe6FKJFLDOislvM/yWJdBzaJGL0kWL0kWL0kWL0kWL0kWL0kWL0kWL0kWL0kWL0kWL0kWL0kWvCx4WVwAs0lwkuAkwUmCkwQnCU4U/3x8tJxO9tUm1BRqGjWDmkVtRg1RXVSjdqZaY1Ftwv6asL8m7K8J+4viXjXNNKOGjdGt4ln1e+ojq7/H+WrvWq5ejWr3oE3tVveCQvVNVb/JXRup9nyt6Lm56IH6He3aqLH3rnZtwdTuO9e3K+fm1x+t7nlWd0elVCq0dQ2r3bXGTfiG+rg+HF1fVb9zjwdHDVhTX+HVJlSfakNtFN2Vr6/szHUX5nmz8+Vo82H1e/MY1ycfjU17Php483Pz8XD9nj3Wlns39KonJRqN6L2Djwf6RsPqx4611QPHqKuCnTVGd/OjheG4nY9p9A6G1e/n45nzithzQ+30Ydh/Crxy75RNdfLR9x6qB1z7YkPt5ajVqi9rpX5G6rOrv8y4E+FwJ8LhTkS1BqPqaWPAX2EOb1nYU708FFrqH8CNqv/l/ICHRw8Y99S+2J031ZelI18q7TmsqrbqJCJ9VIXXOx5eF13vUuOcYqWnf6H6Ruvbru69vqW6APuWej/JGFt9H8VG9H2EUVu0wzGDQv3BkfgDmdof0YxtyXUPWI4NWs4OWh43YDk56PlB33LvCZpVLHfmeuZ69RM1troWW9pBe7KDyMEQy00DlmM1+oDl7KBl27t94+xcT2EsDn5M/cFMLNogVtvpuCHWxQats0NsZwdtlxhif4kh9pcYYn+JQftLDTG/1BDzSw0xv9QQ80sNMb/UEPNLDTG/1P+fXzb+/+e32LrB29khthu8v8QQ+0sMsb/EEPsb6vw19b7Jhlg3eLvEENslBnEH7W+xdYO3SwyxXX1/tb/cqkbgQv1zTxN2tdV/GXsHfu8gMIvyPcXaSFcvF/VavVTUqle/TNRGpnaJiAaF6Fdclwp71bepXyLqo/rlob5RVyHa0chBH2ePHPTh9YjFP6YeOejz6Ib+mxsN/fczvL7bFw39NyuWGEQa29GyxCBYddXoxXmLb1TfT3XV8H5q31LvDhr72H0P9T7NRNtUWkz01ErL8P5911bXr9vVwbDeW2y1ldGzKy0jB/6PS2oPRJew6gPR/wFlVk9+Tr6n2n+OqjukbhrYqH9FnxYjCQ/vXax/rW9Mn4D6v983om/doMX6V/tGDYge9bV1wUOS0bf7qn1Yphljf8A4qI3F1FmZ8P8AjHyfawAAAAMACAACABEAAf//AAN42iXNuw2DUBBE0dn3JtiVnLg3LH8EbTikL+MCTCNAA+YTGMxIBFc62YUBOKknaiScAX5gbPlF5shRnjjJM2d54U9eucobN/nvL5g33iD72zu59x7JhyhgcYkrUtziLj+iRI4qKhioY1J2tAPvjxreeNpNkj1IXEEQx//73o637xn1OE9RESNWFhbBQiyukBQWkkJNCJikEDUkSgQR66tTW4aU1vYigoUYP8iX5sNovv0KBlRikLvq8n+bY5DHzvxmdnZn5s3CAIjRihzM44cj03Cw9KBUQkBlEIyOTk6heuzJ+CPU0xMkPr8DRsbIoAltJMOvtaxvoCLR5s9/O+igzHA5LuuOEEhl4rclxjxHI7pxE7dwF8OYwAzyeIpnmMM8lrGLAwbGJmtaTLvpNDnTa/rNbHJPdA+B/evpvtIDpSHShc/3UumV0mulN54CVnzN/SSfu7e6t6W0fSXqXcJugfI3QvZUjWx0h9ZxdJvyzL3XUx88JTFp1EcDCO2FPY8GfZaPGrWj9ElpV2lP6bPSF6WvSt88pZipgXNo5wy6kHPrzFlktes+d9GtURdor3m74L77Xl5QFt0qZcHf9aPcbcr+siccc0kEoaQ4tViqpAo1UiNppCUjtchInTQiyy6Tt5HlWzDo8K8jpBSehcRSK820Qntqz+wl40L6mwGXd3m0uCW3guvc74Ow/jae70JP+W9v+n+6QXnqa9snXXo6UDpUWizHXcn7Dy3Idx0AAHja7VsBaBbZEZ55721u4+WiiTHVNMSYSBCxkgaRIBLsESSENFgRCTaIFZsGa0MIIiIicgSRIBJEQhArVkRERMQeQbyc53mpl6bRU2s9L5d6aZrTv+p5wQtBrDWd93bjzv/vv8n+MbFeW8J8O//svJl58+bt7nu7AQSAaZADZYC1v9zYADYoksDICOgz+JtfNPyaZADT9S8QIOm8BUnwFkmTqeXbkALvQCpkwmJYCiWwEiphLWyCBtgN+6EFjsAJaIdeuAePYRheYBKmYibZQPobpONbgLLZ+S3bnKPa4xynrSQfCGpGw4yOtMy0WudX2un0+eknZi5wfs08MHMgY2nGXudXRvesyllXMsuc9pnnnOOczc4xO9No2TmX5xbObZo7kFuS25r7ZF6Fkb4zb++88/MiebPzyvK2553Mu5Nv5xfn1+a35nea8yL/zvwkx878hc6x4LZzXNjiHH900/QKf3zAPR6ifOljG6BoEXWEhylbFXAIjlJWTsM5OA8XoQO64Drcphz1Q4SyNATPqFESpmA6zsYcnI8LsRCX4nJ8F8uwEtfgOtyANbgFG3A77sJGbMJmbMHDeAxP4hl8Hy/gJbyC3XgT7+BdHMAHOIjD+FwIYYtUkSGyRK4oEItEkSgWJaJUlItVYq2o1iNutRBmGOw0CB6KXxm+N1aOzbGSkf5Y3tFBxTRzYlsF4UgHk2z34Sbrdy/5IAv9Y1ke2RDLx7ETkBPsjs2JK/F5d/OgJtJrv01XZ0PcmAUkqRErG8DeZe+CHPsD+wOYa39od0CufcX+GhYk/yx5jZ7xNNcGzTxPotGtsTYTn00zGSGP6hR1VcuIsYpkR2s/ZdpafoXmN0I3aadDASyCIiima0AplMMqugpUw0aohTrYCjvoarAH9ul2omoUcYVoJ/738idk42ORTVikJVAkd4yiq18Ay0n/Mmt7XuwmPCOuE74w8mPiIOEZ/HQUId1KslKsVCvNyrCyrB9a2ZSPD+2L9kf2Jftj+xO7g7LxqenXd16/dARqWF0DQRmk2YpFWIwlWIrluArXYjVuxFqsw624A3fjHtyHB7AVj+BxPIVnsQ3b8TJ24jW8hT3Yh/fwET7BpxShEtPEDJEpskWeWCAWiyVimVghVooKsVpUifVik9gs6sU2sVO8J/aK/eKgOCSOihPitDgnzouLokN0ievitugV/SIiHosh8UyCTJIpMl3OljlyvlwoC+VSuVy+K8tkpVwj18kNskZukQ1yu9wlG2WTbJYt8rA8Jk/KM/J9eUFekldkt7wp78i7ckA+kINyWD5XQtkqVWWoLJWrCtQiVaSKVYkqVeVqlVqrqtVGVavq1Fa1Q+1We9Q+dUC1qiPquDqlzqo21W5qY6XGpOM0NkOaxyHDdxu+W/Mi2+hkG77S8JWGZ22jeK4ToI99xn5frF9RZXSqfG3bDd/u81Vg+AKffr3h6w1favhSH899cXmh4QtNbJdNbJfH7GNQHsbmbZ88IM9h8hMVJ4+tyfBPQ/NOPAfH4qPqxOFrffHzOM3YYarnC4/77F/3dFybzYa/7fFRNo0dmWJ42+isYDZ3szGtCuBt31j3sdh4Tgp47RlNN04PnQp050shw8fML+Pd8WqO4cPfDdLUH1WX+pPqVtfUZ+rP6i/qtrqjvlL96u/qHl0T/2lfgDS6Tq4kqiBaTVRFtJ5oE9FmonqibUQ7id4j2ku0n+gg0SHycZSOJ7wanTSsY3WfavhDL6/ji/9/HZ/QdbxSP/O7WMiwxkP5Uw+5PAqrxzzrQzzOcIghkwe1pScQT1LKsIrhQQ/xvIdimYfykpG/iLUjnb5sMXyj0bnss1+TIPJWNkOW/6A8h8mPE6EbJ/d7PTHEWpa32thMusjqhPuVJewsz38qw0UeipMe4myGTh/XGOxmyPvO29ayaLmc5S1q7BhGjfUSps8zw/te4/UlKg8sTm4/qs79uCaGD38dz1Kd6qq6qb5QPepL1av+qu6qv6n7KqL+oR6oh+qR+kY9Vt+qJ2pIPVcvktcl/zy5GrJCXcHBvYIDrV+BVrAAeu5cJOog6iLSeblN1EvUT9FE6PiYSOfumZ6ivjmQEYBBOhBaP0hSFGhHmjUQ6t9ay+x80OpfDdO9T4CMGgGd+7l0NnWs+yZZFGRxubEJMRbHaxvf4zgxmsoAUxNoamLeVMcYx6OOsdyNcYOxOINwTgKVOVqXQVmfFs/Wa/A7fZx2kxpB3LH8z0cQlHsBS6KqKG3c6hl7bumeLHF7Uh7SYtC4OX5eMcaASp9AjHHz6sVYDltYjOkTHL/xayUo7zqCjZMSQfxaGcvva+t53NF8DT2PN/buDvHRN3yHeFCvsYJQbHN2DOLLo/SB8ft8bTsZDiaGuD4WuTywLYQ+C4nF4+xCOPsJXBLH/j5fBsL3ui/g7Cm9GnbRk4d/lpTquupTX9O8ANBPtnpWZOldErNXstrgb02vnPo98mbXr8oyETeaiJs8XkbYbkKPJ+FymcuwPr6Osx/D5VHYFutRVmt0o3LOLvFhxMs1j9+V86iYTcealeG14rwfA3PSxOSO5IjPL9cPysCYvY7y28iywdHzGL5+hbqlPid9/ZbTPAehs3O48/tTszJiVqBlBnPNquWp4Y8ZPt3bqXAkXK4qvNW305bruNZ6YuXqrLe/IQYMv4Oti7mdVoMpPowwv5HYmF0L3E6N5zEqQo4RHwblZJuXAS4JygbPAO+7m4Gq+NlzbLoxlDD9dg8djwYTqdkbaiCqZv8ACwg/od/OSq2EPZ/MfNli/GcehEwLLWEpy7Js621ruvUD+6J5F3bN/sy+Yd+0b9mf21/YX9n9FM1q8iYhB+bDQt0yjj9UDw3enwLLQ1Ns+eGUWX40ZZYfT5nlbydgWVdiXkAlOnYTt+hEOmpRr6mSzFO08wQ9FDV+YfV73FFJzP6jBO1/E1r/RoL6V92xD6t/3x3RsPoPE9S/mqD+jQT1exLU/zJB/SGmn0dXVkEzI9ttMYtZ7H35hQRaaSG1v3O1vz/Pwy2jX3nQk5XGViZpZGgkqjhW4kfXZuP4mvIWQ+ZRVTBJvQ+ZPMpXZHy0ej37nHfscAzMSZsncTXbQuQhoO/cF48kjh2H3+XLQyShL35Gd7JePls4X/K46NRs95tdswm/X+PvwhbFvmdMtNXUYfh43Hevqz1M2GN72Gy8et+j3mp57/jC1+xEdt/mkAftXb+9ayDaTrSLSD+hNxE1E7UQHSbST/P6reAZoveJLhDp979XiPRbu5tEd4juEunV0AOiQaJh6skyfY8JhbNDayaINCc1PvPQncdtb/o8dr6P8mGYLz6YprNLMglfkZROjp1x4mkP4F8BsXnys+HYHP0GzFi+5SHTDD+Px34noncX9bcXKxL+wmh0Ny4ITzO+i+0nBbeq+1+4F45z1R4KodPMvrzpfB33yMBIgr5xmWKcpF7/V9wLZb2+98h681QyyvsRzH96xNeJGOxiWB8KIdiv/u8NXMF21cya8F8Do38v6uOsETOc/+DQX8HTuq5zpNhZ5/0b9HXxHAAAAAABAAAAANWkJwgAAAAAyEN6pwAAAADYonM1` diff --git a/vendor/github.com/alecthomas/chroma/formatters/svg/svg.go b/vendor/github.com/alecthomas/chroma/formatters/svg/svg.go new file mode 100644 index 00000000..631fa148 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/formatters/svg/svg.go @@ -0,0 +1,222 @@ +// Package svg contains an SVG formatter. +package svg + +import ( + "encoding/base64" + "errors" + "fmt" + "io" + "io/ioutil" + "path" + "strings" + + "github.com/alecthomas/chroma" +) + +// Option sets an option of the SVG formatter. +type Option func(f *Formatter) + +// FontFamily sets the font-family. +func FontFamily(fontFamily string) Option { return func(f *Formatter) { f.fontFamily = fontFamily } } + +// EmbedFontFile embeds given font file +func EmbedFontFile(fontFamily string, fileName string) (option Option, err error) { + var format FontFormat + switch path.Ext(fileName) { + case ".woff": + format = WOFF + case ".woff2": + format = WOFF2 + case ".ttf": + format = TRUETYPE + default: + return nil, errors.New("unexpected font file suffix") + } + + var content []byte + if content, err = ioutil.ReadFile(fileName); err == nil { + option = EmbedFont(fontFamily, base64.StdEncoding.EncodeToString(content), format) + } + return +} + +// EmbedFont embeds given base64 encoded font +func EmbedFont(fontFamily string, font string, format FontFormat) Option { + return func(f *Formatter) { f.fontFamily = fontFamily; f.embeddedFont = font; f.fontFormat = format } +} + +// New SVG formatter. +func New(options ...Option) *Formatter { + f := &Formatter{fontFamily: "Consolas, Monaco, Lucida Console, Liberation Mono, DejaVu Sans Mono, Bitstream Vera Sans Mono, Courier New, monospace"} + for _, option := range options { + option(f) + } + return f +} + +// Formatter that generates SVG. +type Formatter struct { + fontFamily string + embeddedFont string + fontFormat FontFormat +} + +func (f *Formatter) Format(w io.Writer, style *chroma.Style, iterator chroma.Iterator) (err error) { + f.writeSVG(w, style, iterator.Tokens()) + return err +} + +var svgEscaper = strings.NewReplacer( + `&`, "&", + `<`, "<", + `>`, ">", + `"`, """, + ` `, " ", + ` `, "    ", +) + +// EscapeString escapes special characters. +func escapeString(s string) string { + return svgEscaper.Replace(s) +} + +func (f *Formatter) writeSVG(w io.Writer, style *chroma.Style, tokens []chroma.Token) { // nolint: gocyclo + svgStyles := f.styleToSVG(style) + lines := chroma.SplitTokensIntoLines(tokens) + + fmt.Fprint(w, "\n") + fmt.Fprint(w, "\n") + fmt.Fprintf(w, "\n", 8*maxLineWidth(lines), 10+int(16.8*float64(len(lines)+1))) + + if f.embeddedFont != "" { + f.writeFontStyle(w) + } + + fmt.Fprintf(w, "\n", style.Get(chroma.Background).Background.String()) + fmt.Fprintf(w, "\n", f.fontFamily, style.Get(chroma.Text).Colour.String()) + + f.writeTokenBackgrounds(w, lines, style) + + for index, tokens := range lines { + fmt.Fprintf(w, "", 1.2*float64(index+1)) + + for _, token := range tokens { + text := escapeString(token.String()) + attr := f.styleAttr(svgStyles, token.Type) + if attr != "" { + text = fmt.Sprintf("%s", attr, text) + } + fmt.Fprint(w, text) + } + fmt.Fprint(w, "") + } + + fmt.Fprint(w, "\n\n") + fmt.Fprint(w, "\n") +} + +func maxLineWidth(lines [][]chroma.Token) int { + maxWidth := 0 + for _, tokens := range lines { + length := 0 + for _, token := range tokens { + length += len(strings.Replace(token.String(), ` `, " ", -1)) + } + if length > maxWidth { + maxWidth = length + } + } + return maxWidth +} + +// There is no background attribute for text in SVG so simply calculate the position and text +// of tokens with a background color that differs from the default and add a rectangle for each before +// adding the token. +func (f *Formatter) writeTokenBackgrounds(w io.Writer, lines [][]chroma.Token, style *chroma.Style) { + for index, tokens := range lines { + lineLength := 0 + for _, token := range tokens { + length := len(strings.Replace(token.String(), ` `, " ", -1)) + tokenBackground := style.Get(token.Type).Background + if tokenBackground.IsSet() && tokenBackground != style.Get(chroma.Background).Background { + fmt.Fprintf(w, "\n", escapeString(token.String()), lineLength, 1.2*float64(index)+0.25, length, style.Get(token.Type).Background.String()) + } + lineLength += length + } + } +} + +type FontFormat int + +// https://transfonter.org/formats +const ( + WOFF FontFormat = iota + WOFF2 + TRUETYPE +) + +var fontFormats = [...]string{ + "woff", + "woff2", + "truetype", +} + +func (f *Formatter) writeFontStyle(w io.Writer) { + fmt.Fprintf(w, ``, f.fontFamily, fontFormats[f.fontFormat], f.embeddedFont, fontFormats[f.fontFormat]) +} + +func (f *Formatter) styleAttr(styles map[chroma.TokenType]string, tt chroma.TokenType) string { + if _, ok := styles[tt]; !ok { + tt = tt.SubCategory() + if _, ok := styles[tt]; !ok { + tt = tt.Category() + if _, ok := styles[tt]; !ok { + return "" + } + } + } + return styles[tt] +} + +func (f *Formatter) styleToSVG(style *chroma.Style) map[chroma.TokenType]string { + converted := map[chroma.TokenType]string{} + bg := style.Get(chroma.Background) + // Convert the style. + for t := range chroma.StandardTypes { + entry := style.Get(t) + if t != chroma.Background { + entry = entry.Sub(bg) + } + if entry.IsZero() { + continue + } + converted[t] = StyleEntryToSVG(entry) + } + return converted +} + +// StyleEntryToSVG converts a chroma.StyleEntry to SVG attributes. +func StyleEntryToSVG(e chroma.StyleEntry) string { + var styles []string + + if e.Colour.IsSet() { + styles = append(styles, "fill=\""+e.Colour.String()+"\"") + } + if e.Bold == chroma.Yes { + styles = append(styles, "font-weight=\"bold\"") + } + if e.Italic == chroma.Yes { + styles = append(styles, "font-style=\"italic\"") + } + if e.Underline == chroma.Yes { + styles = append(styles, "text-decoration=\"underline\"") + } + return strings.Join(styles, " ") +} diff --git a/vendor/github.com/alecthomas/chroma/formatters/tty_indexed.go b/vendor/github.com/alecthomas/chroma/formatters/tty_indexed.go index 4046e973..eb90ea7c 100644 --- a/vendor/github.com/alecthomas/chroma/formatters/tty_indexed.go +++ b/vendor/github.com/alecthomas/chroma/formatters/tty_indexed.go @@ -174,6 +174,9 @@ func entryToEscapeSequence(table *ttyTable, entry chroma.StyleEntry) string { if entry.Underline == chroma.Yes { out += "\033[4m" } + if entry.Italic == chroma.Yes { + out += "\033[3m" + } if entry.Colour.IsSet() { out += table.foreground[findClosest(table, entry.Colour)] } @@ -197,6 +200,7 @@ func findClosest(table *ttyTable, seeking chroma.Colour) chroma.Colour { } func styleToEscapeSequence(table *ttyTable, style *chroma.Style) map[chroma.TokenType]string { + style = clearBackground(style) out := map[chroma.TokenType]string{} for _, ttype := range style.Types() { entry := style.Get(ttype) @@ -205,16 +209,22 @@ func styleToEscapeSequence(table *ttyTable, style *chroma.Style) map[chroma.Toke return out } +// Clear the background colour. +func clearBackground(style *chroma.Style) *chroma.Style { + builder := style.Builder() + bg := builder.Get(chroma.Background) + bg.Background = 0 + bg.NoInherit = true + builder.AddEntry(chroma.Background, bg) + style, _ = builder.Build() + return style +} + type indexedTTYFormatter struct { table *ttyTable } func (c *indexedTTYFormatter) Format(w io.Writer, style *chroma.Style, it chroma.Iterator) (err error) { - defer func() { - if perr := recover(); perr != nil { - err = perr.(error) - } - }() theme := styleToEscapeSequence(c.table, style) for token := it(); token != chroma.EOF; token = it() { // TODO: Cache token lookups? diff --git a/vendor/github.com/alecthomas/chroma/formatters/tty_truecolour.go b/vendor/github.com/alecthomas/chroma/formatters/tty_truecolour.go index 723b5de5..b02e6360 100644 --- a/vendor/github.com/alecthomas/chroma/formatters/tty_truecolour.go +++ b/vendor/github.com/alecthomas/chroma/formatters/tty_truecolour.go @@ -11,6 +11,7 @@ import ( var TTY16m = Register("terminal16m", chroma.FormatterFunc(trueColourFormatter)) func trueColourFormatter(w io.Writer, style *chroma.Style, it chroma.Iterator) error { + style = clearBackground(style) for token := it(); token != chroma.EOF; token = it() { entry := style.Get(token.Type) if !entry.IsZero() { @@ -21,6 +22,9 @@ func trueColourFormatter(w io.Writer, style *chroma.Style, it chroma.Iterator) e if entry.Underline == chroma.Yes { out += "\033[4m" } + if entry.Italic == chroma.Yes { + out += "\033[3m" + } if entry.Colour.IsSet() { out += fmt.Sprintf("\033[38;2;%d;%d;%dm", entry.Colour.Red(), entry.Colour.Green(), entry.Colour.Blue()) } diff --git a/vendor/github.com/alecthomas/chroma/go.mod b/vendor/github.com/alecthomas/chroma/go.mod index 9d0aa86d..2add0a3f 100644 --- a/vendor/github.com/alecthomas/chroma/go.mod +++ b/vendor/github.com/alecthomas/chroma/go.mod @@ -1,14 +1,24 @@ module github.com/alecthomas/chroma require ( + github.com/GeertJohan/go.rice v1.0.0 github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 // indirect - github.com/alecthomas/kong v0.1.15 + github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae + github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8 github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 // indirect github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 github.com/dlclark/regexp2 v1.1.6 + github.com/gorilla/csrf v1.6.0 + github.com/gorilla/handlers v1.4.1 + github.com/gorilla/mux v1.7.3 github.com/mattn/go-colorable v0.0.9 github.com/mattn/go-isatty v0.0.4 github.com/sergi/go-diff v1.0.0 // indirect + github.com/stretchr/testify v1.3.0 // indirect golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35 // indirect ) + +replace github.com/GeertJohan/go.rice => github.com/alecthomas/go.rice v1.0.1-0.20190719113735-961b99d742e7 + +go 1.13 diff --git a/vendor/github.com/alecthomas/chroma/go.sum b/vendor/github.com/alecthomas/chroma/go.sum index 27210bbb..4e724e39 100644 --- a/vendor/github.com/alecthomas/chroma/go.sum +++ b/vendor/github.com/alecthomas/chroma/go.sum @@ -1,26 +1,58 @@ +github.com/GeertJohan/go.incremental v1.0.0/go.mod h1:6fAjUhbVuX1KcMD3c8TEgVUqmo4seqhv0i0kdATSkM0= +github.com/akavel/rsrc v0.8.0/go.mod h1:uLoCtb9J+EyAqh+26kdrTgmzRBFPGOolLWKpdxkKq+c= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38 h1:smF2tmSOzy2Mm+0dGI2AIUHY+w0BUc+4tn40djz7+6U= github.com/alecthomas/assert v0.0.0-20170929043011-405dbfeb8e38/go.mod h1:r7bzyVFMNntcxPZXK3/+KdruV1H5KSlyVY0gc+NgInI= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721 h1:JHZL0hZKJ1VENNfmXvHbgYlbUOvpzYzvy2aZU5gXVeo= github.com/alecthomas/colour v0.0.0-20160524082231-60882d9e2721/go.mod h1:QO9JBoKquHd+jz9nshCh40fOfO+JzsoXy8qTHF68zU0= -github.com/alecthomas/kong v0.1.15 h1:IWBg+KrLvoHBicD50OzMI8fKjrtAa1okMR9g38HVM/s= -github.com/alecthomas/kong v0.1.15/go.mod h1:0m2VYms8rH0qbCqVB2gvGHk74bqLIq0HXjCs5bNbNQU= +github.com/alecthomas/go.rice v1.0.1-0.20190719113735-961b99d742e7 h1:0cMlP9evwgTzs5JUe2C/3rLttYjmRm0kbz9fdGBIV1E= +github.com/alecthomas/go.rice v1.0.1-0.20190719113735-961b99d742e7/go.mod h1:af5vUNlDNkCjOZeSGFgIJxDje9qdjsO6hshx0gTmZt4= +github.com/alecthomas/kong v0.1.17-0.20190424132513-439c674f7ae0/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= +github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae h1:C4Q9m+oXOxcSWwYk9XzzafY2xAVAaeubZbUHJkw3PlY= +github.com/alecthomas/kong v0.2.1-0.20190708041108-0548c6b1afae/go.mod h1:+inYUSluD+p4L8KdviBSgzcqEjUQOfC5fQDRFuc36lI= +github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8 h1:atLL+K8Hg0e8863K2X+k7qu+xz3M2a/mWFIACAPf55M= +github.com/alecthomas/kong-hcl v0.1.8-0.20190615233001-b21fea9723c8/go.mod h1:MRgZdU3vrFd05IQ89AxUZ0aYdF39BYoNFa324SodPCA= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897 h1:p9Sln00KOTlrYkxI1zYWl1QLnEqAqEARBEYa8FQnQcY= github.com/alecthomas/repr v0.0.0-20180818092828-117648cd9897/go.mod h1:xTS7Pm1pD1mvyM075QCDSRqH6qRLXylzS24ZTpRiSzQ= +github.com/daaku/go.zipexe v1.0.0 h1:VSOgZtH418pH9L16hC/JrgSNJbbAL26pj7lmD1+CGdY= +github.com/daaku/go.zipexe v1.0.0/go.mod h1:z8IiR6TsVLEYKwXAoE/I+8ys/sDkgTzSL0CLnGVd57E= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964 h1:y5HC9v93H5EPKqaS1UYVg1uYah5Xf51mBfIoWehClUQ= github.com/danwakefield/fnmatch v0.0.0-20160403171240-cbb64ac3d964/go.mod h1:Xd9hchkHSWYkEqJwUGisez3G1QY8Ryz0sdWrLPMGjLk= +github.com/davecgh/go-spew v1.1.0/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/davecgh/go-spew v1.1.1 h1:vj9j/u1bqnvCEfJOwUhtlOARqs3+rkHYY13jYWTU97c= github.com/davecgh/go-spew v1.1.1/go.mod h1:J7Y8YcW2NihsgmVo/mv3lAwl/skON4iLHjSsI+c5H38= github.com/dlclark/regexp2 v1.1.6 h1:CqB4MjHw0MFCDj+PHHjiESmHX+N7t0tJzKvC6M97BRg= github.com/dlclark/regexp2 v1.1.6/go.mod h1:2pZnwuY/m+8K6iRw6wQdMtk+rH5tNGR1i55kozfMjCc= +github.com/gorilla/csrf v1.6.0 h1:60oN1cFdncCE8tjwQ3QEkFND5k37lQPcRjnlvm7CIJ0= +github.com/gorilla/csrf v1.6.0/go.mod h1:7tSf8kmjNYr7IWDCYhd3U8Ck34iQ/Yw5CJu7bAkHEGI= +github.com/gorilla/handlers v1.4.1 h1:BHvcRGJe/TrL+OqFxoKQGddTgeibiOjaBssV5a/N9sw= +github.com/gorilla/handlers v1.4.1/go.mod h1:Qkdc/uu4tH4g6mTK6auzZ766c4CA0Ng8+o/OAirnOIQ= +github.com/gorilla/mux v1.7.3 h1:gnP5JzjVOuiZD07fKKToCAOjS0yOpj/qPETTXCCS6hw= +github.com/gorilla/mux v1.7.3/go.mod h1:1lud6UwP+6orDFRuTfBEV8e9/aOM/c4fVVCaMa2zaAs= +github.com/gorilla/securecookie v1.1.1 h1:miw7JPhV+b/lAHSXz4qd/nN9jRiAFV5FwjeKyCS8BvQ= +github.com/gorilla/securecookie v1.1.1/go.mod h1:ra0sb63/xPlUeL+yeDciTfxMRAA+MP+HVt/4epWDjd4= +github.com/hashicorp/hcl v1.0.0 h1:0Anlzjpi4vEasTeNFn2mLJgTSwt0+6sfsiTG8qcWGx4= +github.com/hashicorp/hcl v1.0.0/go.mod h1:E5yfLk+7swimpb2L/Alb/PJmXilQ/rhwaUYs4T20WEQ= +github.com/jessevdk/go-flags v1.4.0/go.mod h1:4FA24M0QyGHXBuZZK/XkWh8h0e1EYbRYJSGM75WSRxI= github.com/mattn/go-colorable v0.0.9 h1:UVL0vNpWh04HeJXV0KLcaT7r06gOH2l4OW6ddYRUIY4= github.com/mattn/go-colorable v0.0.9/go.mod h1:9vuHe8Xs5qXnSaW/c/ABM9alt+Vo+STaOChaDxuIBZU= github.com/mattn/go-isatty v0.0.4 h1:bnP0vzxcAdeI1zdubAl5PjU6zsERjGZb7raWodagDYs= github.com/mattn/go-isatty v0.0.4/go.mod h1:M+lRXTBqGeGNdLjl/ufCoiOlB5xdOkqRJdNxMWT7Zi4= +github.com/mitchellh/mapstructure v1.1.2/go.mod h1:FVVH3fgwuzCH5S8UJGiWEs2h04kUh9fWfEaFds41c1Y= +github.com/nkovacs/streamquote v1.0.0/go.mod h1:BN+NaZ2CmdKqUuTUXUEm9j95B2TRbpOWpxbJYzzgUsc= +github.com/pkg/errors v0.8.0 h1:WdK/asTD0HN+q6hsWO3/vpuAkAr+tw6aNJNDFFf0+qw= +github.com/pkg/errors v0.8.0/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= +github.com/pkg/errors v0.8.1 h1:iURUrRGxPUNPdy5/HRSm+Yj6okJ6UtLINN0Q9M4+h3I= +github.com/pkg/errors v0.8.1/go.mod h1:bwawxfHBFNV+L2hUp1rHADufV3IMtnDRdf1r5NINEl0= github.com/pmezard/go-difflib v1.0.0 h1:4DBwDE0NGyQoBHbLQYPwSUPoCMWR5BEzIk/f1lZbAQM= github.com/pmezard/go-difflib v1.0.0/go.mod h1:iKH77koFhYxTK1pcRnkKkqfTogsbg7gZNVY4sRDYZ/4= github.com/sergi/go-diff v1.0.0 h1:Kpca3qRNrduNnOQeazBd0ysaKrUJiIuISHxogkT9RPQ= github.com/sergi/go-diff v1.0.0/go.mod h1:0CfEIISq7TuYL3j771MWULgwwjU+GofnZX9QAmXWZgo= +github.com/stretchr/objx v0.1.0/go.mod h1:HFkY916IF+rwdDfMAkV7OtwuqBVzrE8GR6GFx+wExME= github.com/stretchr/testify v1.2.2 h1:bSDNvY7ZPG5RlJ8otE/7V6gMiyenm9RtJ7IUVIAoJ1w= github.com/stretchr/testify v1.2.2/go.mod h1:a8OnRcib4nhh0OaRAV+Yts87kKdq0PP7pXfy6kDkUVs= +github.com/stretchr/testify v1.3.0 h1:TivCn/peBQ7UY8ooIcPgZFpTNSz0Q2U6UrFlUfqbe0Q= +github.com/stretchr/testify v1.3.0/go.mod h1:M5WIy9Dh21IEIfnGCwXGc5bZfKNJtfHm1UVUgZn+9EI= +github.com/valyala/bytebufferpool v1.0.0/go.mod h1:6bBcMArwyJ5K/AmCkWv1jt77kVWyCJ6HpOuEn7z0Csc= +github.com/valyala/fasttemplate v1.0.1/go.mod h1:UQGH1tvbgY+Nz5t2n7tXsz52dQxojPUpymEIMZ47gx8= golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35 h1:YAFjXN64LMvktoUZH9zgY4lGc/msGN7HQfoSuKCgaDU= golang.org/x/sys v0.0.0-20181128092732-4ed8d59d0b35/go.mod h1:STP8DvDyc/dI5b8T5hshtkjS+E42TnysNCUPdjciGhY= diff --git a/vendor/github.com/alecthomas/chroma/lexers/README.md b/vendor/github.com/alecthomas/chroma/lexers/README.md index 43bdbbde..2421710e 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/README.md +++ b/vendor/github.com/alecthomas/chroma/lexers/README.md @@ -7,13 +7,31 @@ that its output matches `.exported`. Run the tests as normal: ```go -go run ./lexers +go test ./lexers ``` -## Updating the existing tests +## Update existing tests +When you add a new test data file (`*.actual`), you need to regenerate all tests. That's how Chroma creates the `*.expected` test file based on the corresponding lexer. -You can regenerate all the test outputs +To regenerate all tests, type in your terminal: ```go RECORD=true go test ./lexers ``` + +This first sets the `RECORD` environment variable to `true`. Then it runs `go test` on the `./lexers` directory of the Chroma project. + +(That environment variable tells Chroma it needs to output test data. After running `go test ./lexers` you can remove or reset that variable.) + +### Windows users +Windows users will find that the `RECORD=true go test ./lexers` command fails in both the standard command prompt terminal and in PowerShell. + +Instead we have to perform both steps separately: + +- Set the `RECORD` environment variable to `true`. + + In the regular command prompt window, the `set` command sets an environment variable for the current session: `set RECORD=true`. See [this page](https://superuser.com/questions/212150/how-to-set-env-variable-in-windows-cmd-line) for more. + + In PowerShell, you can use the `$env:RECORD = 'true'` command for that. See [this article](https://mcpmag.com/articles/2019/03/28/environment-variables-in-powershell.aspx) for more. + + You can also make a persistent environment variable by hand in the Windows computer settings. See [this article](https://www.computerhope.com/issues/ch000549.htm) for how. +- When the environment variable is set, run `go tests ./lexers`. + +Chroma will now regenerate the test files and print its results to the console window. diff --git a/vendor/github.com/alecthomas/chroma/lexers/a/abap.go b/vendor/github.com/alecthomas/chroma/lexers/a/abap.go new file mode 100644 index 00000000..61c294e0 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/a/abap.go @@ -0,0 +1,56 @@ +package a + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// ABAP lexer. +var Abap = internal.Register(MustNewLexer( + &Config{ + Name: "ABAP", + Aliases: []string{"abap"}, + Filenames: []string{"*.abap", "*.ABAP"}, + MimeTypes: []string{"text/x-abap"}, + CaseInsensitive: true, + }, + Rules{ + "common": { + {`\s+`, Text, nil}, + {`^\*.*$`, CommentSingle, nil}, + {`\".*?\n`, CommentSingle, nil}, + {`##\w+`, CommentSpecial, nil}, + }, + "variable-names": { + {`<\S+>`, NameVariable, nil}, + {`\w[\w~]*(?:(\[\])|->\*)?`, NameVariable, nil}, + }, + "root": { + Include("common"), + {`CALL\s+(?:BADI|CUSTOMER-FUNCTION|FUNCTION)`, Keyword, nil}, + {`(CALL\s+(?:DIALOG|SCREEN|SUBSCREEN|SELECTION-SCREEN|TRANSACTION|TRANSFORMATION))\b`, Keyword, nil}, + {`(FORM|PERFORM)(\s+)(\w+)`, ByGroups(Keyword, Text, NameFunction), nil}, + {`(PERFORM)(\s+)(\()(\w+)(\))`, ByGroups(Keyword, Text, Punctuation, NameVariable, Punctuation), nil}, + {`(MODULE)(\s+)(\S+)(\s+)(INPUT|OUTPUT)`, ByGroups(Keyword, Text, NameFunction, Text, Keyword), nil}, + {`(METHOD)(\s+)([\w~]+)`, ByGroups(Keyword, Text, NameFunction), nil}, + {`(\s+)([\w\-]+)([=\-]>)([\w\-~]+)`, ByGroups(Text, NameVariable, Operator, NameFunction), nil}, + {`(?<=(=|-)>)([\w\-~]+)(?=\()`, NameFunction, nil}, + {`(TEXT)(-)(\d{3})`, ByGroups(Keyword, Punctuation, LiteralNumberInteger), nil}, + {`(TEXT)(-)(\w{3})`, ByGroups(Keyword, Punctuation, NameVariable), nil}, + {`(ADD-CORRESPONDING|AUTHORITY-CHECK|CLASS-DATA|CLASS-EVENTS|CLASS-METHODS|CLASS-POOL|DELETE-ADJACENT|DIVIDE-CORRESPONDING|EDITOR-CALL|ENHANCEMENT-POINT|ENHANCEMENT-SECTION|EXIT-COMMAND|FIELD-GROUPS|FIELD-SYMBOLS|FUNCTION-POOL|INTERFACE-POOL|INVERTED-DATE|LOAD-OF-PROGRAM|LOG-POINT|MESSAGE-ID|MOVE-CORRESPONDING|MULTIPLY-CORRESPONDING|NEW-LINE|NEW-PAGE|NEW-SECTION|NO-EXTENSION|OUTPUT-LENGTH|PRINT-CONTROL|SELECT-OPTIONS|START-OF-SELECTION|SUBTRACT-CORRESPONDING|SYNTAX-CHECK|SYSTEM-EXCEPTIONS|TYPE-POOL|TYPE-POOLS|NO-DISPLAY)\b`, Keyword, nil}, + {`(?])(CREATE\s+(PUBLIC|PRIVATE|DATA|OBJECT)|(PUBLIC|PRIVATE|PROTECTED)\s+SECTION|(TYPE|LIKE)\s+((LINE\s+OF|REF\s+TO|(SORTED|STANDARD|HASHED)\s+TABLE\s+OF))?|FROM\s+(DATABASE|MEMORY)|CALL\s+METHOD|(GROUP|ORDER) BY|HAVING|SEPARATED BY|GET\s+(BADI|BIT|CURSOR|DATASET|LOCALE|PARAMETER|PF-STATUS|(PROPERTY|REFERENCE)\s+OF|RUN\s+TIME|TIME\s+(STAMP)?)?|SET\s+(BIT|BLANK\s+LINES|COUNTRY|CURSOR|DATASET|EXTENDED\s+CHECK|HANDLER|HOLD\s+DATA|LANGUAGE|LEFT\s+SCROLL-BOUNDARY|LOCALE|MARGIN|PARAMETER|PF-STATUS|PROPERTY\s+OF|RUN\s+TIME\s+(ANALYZER|CLOCK\s+RESOLUTION)|SCREEN|TITLEBAR|UPADTE\s+TASK\s+LOCAL|USER-COMMAND)|CONVERT\s+((INVERTED-)?DATE|TIME|TIME\s+STAMP|TEXT)|(CLOSE|OPEN)\s+(DATASET|CURSOR)|(TO|FROM)\s+(DATA BUFFER|INTERNAL TABLE|MEMORY ID|DATABASE|SHARED\s+(MEMORY|BUFFER))|DESCRIBE\s+(DISTANCE\s+BETWEEN|FIELD|LIST|TABLE)|FREE\s(MEMORY|OBJECT)?|PROCESS\s+(BEFORE\s+OUTPUT|AFTER\s+INPUT|ON\s+(VALUE-REQUEST|HELP-REQUEST))|AT\s+(LINE-SELECTION|USER-COMMAND|END\s+OF|NEW)|AT\s+SELECTION-SCREEN(\s+(ON(\s+(BLOCK|(HELP|VALUE)-REQUEST\s+FOR|END\s+OF|RADIOBUTTON\s+GROUP))?|OUTPUT))?|SELECTION-SCREEN:?\s+((BEGIN|END)\s+OF\s+((TABBED\s+)?BLOCK|LINE|SCREEN)|COMMENT|FUNCTION\s+KEY|INCLUDE\s+BLOCKS|POSITION|PUSHBUTTON|SKIP|ULINE)|LEAVE\s+(LIST-PROCESSING|PROGRAM|SCREEN|TO LIST-PROCESSING|TO TRANSACTION)(ENDING|STARTING)\s+AT|FORMAT\s+(COLOR|INTENSIFIED|INVERSE|HOTSPOT|INPUT|FRAMES|RESET)|AS\s+(CHECKBOX|SUBSCREEN|WINDOW)|WITH\s+(((NON-)?UNIQUE)?\s+KEY|FRAME)|(BEGIN|END)\s+OF|DELETE(\s+ADJACENT\s+DUPLICATES\sFROM)?|COMPARING(\s+ALL\s+FIELDS)?|(INSERT|APPEND)(\s+INITIAL\s+LINE\s+(IN)?TO|\s+LINES\s+OF)?|IN\s+((BYTE|CHARACTER)\s+MODE|PROGRAM)|END-OF-(DEFINITION|PAGE|SELECTION)|WITH\s+FRAME(\s+TITLE)|(REPLACE|FIND)\s+((FIRST|ALL)\s+OCCURRENCES?\s+OF\s+)?(SUBSTRING|REGEX)?|MATCH\s+(LENGTH|COUNT|LINE|OFFSET)|(RESPECTING|IGNORING)\s+CASE|IN\s+UPDATE\s+TASK|(SOURCE|RESULT)\s+(XML)?|REFERENCE\s+INTO|AND\s+(MARK|RETURN)|CLIENT\s+SPECIFIED|CORRESPONDING\s+FIELDS\s+OF|IF\s+FOUND|FOR\s+EVENT|INHERITING\s+FROM|LEAVE\s+TO\s+SCREEN|LOOP\s+AT\s+(SCREEN)?|LOWER\s+CASE|MATCHCODE\s+OBJECT|MODIF\s+ID|MODIFY\s+SCREEN|NESTING\s+LEVEL|NO\s+INTERVALS|OF\s+STRUCTURE|RADIOBUTTON\s+GROUP|RANGE\s+OF|REF\s+TO|SUPPRESS DIALOG|TABLE\s+OF|UPPER\s+CASE|TRANSPORTING\s+NO\s+FIELDS|VALUE\s+CHECK|VISIBLE\s+LENGTH|HEADER\s+LINE|COMMON\s+PART)\b`, Keyword, nil}, + {`(^|(?<=(\s|\.)))(ABBREVIATED|ABSTRACT|ADD|ALIASES|ALIGN|ALPHA|ASSERT|AS|ASSIGN(ING)?|AT(\s+FIRST)?|BACK|BLOCK|BREAK-POINT|CASE|CATCH|CHANGING|CHECK|CLASS|CLEAR|COLLECT|COLOR|COMMIT|CREATE|COMMUNICATION|COMPONENTS?|COMPUTE|CONCATENATE|CONDENSE|CONSTANTS|CONTEXTS|CONTINUE|CONTROLS|COUNTRY|CURRENCY|DATA|DATE|DECIMALS|DEFAULT|DEFINE|DEFINITION|DEFERRED|DEMAND|DETAIL|DIRECTORY|DIVIDE|DO|DUMMY|ELSE(IF)?|ENDAT|ENDCASE|ENDCATCH|ENDCLASS|ENDDO|ENDFORM|ENDFUNCTION|ENDIF|ENDINTERFACE|ENDLOOP|ENDMETHOD|ENDMODULE|ENDSELECT|ENDTRY|ENDWHILE|ENHANCEMENT|EVENTS|EXACT|EXCEPTIONS?|EXIT|EXPONENT|EXPORT|EXPORTING|EXTRACT|FETCH|FIELDS?|FOR|FORM|FORMAT|FREE|FROM|FUNCTION|HIDE|ID|IF|IMPORT|IMPLEMENTATION|IMPORTING|IN|INCLUDE|INCLUDING|INDEX|INFOTYPES|INITIALIZATION|INTERFACE|INTERFACES|INTO|LANGUAGE|LEAVE|LENGTH|LINES|LOAD|LOCAL|JOIN|KEY|NEXT|MAXIMUM|MESSAGE|METHOD[S]?|MINIMUM|MODULE|MODIFIER|MODIFY|MOVE|MULTIPLY|NODES|NUMBER|OBLIGATORY|OBJECT|OF|OFF|ON|OTHERS|OVERLAY|PACK|PAD|PARAMETERS|PERCENTAGE|POSITION|PROGRAM|PROVIDE|PUBLIC|PUT|PF\d\d|RAISE|RAISING|RANGES?|READ|RECEIVE|REDEFINITION|REFRESH|REJECT|REPORT|RESERVE|RESUME|RETRY|RETURN|RETURNING|RIGHT|ROLLBACK|REPLACE|SCROLL|SEARCH|SELECT|SHIFT|SIGN|SINGLE|SIZE|SKIP|SORT|SPLIT|STATICS|STOP|STYLE|SUBMATCHES|SUBMIT|SUBTRACT|SUM(?!\()|SUMMARY|SUMMING|SUPPLY|TABLE|TABLES|TIMESTAMP|TIMES?|TIMEZONE|TITLE|\??TO|TOP-OF-PAGE|TRANSFER|TRANSLATE|TRY|TYPES|ULINE|UNDER|UNPACK|UPDATE|USING|VALUE|VALUES|VIA|VARYING|VARY|WAIT|WHEN|WHERE|WIDTH|WHILE|WITH|WINDOW|WRITE|XSD|ZERO)\b`, Keyword, nil}, + {`(abs|acos|asin|atan|boolc|boolx|bit_set|char_off|charlen|ceil|cmax|cmin|condense|contains|contains_any_of|contains_any_not_of|concat_lines_of|cos|cosh|count|count_any_of|count_any_not_of|dbmaxlen|distance|escape|exp|find|find_end|find_any_of|find_any_not_of|floor|frac|from_mixed|insert|lines|log|log10|match|matches|nmax|nmin|numofchar|repeat|replace|rescale|reverse|round|segment|shift_left|shift_right|sign|sin|sinh|sqrt|strlen|substring|substring_after|substring_from|substring_before|substring_to|tan|tanh|to_upper|to_lower|to_mixed|translate|trunc|xstrlen)(\()\b`, ByGroups(NameBuiltin, Punctuation), nil}, + {`&[0-9]`, Name, nil}, + {`[0-9]+`, LiteralNumberInteger, nil}, + {`(?<=(\s|.))(AND|OR|EQ|NE|GT|LT|GE|LE|CO|CN|CA|NA|CS|NOT|NS|CP|NP|BYTE-CO|BYTE-CN|BYTE-CA|BYTE-NA|BYTE-CS|BYTE-NS|IS\s+(NOT\s+)?(INITIAL|ASSIGNED|REQUESTED|BOUND))\b`, OperatorWord, nil}, + Include("variable-names"), + {`[?*<>=\-+&]`, Operator, nil}, + {`'(''|[^'])*'`, LiteralStringSingle, nil}, + {"`([^`])*`", LiteralStringSingle, nil}, + {`([|}])([^{}|]*?)([|{])`, ByGroups(Punctuation, LiteralStringSingle, Punctuation), nil}, + {`[/;:()\[\],.]`, Punctuation, nil}, + {`(!)(\w+)`, ByGroups(Operator, Name), nil}, + }, + }, +)) diff --git a/vendor/github.com/alecthomas/chroma/lexers/a/applescript.go b/vendor/github.com/alecthomas/chroma/lexers/a/applescript.go index 84ddf1f7..db83ed0e 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/a/applescript.go +++ b/vendor/github.com/alecthomas/chroma/lexers/a/applescript.go @@ -31,7 +31,7 @@ var Applescript = internal.Register(MustNewLexer( {`\b(as )(alias |application |boolean |class |constant |date |file |integer |list |number |POSIX file |real |record |reference |RGB color |script |text |unit types|(?:Unicode )?text|string)\b`, ByGroups(Keyword, NameClass), nil}, {`\b(AppleScript|current application|false|linefeed|missing value|pi|quote|result|return|space|tab|text item delimiters|true|version)\b`, NameConstant, nil}, {`\b(ASCII (character|number)|activate|beep|choose URL|choose application|choose color|choose file( name)?|choose folder|choose from list|choose remote application|clipboard info|close( access)?|copy|count|current date|delay|delete|display (alert|dialog)|do shell script|duplicate|exists|get eof|get volume settings|info for|launch|list (disks|folder)|load script|log|make|mount volume|new|offset|open( (for access|location))?|path to|print|quit|random number|read|round|run( script)?|say|scripting components|set (eof|the clipboard to|volume)|store script|summarize|system attribute|system info|the clipboard|time to GMT|write|quoted form)\b`, NameBuiltin, nil}, - {`\b(considering|else|error|exit|from|if|ignoring|in|repeat|tell|then|times|to|try|until|using terms from|while|whith|with timeout( of)?|with transaction|by|continue|end|its?|me|my|return|of|as)\b`, Keyword, nil}, + {`\b(considering|else|error|exit|from|if|ignoring|in|repeat|tell|then|times|to|try|until|using terms from|while|with|with timeout( of)?|with transaction|by|continue|end|its?|me|my|return|of|as)\b`, Keyword, nil}, {`\b(global|local|prop(erty)?|set|get)\b`, Keyword, nil}, {`\b(but|put|returning|the)\b`, NameBuiltin, nil}, {`\b(attachment|attribute run|character|day|month|paragraph|word|year)s?\b`, NameBuiltin, nil}, diff --git a/vendor/github.com/alecthomas/chroma/lexers/b/ballerina.go b/vendor/github.com/alecthomas/chroma/lexers/b/ballerina.go index 40aaa525..91dc9017 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/b/ballerina.go +++ b/vendor/github.com/alecthomas/chroma/lexers/b/ballerina.go @@ -25,7 +25,7 @@ var Ballerina = internal.Register(MustNewLexer( {`(annotation|bind|but|endpoint|error|function|object|private|public|returns|service|type|var|with|worker)\b`, KeywordDeclaration, nil}, {`(boolean|byte|decimal|float|int|json|map|nil|record|string|table|xml)\b`, KeywordType, nil}, {`(true|false|null)\b`, KeywordConstant, nil}, - {`import(\s+)`, ByGroups(KeywordNamespace, Text), Push("import")}, + {`(import)(\s+)`, ByGroups(KeywordNamespace, Text), Push("import")}, {`"(\\\\|\\"|[^"])*"`, LiteralString, nil}, {`'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'`, LiteralStringChar, nil}, {`(\.)((?:[^\W\d]|\$)[\w$]*)`, ByGroups(Operator, NameAttribute), nil}, diff --git a/vendor/github.com/alecthomas/chroma/lexers/b/bash.go b/vendor/github.com/alecthomas/chroma/lexers/b/bash.go index 131e432f..38b3f224 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/b/bash.go +++ b/vendor/github.com/alecthomas/chroma/lexers/b/bash.go @@ -53,7 +53,7 @@ var Bash = internal.Register(MustNewLexer( {`&`, Punctuation, nil}, {`\|`, Punctuation, nil}, {`\s+`, Text, nil}, - {`\d+\b`, LiteralNumber, nil}, + {`\d+(?= |$)`, LiteralNumber, nil}, {"[^=\\s\\[\\]{}()$\"\\'`\\\\<&|;]+", Text, nil}, {`<`, Text, nil}, }, diff --git a/vendor/github.com/alecthomas/chroma/lexers/b/bibtex.go b/vendor/github.com/alecthomas/chroma/lexers/b/bibtex.go new file mode 100644 index 00000000..1d76b1d8 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/b/bibtex.go @@ -0,0 +1,76 @@ +package b + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Bibtex lexer. +var Bibtex = internal.Register(MustNewLexer( + &Config{ + Name: "BibTeX", + Aliases: []string{"bib", "bibtex"}, + Filenames: []string{"*.bib"}, + MimeTypes: []string{"text/x-bibtex"}, + NotMultiline: true, + CaseInsensitive: true, + }, + Rules{ + "root": { + Include("whitespace"), + {`@comment`, Comment, nil}, + {`@preamble`, NameClass, Push("closing-brace", "value", "opening-brace")}, + {`@string`, NameClass, Push("closing-brace", "field", "opening-brace")}, + {"@[a-z_@!$&*+\\-./:;<>?\\[\\\\\\]^`|~][\\w@!$&*+\\-./:;<>?\\[\\\\\\]^`|~]*", NameClass, Push("closing-brace", "command-body", "opening-brace")}, + {`.+`, Comment, nil}, + }, + "opening-brace": { + Include("whitespace"), + {`[{(]`, Punctuation, Pop(1)}, + }, + "closing-brace": { + Include("whitespace"), + {`[})]`, Punctuation, Pop(1)}, + }, + "command-body": { + Include("whitespace"), + {`[^\s\,\}]+`, NameLabel, Push("#pop", "fields")}, + }, + "fields": { + Include("whitespace"), + {`,`, Punctuation, Push("field")}, + Default(Pop(1)), + }, + "field": { + Include("whitespace"), + {"[a-z_@!$&*+\\-./:;<>?\\[\\\\\\]^`|~][\\w@!$&*+\\-./:;<>?\\[\\\\\\]^`|~]*", NameAttribute, Push("value", "=")}, + Default(Pop(1)), + }, + "=": { + Include("whitespace"), + {`=`, Punctuation, Pop(1)}, + }, + "value": { + Include("whitespace"), + {"[a-z_@!$&*+\\-./:;<>?\\[\\\\\\]^`|~][\\w@!$&*+\\-./:;<>?\\[\\\\\\]^`|~]*", NameVariable, nil}, + {`"`, LiteralString, Push("quoted-string")}, + {`\{`, LiteralString, Push("braced-string")}, + {`[\d]+`, LiteralNumber, nil}, + {`#`, Punctuation, nil}, + Default(Pop(1)), + }, + "quoted-string": { + {`\{`, LiteralString, Push("braced-string")}, + {`"`, LiteralString, Pop(1)}, + {`[^\{\"]+`, LiteralString, nil}, + }, + "braced-string": { + {`\{`, LiteralString, Push()}, + {`\}`, LiteralString, Pop(1)}, + {`[^\{\}]+`, LiteralString, nil}, + }, + "whitespace": { + {`\s+`, Text, nil}, + }, + }, +)) diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/cl.go b/vendor/github.com/alecthomas/chroma/lexers/c/cl.go index 6e048dea..fdc97297 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/c/cl.go +++ b/vendor/github.com/alecthomas/chroma/lexers/c/cl.go @@ -5,8 +5,232 @@ import ( "github.com/alecthomas/chroma/lexers/internal" ) +var ( + clBuiltinFunctions = []string{ + "<", "<=", "=", ">", ">=", "-", "/", "/=", "*", "+", "1-", "1+", + "abort", "abs", "acons", "acos", "acosh", "add-method", "adjoin", + "adjustable-array-p", "adjust-array", "allocate-instance", + "alpha-char-p", "alphanumericp", "append", "apply", "apropos", + "apropos-list", "aref", "arithmetic-error-operands", + "arithmetic-error-operation", "array-dimension", "array-dimensions", + "array-displacement", "array-element-type", "array-has-fill-pointer-p", + "array-in-bounds-p", "arrayp", "array-rank", "array-row-major-index", + "array-total-size", "ash", "asin", "asinh", "assoc", "assoc-if", + "assoc-if-not", "atan", "atanh", "atom", "bit", "bit-and", "bit-andc1", + "bit-andc2", "bit-eqv", "bit-ior", "bit-nand", "bit-nor", "bit-not", + "bit-orc1", "bit-orc2", "bit-vector-p", "bit-xor", "boole", + "both-case-p", "boundp", "break", "broadcast-stream-streams", + "butlast", "byte", "byte-position", "byte-size", "caaaar", "caaadr", + "caaar", "caadar", "caaddr", "caadr", "caar", "cadaar", "cadadr", + "cadar", "caddar", "cadddr", "caddr", "cadr", "call-next-method", "car", + "cdaaar", "cdaadr", "cdaar", "cdadar", "cdaddr", "cdadr", "cdar", + "cddaar", "cddadr", "cddar", "cdddar", "cddddr", "cdddr", "cddr", "cdr", + "ceiling", "cell-error-name", "cerror", "change-class", "char", "char<", + "char<=", "char=", "char>", "char>=", "char/=", "character", + "characterp", "char-code", "char-downcase", "char-equal", + "char-greaterp", "char-int", "char-lessp", "char-name", + "char-not-equal", "char-not-greaterp", "char-not-lessp", "char-upcase", + "cis", "class-name", "class-of", "clear-input", "clear-output", + "close", "clrhash", "code-char", "coerce", "compile", + "compiled-function-p", "compile-file", "compile-file-pathname", + "compiler-macro-function", "complement", "complex", "complexp", + "compute-applicable-methods", "compute-restarts", "concatenate", + "concatenated-stream-streams", "conjugate", "cons", "consp", + "constantly", "constantp", "continue", "copy-alist", "copy-list", + "copy-pprint-dispatch", "copy-readtable", "copy-seq", "copy-structure", + "copy-symbol", "copy-tree", "cos", "cosh", "count", "count-if", + "count-if-not", "decode-float", "decode-universal-time", "delete", + "delete-duplicates", "delete-file", "delete-if", "delete-if-not", + "delete-package", "denominator", "deposit-field", "describe", + "describe-object", "digit-char", "digit-char-p", "directory", + "directory-namestring", "disassemble", "documentation", "dpb", + "dribble", "echo-stream-input-stream", "echo-stream-output-stream", + "ed", "eighth", "elt", "encode-universal-time", "endp", + "enough-namestring", "ensure-directories-exist", + "ensure-generic-function", "eq", "eql", "equal", "equalp", "error", + "eval", "evenp", "every", "exp", "export", "expt", "fboundp", + "fceiling", "fdefinition", "ffloor", "fifth", "file-author", + "file-error-pathname", "file-length", "file-namestring", + "file-position", "file-string-length", "file-write-date", + "fill", "fill-pointer", "find", "find-all-symbols", "find-class", + "find-if", "find-if-not", "find-method", "find-package", "find-restart", + "find-symbol", "finish-output", "first", "float", "float-digits", + "floatp", "float-precision", "float-radix", "float-sign", "floor", + "fmakunbound", "force-output", "format", "fourth", "fresh-line", + "fround", "ftruncate", "funcall", "function-keywords", + "function-lambda-expression", "functionp", "gcd", "gensym", "gentemp", + "get", "get-decoded-time", "get-dispatch-macro-character", "getf", + "gethash", "get-internal-real-time", "get-internal-run-time", + "get-macro-character", "get-output-stream-string", "get-properties", + "get-setf-expansion", "get-universal-time", "graphic-char-p", + "hash-table-count", "hash-table-p", "hash-table-rehash-size", + "hash-table-rehash-threshold", "hash-table-size", "hash-table-test", + "host-namestring", "identity", "imagpart", "import", + "initialize-instance", "input-stream-p", "inspect", + "integer-decode-float", "integer-length", "integerp", + "interactive-stream-p", "intern", "intersection", + "invalid-method-error", "invoke-debugger", "invoke-restart", + "invoke-restart-interactively", "isqrt", "keywordp", "last", "lcm", + "ldb", "ldb-test", "ldiff", "length", "lisp-implementation-type", + "lisp-implementation-version", "list", "list*", "list-all-packages", + "listen", "list-length", "listp", "load", + "load-logical-pathname-translations", "log", "logand", "logandc1", + "logandc2", "logbitp", "logcount", "logeqv", "logical-pathname", + "logical-pathname-translations", "logior", "lognand", "lognor", + "lognot", "logorc1", "logorc2", "logtest", "logxor", "long-site-name", + "lower-case-p", "machine-instance", "machine-type", "machine-version", + "macroexpand", "macroexpand-1", "macro-function", "make-array", + "make-broadcast-stream", "make-concatenated-stream", "make-condition", + "make-dispatch-macro-character", "make-echo-stream", "make-hash-table", + "make-instance", "make-instances-obsolete", "make-list", + "make-load-form", "make-load-form-saving-slots", "make-package", + "make-pathname", "make-random-state", "make-sequence", "make-string", + "make-string-input-stream", "make-string-output-stream", "make-symbol", + "make-synonym-stream", "make-two-way-stream", "makunbound", "map", + "mapc", "mapcan", "mapcar", "mapcon", "maphash", "map-into", "mapl", + "maplist", "mask-field", "max", "member", "member-if", "member-if-not", + "merge", "merge-pathnames", "method-combination-error", + "method-qualifiers", "min", "minusp", "mismatch", "mod", + "muffle-warning", "name-char", "namestring", "nbutlast", "nconc", + "next-method-p", "nintersection", "ninth", "no-applicable-method", + "no-next-method", "not", "notany", "notevery", "nreconc", "nreverse", + "nset-difference", "nset-exclusive-or", "nstring-capitalize", + "nstring-downcase", "nstring-upcase", "nsublis", "nsubst", "nsubst-if", + "nsubst-if-not", "nsubstitute", "nsubstitute-if", "nsubstitute-if-not", + "nth", "nthcdr", "null", "numberp", "numerator", "nunion", "oddp", + "open", "open-stream-p", "output-stream-p", "package-error-package", + "package-name", "package-nicknames", "packagep", + "package-shadowing-symbols", "package-used-by-list", "package-use-list", + "pairlis", "parse-integer", "parse-namestring", "pathname", + "pathname-device", "pathname-directory", "pathname-host", + "pathname-match-p", "pathname-name", "pathnamep", "pathname-type", + "pathname-version", "peek-char", "phase", "plusp", "position", + "position-if", "position-if-not", "pprint", "pprint-dispatch", + "pprint-fill", "pprint-indent", "pprint-linear", "pprint-newline", + "pprint-tab", "pprint-tabular", "prin1", "prin1-to-string", "princ", + "princ-to-string", "print", "print-object", "probe-file", "proclaim", + "provide", "random", "random-state-p", "rassoc", "rassoc-if", + "rassoc-if-not", "rational", "rationalize", "rationalp", "read", + "read-byte", "read-char", "read-char-no-hang", "read-delimited-list", + "read-from-string", "read-line", "read-preserving-whitespace", + "read-sequence", "readtable-case", "readtablep", "realp", "realpart", + "reduce", "reinitialize-instance", "rem", "remhash", "remove", + "remove-duplicates", "remove-if", "remove-if-not", "remove-method", + "remprop", "rename-file", "rename-package", "replace", "require", + "rest", "restart-name", "revappend", "reverse", "room", "round", + "row-major-aref", "rplaca", "rplacd", "sbit", "scale-float", "schar", + "search", "second", "set", "set-difference", + "set-dispatch-macro-character", "set-exclusive-or", + "set-macro-character", "set-pprint-dispatch", "set-syntax-from-char", + "seventh", "shadow", "shadowing-import", "shared-initialize", + "short-site-name", "signal", "signum", "simple-bit-vector-p", + "simple-condition-format-arguments", "simple-condition-format-control", + "simple-string-p", "simple-vector-p", "sin", "sinh", "sixth", "sleep", + "slot-boundp", "slot-exists-p", "slot-makunbound", "slot-missing", + "slot-unbound", "slot-value", "software-type", "software-version", + "some", "sort", "special-operator-p", "sqrt", "stable-sort", + "standard-char-p", "store-value", "stream-element-type", + "stream-error-stream", "stream-external-format", "streamp", "string", + "string<", "string<=", "string=", "string>", "string>=", "string/=", + "string-capitalize", "string-downcase", "string-equal", + "string-greaterp", "string-left-trim", "string-lessp", + "string-not-equal", "string-not-greaterp", "string-not-lessp", + "stringp", "string-right-trim", "string-trim", "string-upcase", + "sublis", "subseq", "subsetp", "subst", "subst-if", "subst-if-not", + "substitute", "substitute-if", "substitute-if-not", "subtypep", "svref", + "sxhash", "symbol-function", "symbol-name", "symbolp", "symbol-package", + "symbol-plist", "symbol-value", "synonym-stream-symbol", "syntax:", + "tailp", "tan", "tanh", "tenth", "terpri", "third", + "translate-logical-pathname", "translate-pathname", "tree-equal", + "truename", "truncate", "two-way-stream-input-stream", + "two-way-stream-output-stream", "type-error-datum", + "type-error-expected-type", "type-of", "typep", "unbound-slot-instance", + "unexport", "unintern", "union", "unread-char", "unuse-package", + "update-instance-for-different-class", + "update-instance-for-redefined-class", "upgraded-array-element-type", + "upgraded-complex-part-type", "upper-case-p", "use-package", + "user-homedir-pathname", "use-value", "values", "values-list", "vector", + "vectorp", "vector-pop", "vector-push", "vector-push-extend", "warn", + "wild-pathname-p", "write", "write-byte", "write-char", "write-line", + "write-sequence", "write-string", "write-to-string", "yes-or-no-p", + "y-or-n-p", "zerop", + } + + clSpecialForms = []string{ + "block", "catch", "declare", "eval-when", "flet", "function", "go", "if", + "labels", "lambda", "let", "let*", "load-time-value", "locally", "macrolet", + "multiple-value-call", "multiple-value-prog1", "progn", "progv", "quote", + "return-from", "setq", "symbol-macrolet", "tagbody", "the", "throw", + "unwind-protect", + } + + clMacros = []string{ + "and", "assert", "call-method", "case", "ccase", "check-type", "cond", + "ctypecase", "decf", "declaim", "defclass", "defconstant", "defgeneric", + "define-compiler-macro", "define-condition", "define-method-combination", + "define-modify-macro", "define-setf-expander", "define-symbol-macro", + "defmacro", "defmethod", "defpackage", "defparameter", "defsetf", + "defstruct", "deftype", "defun", "defvar", "destructuring-bind", "do", + "do*", "do-all-symbols", "do-external-symbols", "dolist", "do-symbols", + "dotimes", "ecase", "etypecase", "formatter", "handler-bind", + "handler-case", "ignore-errors", "incf", "in-package", "lambda", "loop", + "loop-finish", "make-method", "multiple-value-bind", "multiple-value-list", + "multiple-value-setq", "nth-value", "or", "pop", + "pprint-exit-if-list-exhausted", "pprint-logical-block", "pprint-pop", + "print-unreadable-object", "prog", "prog*", "prog1", "prog2", "psetf", + "psetq", "push", "pushnew", "remf", "restart-bind", "restart-case", + "return", "rotatef", "setf", "shiftf", "step", "time", "trace", "typecase", + "unless", "untrace", "when", "with-accessors", "with-compilation-unit", + "with-condition-restarts", "with-hash-table-iterator", + "with-input-from-string", "with-open-file", "with-open-stream", + "with-output-to-string", "with-package-iterator", "with-simple-restart", + "with-slots", "with-standard-io-syntax", + } + + clLambdaListKeywords = []string{ + "&allow-other-keys", "&aux", "&body", "&environment", "&key", "&optional", + "&rest", "&whole", + } + + clDeclarations = []string{ + "dynamic-extent", "ignore", "optimize", "ftype", "inline", "special", + "ignorable", "notinline", "type", + } + + clBuiltinTypes = []string{ + "atom", "boolean", "base-char", "base-string", "bignum", "bit", + "compiled-function", "extended-char", "fixnum", "keyword", "nil", + "signed-byte", "short-float", "single-float", "double-float", "long-float", + "simple-array", "simple-base-string", "simple-bit-vector", "simple-string", + "simple-vector", "standard-char", "unsigned-byte", + + // Condition Types + "arithmetic-error", "cell-error", "condition", "control-error", + "division-by-zero", "end-of-file", "error", "file-error", + "floating-point-inexact", "floating-point-overflow", + "floating-point-underflow", "floating-point-invalid-operation", + "parse-error", "package-error", "print-not-readable", "program-error", + "reader-error", "serious-condition", "simple-condition", "simple-error", + "simple-type-error", "simple-warning", "stream-error", "storage-condition", + "style-warning", "type-error", "unbound-variable", "unbound-slot", + "undefined-function", "warning", + } + + clBuiltinClasses = []string{ + "array", "broadcast-stream", "bit-vector", "built-in-class", "character", + "class", "complex", "concatenated-stream", "cons", "echo-stream", + "file-stream", "float", "function", "generic-function", "hash-table", + "integer", "list", "logical-pathname", "method-combination", "method", + "null", "number", "package", "pathname", "ratio", "rational", "readtable", + "real", "random-state", "restart", "sequence", "standard-class", + "standard-generic-function", "standard-method", "standard-object", + "string-stream", "stream", "string", "structure-class", "structure-object", + "symbol", "synonym-stream", "t", "two-way-stream", "vector", + } +) + // Common Lisp lexer. -var CommonLisp = internal.Register(MustNewLexer( +var CommonLisp = internal.Register(TypeRemappingLexer(MustNewLexer( &Config{ Name: "Common Lisp", Aliases: []string{"common-lisp", "cl", "lisp"}, @@ -71,4 +295,12 @@ var CommonLisp = internal.Register(MustNewLexer( {`\)`, Punctuation, Pop(1)}, }, }, -)) +), TypeMapping{ + {NameVariable, NameFunction, clBuiltinFunctions}, + {NameVariable, Keyword, clSpecialForms}, + {NameVariable, NameBuiltin, clMacros}, + {NameVariable, Keyword, clLambdaListKeywords}, + {NameVariable, Keyword, clDeclarations}, + {NameVariable, KeywordType, clBuiltinTypes}, + {NameVariable, NameClass, clBuiltinClasses}, +})) diff --git a/vendor/github.com/alecthomas/chroma/lexers/c/cpp.go b/vendor/github.com/alecthomas/chroma/lexers/c/cpp.go index cb53ee5e..104be240 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/c/cpp.go +++ b/vendor/github.com/alecthomas/chroma/lexers/c/cpp.go @@ -16,26 +16,28 @@ var CPP = internal.Register(MustNewLexer( }, Rules{ "statements": { - {Words(``, `\b`, `catch`, `const_cast`, `delete`, `dynamic_cast`, `explicit`, `export`, `friend`, `mutable`, `namespace`, `new`, `operator`, `private`, `protected`, `public`, `reinterpret_cast`, `restrict`, `static_cast`, `template`, `this`, `throw`, `throws`, `try`, `typeid`, `typename`, `using`, `virtual`, `constexpr`, `nullptr`, `decltype`, `thread_local`, `alignas`, `alignof`, `static_assert`, `noexcept`, `override`, `final`), Keyword, nil}, - {`char(16_t|32_t)\b`, KeywordType, nil}, - {`(class)\b`, ByGroups(Keyword, Text), Push("classname")}, + {Words(``, `\b`, `catch`, `const_cast`, `delete`, `dynamic_cast`, `explicit`, `export`, `friend`, `mutable`, `namespace`, `new`, `operator`, `private`, `protected`, `public`, `reinterpret_cast`, `restrict`, `static_cast`, `template`, `this`, `throw`, `throws`, `try`, `typeid`, `typename`, `using`, `virtual`, `constexpr`, `nullptr`, `decltype`, `thread_local`, `alignas`, `alignof`, `static_assert`, `noexcept`, `override`, `final`, `concept`, `requires`, `consteval`, `co_await`, `co_return`, `co_yield`), Keyword, nil}, + {`(enum)\b(\s+)(class)\b(\s*)`, ByGroups(Keyword, Text, Keyword, Text), Push("classname")}, + {`(class|struct|enum|union)\b(\s*)`, ByGroups(Keyword, Text), Push("classname")}, + {`\[\[.+\]\]`, NameAttribute, nil}, {`(R)(")([^\\()\s]{,16})(\()((?:.|\n)*?)(\)\3)(")`, ByGroups(LiteralStringAffix, LiteralString, LiteralStringDelimiter, LiteralStringDelimiter, LiteralString, LiteralStringDelimiter, LiteralString), nil}, {`(u8|u|U)(")`, ByGroups(LiteralStringAffix, LiteralString), Push("string")}, {`(L?)(")`, ByGroups(LiteralStringAffix, LiteralString), Push("string")}, {`(L?)(')(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,2}|[^\\\'\n])(')`, ByGroups(LiteralStringAffix, LiteralStringChar, LiteralStringChar, LiteralStringChar), nil}, {`(\d+\.\d*|\.\d+|\d+)[eE][+-]?\d+[LlUu]*`, LiteralNumberFloat, nil}, {`(\d+\.\d*|\.\d+|\d+[fF])[fF]?`, LiteralNumberFloat, nil}, - {`0x[0-9a-fA-F]+[LlUu]*`, LiteralNumberHex, nil}, - {`0[0-7]+[LlUu]*`, LiteralNumberOct, nil}, - {`\d+[LlUu]*`, LiteralNumberInteger, nil}, + {`0[xX]([0-9A-Fa-f]('?[0-9A-Fa-f]+)*)[LlUu]*`, LiteralNumberHex, nil}, + {`0('?[0-7]+)+[LlUu]*`, LiteralNumberOct, nil}, + {`0[Bb][01]('?[01]+)*[LlUu]*`, LiteralNumberBin, nil}, + {`[0-9]('?[0-9]+)*[LlUu]*`, LiteralNumberInteger, nil}, {`\*/`, Error, nil}, {`[~!%^&*+=|?:<>/-]`, Operator, nil}, {`[()\[\],.]`, Punctuation, nil}, {Words(``, `\b`, `asm`, `auto`, `break`, `case`, `const`, `continue`, `default`, `do`, `else`, `enum`, `extern`, `for`, `goto`, `if`, `register`, `restricted`, `return`, `sizeof`, `static`, `struct`, `switch`, `typedef`, `union`, `volatile`, `while`), Keyword, nil}, - {`(bool|int|long|float|short|double|char|unsigned|signed|void)\b`, KeywordType, nil}, + {`(bool|int|long|float|short|double|char((8|16|32)_t)?|wchar_t|unsigned|signed|void|u?int(_fast|_least|)(8|16|32|64)_t)\b`, KeywordType, nil}, {Words(``, `\b`, `inline`, `_inline`, `__inline`, `naked`, `restrict`, `thread`, `typename`), KeywordReserved, nil}, {`(__m(128i|128d|128|64))\b`, KeywordReserved, nil}, - {Words(`__`, `\b`, `asm`, `int8`, `based`, `except`, `int16`, `stdcall`, `cdecl`, `fastcall`, `int32`, `declspec`, `finally`, `int64`, `try`, `leave`, `wchar_t`, `w64`, `unaligned`, `raise`, `noop`, `identifier`, `forceinline`, `assume`), KeywordReserved, nil}, + {Words(`__`, `\b`, `asm`, `int8`, `based`, `except`, `int16`, `stdcall`, `cdecl`, `fastcall`, `int32`, `declspec`, `finally`, `int64`, `try`, `leave`, `w64`, `unaligned`, `raise`, `noop`, `identifier`, `forceinline`, `assume`), KeywordReserved, nil}, {`(true|false|NULL)\b`, NameBuiltin, nil}, {`([a-zA-Z_]\w*)(\s*)(:)(?!:)`, ByGroups(NameLabel, Text, Punctuation), nil}, {`[a-zA-Z_]\w*`, Name, nil}, @@ -49,8 +51,9 @@ var CPP = internal.Register(MustNewLexer( {`__(offload|blockingoffload|outer)\b`, KeywordPseudo, nil}, }, "classname": { + {`(\[\[.+\]\])(\s*)`, ByGroups(NameAttribute, Text), nil}, {`[a-zA-Z_]\w*`, NameClass, Pop(1)}, - {`\s*(?=>)`, Text, Pop(1)}, + {`\s*(?=[>{])`, Text, Pop(1)}, }, "whitespace": { {`^#if\s+0`, CommentPreproc, Push("if0")}, @@ -67,8 +70,8 @@ var CPP = internal.Register(MustNewLexer( "statement": { Include("whitespace"), Include("statements"), - {`[{}]`, Punctuation, nil}, - {`;`, Punctuation, Pop(1)}, + {`[{]`, Punctuation, Push("root")}, + {`[;}]`, Punctuation, Pop(1)}, }, "function": { Include("whitespace"), diff --git a/vendor/github.com/alecthomas/chroma/lexers/d/d.go b/vendor/github.com/alecthomas/chroma/lexers/d/d.go new file mode 100644 index 00000000..6f3f11f0 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/d/d.go @@ -0,0 +1,69 @@ +package d + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// D lexer. https://dlang.org/spec/lex.html +var D = internal.Register(MustNewLexer( + &Config{ + Name: "D", + Aliases: []string{"d"}, + Filenames: []string{"*.d", "*.di"}, + MimeTypes: []string{"text/x-d"}, + EnsureNL: true, + }, + Rules{ + "root": { + {`[^\S\n]+`, Text, nil}, + + // https://dlang.org/spec/lex.html#comment + {`//.*?\n`, CommentSingle, nil}, + {`/\*.*?\*/`, CommentMultiline, nil}, + {`/\+.*?\+/`, CommentMultiline, nil}, + + // https://dlang.org/spec/lex.html#keywords + {`(asm|assert|body|break|case|cast|catch|continue|default|debug|delete|deprecated|do|else|finally|for|foreach|foreach_reverse|goto|if|in|invariant|is|macro|mixin|new|out|pragma|return|super|switch|this|throw|try|version|while|with)\b`, Keyword, nil}, + {`__(FILE|FILE_FULL_PATH|MODULE|LINE|FUNCTION|PRETTY_FUNCTION|DATE|EOF|TIME|TIMESTAMP|VENDOR|VERSION)__\b`, NameBuiltin, nil}, + {`__(traits|vector|parameters)\b`, NameBuiltin, nil}, + {`((?:(?:[^\W\d]|\$)[\w.\[\]$<>]*\s+)+?)((?:[^\W\d]|\$)[\w$]*)(\s*)(\()`, ByGroups(UsingSelf("root"), NameFunction, Text, Operator), nil}, + + // https://dlang.org/spec/attribute.html#uda + {`@[\w.]*`, NameDecorator, nil}, + {`(abstract|auto|alias|align|const|delegate|enum|export|final|function|inout|lazy|nothrow|override|package|private|protected|public|pure|static|synchronized|template|volatile|__gshared)\b`, KeywordDeclaration, nil}, + + // https://dlang.org/spec/type.html#basic-data-types + {`(void|bool|byte|ubyte|short|ushort|int|uint|long|ulong|cent|ucent|float|double|real|ifloat|idouble|ireal|cfloat|cdouble|creal|char|wchar|dchar|string|wstring|dstring)\b`, KeywordType, nil}, + {`(module)(\s+)`, ByGroups(KeywordNamespace, Text), Push("import")}, + {`(true|false|null)\b`, KeywordConstant, nil}, + {`(class|interface|struct|template|union)(\s+)`, ByGroups(KeywordDeclaration, Text), Push("class")}, + {`(import)(\s+)`, ByGroups(KeywordNamespace, Text), Push("import")}, + + // https://dlang.org/spec/lex.html#string_literals + // TODO support delimited strings + {`[qr]?"(\\\\|\\"|[^"])*"[cwd]?`, LiteralString, nil}, + {"(`)([^`]*)(`)[cwd]?", LiteralString, nil}, + {`'\\.'|'[^\\]'|'\\u[0-9a-fA-F]{4}'`, LiteralStringChar, nil}, + {`(\.)((?:[^\W\d]|\$)[\w$]*)`, ByGroups(Operator, NameAttribute), nil}, + {`^\s*([^\W\d]|\$)[\w$]*:`, NameLabel, nil}, + + // https://dlang.org/spec/lex.html#floatliteral + {`([0-9][0-9_]*\.([0-9][0-9_]*)?|\.[0-9][0-9_]*)([eE][+\-]?[0-9][0-9_]*)?[fFL]?i?|[0-9][eE][+\-]?[0-9][0-9_]*[fFL]?|[0-9]([eE][+\-]?[0-9][0-9_]*)?[fFL]|0[xX]([0-9a-fA-F][0-9a-fA-F_]*\.?|([0-9a-fA-F][0-9a-fA-F_]*)?\.[0-9a-fA-F][0-9a-fA-F_]*)[pP][+\-]?[0-9][0-9_]*[fFL]?`, LiteralNumberFloat, nil}, + // https://dlang.org/spec/lex.html#integerliteral + {`0[xX][0-9a-fA-F][0-9a-fA-F_]*[lL]?`, LiteralNumberHex, nil}, + {`0[bB][01][01_]*[lL]?`, LiteralNumberBin, nil}, + {`0[0-7_]+[lL]?`, LiteralNumberOct, nil}, + {`0|[1-9][0-9_]*[lL]?`, LiteralNumberInteger, nil}, + {`([~^*!%&\[\](){}<>|+=:;,./?-]|q{)`, Operator, nil}, + {`([^\W\d]|\$)[\w$]*`, Name, nil}, + {`\n`, Text, nil}, + }, + "class": { + {`([^\W\d]|\$)[\w$]*`, NameClass, Pop(1)}, + }, + "import": { + {`[\w.]+\*?`, NameNamespace, Pop(1)}, + }, + }, +)) diff --git a/vendor/github.com/alecthomas/chroma/lexers/d/docker.go b/vendor/github.com/alecthomas/chroma/lexers/d/docker.go index 412646bc..a650eba5 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/d/docker.go +++ b/vendor/github.com/alecthomas/chroma/lexers/d/docker.go @@ -2,8 +2,9 @@ package d import ( . "github.com/alecthomas/chroma" // nolint - . "github.com/alecthomas/chroma/lexers/b" + "github.com/alecthomas/chroma/lexers/b" "github.com/alecthomas/chroma/lexers/internal" + "github.com/alecthomas/chroma/lexers/j" ) // Docker lexer. @@ -17,11 +18,14 @@ var Docker = internal.Register(MustNewLexer( }, Rules{ "root": { - {`^(ONBUILD)(\s+)((?:FROM|MAINTAINER|CMD|EXPOSE|ENV|ADD|ENTRYPOINT|VOLUME|WORKDIR))\b`, ByGroups(NameKeyword, TextWhitespace, Keyword), nil}, - {`^((?:FROM|MAINTAINER|CMD|EXPOSE|ENV|ADD|ENTRYPOINT|VOLUME|WORKDIR))\b(.*)`, ByGroups(Keyword, LiteralString), nil}, {`#.*`, Comment, nil}, - {`RUN`, Keyword, nil}, - {`(.*\\\n)*.+`, Using(Bash), nil}, + {`(ONBUILD)((?:\s*\\?\s*))`, ByGroups(Keyword, Using(b.Bash)), nil}, + {`(HEALTHCHECK)(((?:\s*\\?\s*)--\w+=\w+(?:\s*\\?\s*))*)`, ByGroups(Keyword, Using(b.Bash)), nil}, + {`(VOLUME|ENTRYPOINT|CMD|SHELL)((?:\s*\\?\s*))(\[.*?\])`, ByGroups(Keyword, Using(b.Bash), Using(j.JSON)), nil}, + {`(LABEL|ENV|ARG)((?:(?:\s*\\?\s*)\w+=\w+(?:\s*\\?\s*))*)`, ByGroups(Keyword, Using(b.Bash)), nil}, + {`((?:FROM|MAINTAINER|EXPOSE|WORKDIR|USER|STOPSIGNAL)|VOLUME)\b(.*)`, ByGroups(Keyword, LiteralString), nil}, + {`((?:RUN|CMD|ENTRYPOINT|ENV|ARG|LABEL|ADD|COPY))`, Keyword, nil}, + {`(.*\\\n)*.+`, Using(b.Bash), nil}, }, }, )) diff --git a/vendor/github.com/alecthomas/chroma/lexers/f/forth.go b/vendor/github.com/alecthomas/chroma/lexers/f/forth.go index 3fb3aa78..47de6365 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/f/forth.go +++ b/vendor/github.com/alecthomas/chroma/lexers/f/forth.go @@ -10,7 +10,7 @@ var Forth = internal.Register(MustNewLexer( &Config{ Name: "Forth", Aliases: []string{"forth"}, - Filenames: []string{"*.frt", "*.fs"}, + Filenames: []string{"*.frt", "*.fth", "*.fs"}, MimeTypes: []string{"application/x-forth"}, CaseInsensitive: true, }, diff --git a/vendor/github.com/alecthomas/chroma/lexers/h/haxe.go b/vendor/github.com/alecthomas/chroma/lexers/h/haxe.go index 9bdcfa58..59585431 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/h/haxe.go +++ b/vendor/github.com/alecthomas/chroma/lexers/h/haxe.go @@ -619,13 +619,14 @@ func haxePreProcMutator(state *LexerState) error { } proc := state.Groups[2] - if proc == "if" { + switch proc { + case "if": stack = append(stack, state.Stack) - } else if proc == "else" || proc == "elseif" { + case "else", "elseif": if len(stack) > 0 { state.Stack = stack[len(stack)-1] } - } else if proc == "end" { + case "end": stack = stack[:len(stack)-1] } diff --git a/vendor/github.com/alecthomas/chroma/lexers/h/hcl.go b/vendor/github.com/alecthomas/chroma/lexers/h/hcl.go new file mode 100644 index 00000000..ce7064b5 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/h/hcl.go @@ -0,0 +1,69 @@ +package h + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// HCL lexer. +var HCL = internal.Register(MustNewLexer( + &Config{ + Name: "HCL", + Aliases: []string{"hcl"}, + Filenames: []string{"*.hcl"}, + MimeTypes: []string{"application/x-hcl"}, + }, + Rules{ + "root": { + Include("string"), + Include("punctuation"), + Include("curly"), + Include("basic"), + Include("whitespace"), + {`[0-9]+`, LiteralNumber, nil}, + }, + "basic": { + {Words(`\b`, `\b`, `true`, `false`), KeywordType, nil}, + {`\s*/\*`, CommentMultiline, Push("comment")}, + {`\s*#.*\n`, CommentSingle, nil}, + {`(.*?)(\s*)(=)`, ByGroups(Name, Text, Operator), nil}, + {`\d+`, Number, nil}, + {`\b\w+\b`, Keyword, nil}, + {`\$\{`, LiteralStringInterpol, Push("var_builtin")}, + }, + "function": { + {`(\s+)(".*")(\s+)`, ByGroups(Text, LiteralString, Text), nil}, + Include("punctuation"), + Include("curly"), + }, + "var_builtin": { + {`\$\{`, LiteralStringInterpol, Push()}, + {Words(`\b`, `\b`, `concat`, `file`, `join`, `lookup`, `element`), NameBuiltin, nil}, + Include("string"), + Include("punctuation"), + {`\s+`, Text, nil}, + {`\}`, LiteralStringInterpol, Pop(1)}, + }, + "string": { + {`(".*")`, ByGroups(LiteralStringDouble), nil}, + }, + "punctuation": { + {`[\[\](),.]`, Punctuation, nil}, + }, + "curly": { + {`\{`, TextPunctuation, nil}, + {`\}`, TextPunctuation, nil}, + }, + "comment": { + {`[^*/]`, CommentMultiline, nil}, + {`/\*`, CommentMultiline, Push()}, + {`\*/`, CommentMultiline, Pop(1)}, + {`[*/]`, CommentMultiline, nil}, + }, + "whitespace": { + {`\n`, Text, nil}, + {`\s+`, Text, nil}, + {`\\\n`, Text, nil}, + }, + }, +)) diff --git a/vendor/github.com/alecthomas/chroma/lexers/h/http.go b/vendor/github.com/alecthomas/chroma/lexers/h/http.go index a50477b9..0a1264cf 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/h/http.go +++ b/vendor/github.com/alecthomas/chroma/lexers/h/http.go @@ -38,7 +38,6 @@ func httpContentBlock(groups []string, lexer Lexer) Iterator { {Generic, groups[0]}, } return Literator(tokens...) - } func httpHeaderBlock(groups []string, lexer Lexer) Iterator { @@ -66,7 +65,7 @@ func httpBodyContentTypeLexer(lexer Lexer) Lexer { return &httpBodyContentTyper{ type httpBodyContentTyper struct{ Lexer } -func (d *httpBodyContentTyper) Tokenise(options *TokeniseOptions, text string) (Iterator, error) { +func (d *httpBodyContentTyper) Tokenise(options *TokeniseOptions, text string) (Iterator, error) { // nolint: gocognit var contentType string var isContentType bool var subIterator Iterator @@ -123,9 +122,7 @@ func (d *httpBodyContentTyper) Tokenise(options *TokeniseOptions, text string) ( return EOF } } - } return token - }, nil } diff --git a/vendor/github.com/alecthomas/chroma/lexers/i/igor.go b/vendor/github.com/alecthomas/chroma/lexers/i/igor.go new file mode 100644 index 00000000..d704a4fb --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/i/igor.go @@ -0,0 +1,32 @@ +package i + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Igor lexer. +var Igor = internal.Register(MustNewLexer( + &Config{ + Name: "Igor", + Aliases: []string{"igor", "igorpro"}, + Filenames: []string{"*.ipf"}, + MimeTypes: []string{"text/ipf"}, + CaseInsensitive: true, + }, + Rules{ + "root": { + {`//.*$`, CommentSingle, nil}, + {`"([^"\\]|\\.)*"`, LiteralString, nil}, + {Words(`\b`, `\b`, `if`, `else`, `elseif`, `endif`, `for`, `endfor`, `strswitch`, `switch`, `case`, `default`, `endswitch`, `do`, `while`, `try`, `catch`, `endtry`, `break`, `continue`, `return`, `AbortOnRTE`, `AbortOnValue`), Keyword, nil}, + {Words(`\b`, `\b`, `variable`, `string`, `constant`, `strconstant`, `NVAR`, `SVAR`, `WAVE`, `STRUCT`, `dfref`, `funcref`, `char`, `uchar`, `int16`, `uint16`, `int32`, `uint32`, `int64`, `uint64`, `float`, `double`), KeywordType, nil}, + {Words(`\b`, `\b`, `override`, `ThreadSafe`, `MultiThread`, `static`, `Proc`, `Picture`, `Prompt`, `DoPrompt`, `macro`, `window`, `function`, `end`, `Structure`, `EndStructure`, `EndMacro`, `Menu`, `SubMenu`), KeywordReserved, nil}, + {Words(`\b`, `\b`, `Abort`, `AddFIFOData`, `AddFIFOVectData`, `AddMovieAudio`, `AddMovieFrame`, `AddWavesToBoxPlot`, `AddWavesToViolinPlot`, `AdoptFiles`, `APMath`, `Append`, `AppendBoxPlot`, `AppendImage`, `AppendLayoutObject`, `AppendMatrixContour`, `AppendText`, `AppendToGizmo`, `AppendToGraph`, `AppendToLayout`, `AppendToTable`, `AppendViolinPlot`, `AppendXYZContour`, `AutoPositionWindow`, `AxonTelegraphFindServers`, `BackgroundInfo`, `Beep`, `BoundingBall`, `BoxSmooth`, `BrowseURL`, `BuildMenu`, `Button`, `cd`, `Chart`, `CheckBox`, `CheckDisplayed`, `ChooseColor`, `Close`, `CloseHelp`, `CloseMovie`, `CloseProc`, `ColorScale`, `ColorTab2Wave`, `Concatenate`, `ControlBar`, `ControlInfo`, `ControlUpdate`, `ConvertGlobalStringTextEncoding`, `ConvexHull`, `Convolve`, `CopyDimLabels`, `CopyFile`, `CopyFolder`, `CopyScales`, `Correlate`, `CreateAliasShortcut`, `CreateBrowser`, `Cross`, `CtrlBackground`, `CtrlFIFO`, `CtrlNamedBackground`, `Cursor`, `CurveFit`, `CustomControl`, `CWT`, `DAQmx_AI_SetupReader`, `DAQmx_AO_SetOutputs`, `DAQmx_CTR_CountEdges`, `DAQmx_CTR_OutputPulse`, `DAQmx_CTR_Period`, `DAQmx_CTR_PulseWidth`, `DAQmx_DIO_Config`, `DAQmx_DIO_WriteNewData`, `DAQmx_Scan`, `DAQmx_WaveformGen`, `Debugger`, `DebuggerOptions`, `DefaultFont`, `DefaultGuiControls`, `DefaultGuiFont`, `DefaultTextEncoding`, `DefineGuide`, `DelayUpdate`, `DeleteAnnotations`, `DeleteFile`, `DeleteFolder`, `DeletePoints`, `Differentiate`, `dir`, `Display`, `DisplayHelpTopic`, `DisplayProcedure`, `DoAlert`, `DoIgorMenu`, `DoUpdate`, `DoWindow`, `DoXOPIdle`, `DPSS`, `DrawAction`, `DrawArc`, `DrawBezier`, `DrawLine`, `DrawOval`, `DrawPICT`, `DrawPoly`, `DrawRect`, `DrawRRect`, `DrawText`, `DrawUserShape`, `DSPDetrend`, `DSPPeriodogram`, `Duplicate`, `DuplicateDataFolder`, `DWT`, `EdgeStats`, `Edit`, `ErrorBars`, `EstimatePeakSizes`, `Execute`, `ExecuteScriptText`, `ExperimentInfo`, `ExperimentModified`, `ExportGizmo`, `Extract`, `FastGaussTransform`, `FastOp`, `FBinRead`, `FBinWrite`, `FFT`, `FGetPos`, `FIFOStatus`, `FIFO2Wave`, `FilterFIR`, `FilterIIR`, `FindAPeak`, `FindContour`, `FindDuplicates`, `FindLevel`, `FindLevels`, `FindPeak`, `FindPointsInPoly`, `FindRoots`, `FindSequence`, `FindValue`, `FMaxFlat`, `FPClustering`, `fprintf`, `FReadLine`, `FSetPos`, `FStatus`, `FTPCreateDirectory`, `FTPDelete`, `FTPDownload`, `FTPUpload`, `FuncFit`, `FuncFitMD`, `GBLoadWave`, `GetAxis`, `GetCamera`, `GetFileFolderInfo`, `GetGizmo`, `GetLastUserMenuInfo`, `GetMarquee`, `GetMouse`, `GetSelection`, `GetWindow`, `GISCreateVectorLayer`, `GISGetRasterInfo`, `GISGetRegisteredFileInfo`, `GISGetVectorLayerInfo`, `GISLoadRasterData`, `GISLoadVectorData`, `GISRasterizeVectorData`, `GISRegisterFile`, `GISTransformCoords`, `GISUnRegisterFile`, `GISWriteFieldData`, `GISWriteGeometryData`, `GISWriteRaster`, `GPIBReadBinaryWave2`, `GPIBReadBinary2`, `GPIBReadWave2`, `GPIBRead2`, `GPIBWriteBinaryWave2`, `GPIBWriteBinary2`, `GPIBWriteWave2`, `GPIBWrite2`, `GPIB2`, `GraphNormal`, `GraphWaveDraw`, `GraphWaveEdit`, `Grep`, `GroupBox`, `Hanning`, `HDFInfo`, `HDFReadImage`, `HDFReadSDS`, `HDFReadVset`, `HDF5CloseFile`, `HDF5CloseGroup`, `HDF5ConvertColors`, `HDF5CreateFile`, `HDF5CreateGroup`, `HDF5CreateLink`, `HDF5Dump`, `HDF5DumpErrors`, `HDF5DumpState`, `HDF5FlushFile`, `HDF5ListAttributes`, `HDF5ListGroup`, `HDF5LoadData`, `HDF5LoadGroup`, `HDF5LoadImage`, `HDF5OpenFile`, `HDF5OpenGroup`, `HDF5SaveData`, `HDF5SaveGroup`, `HDF5SaveImage`, `HDF5TestOperation`, `HDF5UnlinkObject`, `HideIgorMenus`, `HideInfo`, `HideProcedures`, `HideTools`, `HilbertTransform`, `Histogram`, `ICA`, `IFFT`, `ImageAnalyzeParticles`, `ImageBlend`, `ImageBoundaryToMask`, `ImageComposite`, `ImageEdgeDetection`, `ImageFileInfo`, `ImageFilter`, `ImageFocus`, `ImageFromXYZ`, `ImageGenerateROIMask`, `ImageGLCM`, `ImageHistModification`, `ImageHistogram`, `ImageInterpolate`, `ImageLineProfile`, `ImageLoad`, `ImageMorphology`, `ImageRegistration`, `ImageRemoveBackground`, `ImageRestore`, `ImageRotate`, `ImageSave`, `ImageSeedFill`, `ImageSkeleton3d`, `ImageSnake`, `ImageStats`, `ImageThreshold`, `ImageTransform`, `ImageUnwrapPhase`, `ImageWindow`, `IndexSort`, `InsertPoints`, `Integrate`, `IntegrateODE`, `Integrate2D`, `Interpolate2`, `Interpolate3D`, `Interp3DPath`, `ITCCloseAll2`, `ITCCloseDevice2`, `ITCConfigAllChannels2`, `ITCConfigChannelReset2`, `ITCConfigChannelUpload2`, `ITCConfigChannel2`, `ITCFIFOAvailableAll2`, `ITCFIFOAvailable2`, `ITCGetAllChannelsConfig2`, `ITCGetChannelConfig2`, `ITCGetCurrentDevice2`, `ITCGetDeviceInfo2`, `ITCGetDevices2`, `ITCGetErrorString2`, `ITCGetSerialNumber2`, `ITCGetState2`, `ITCGetVersions2`, `ITCInitialize2`, `ITCOpenDevice2`, `ITCReadADC2`, `ITCReadDigital2`, `ITCReadTimer2`, `ITCSelectDevice2`, `ITCSetDAC2`, `ITCSetGlobals2`, `ITCSetModes2`, `ITCSetState2`, `ITCStartAcq2`, `ITCStopAcq2`, `ITCUpdateFIFOPositionAll2`, `ITCUpdateFIFOPosition2`, `ITCWriteDigital2`, `JCAMPLoadWave`, `JointHistogram`, `KillBackground`, `KillControl`, `KillDataFolder`, `KillFIFO`, `KillFreeAxis`, `KillPath`, `KillPICTs`, `KillStrings`, `KillVariables`, `KillWaves`, `KillWindow`, `KMeans`, `Label`, `Layout`, `LayoutPageAction`, `LayoutSlideShow`, `Legend`, `LinearFeedbackShiftRegister`, `ListBox`, `LoadData`, `LoadPackagePreferences`, `LoadPICT`, `LoadWave`, `Loess`, `LombPeriodogram`, `Make`, `MakeIndex`, `MarkPerfTestTime`, `MatrixConvolve`, `MatrixCorr`, `MatrixEigenV`, `MatrixFilter`, `MatrixGaussJ`, `MatrixGLM`, `MatrixInverse`, `MatrixLinearSolve`, `MatrixLinearSolveTD`, `MatrixLLS`, `MatrixLUBkSub`, `MatrixLUD`, `MatrixLUDTD`, `MatrixMultiply`, `MatrixOP`, `MatrixSchur`, `MatrixSolve`, `MatrixSVBkSub`, `MatrixSVD`, `MatrixTranspose`, `MCC_FindServers`, `MeasureStyledText`, `MFR_CheckForNewBricklets`, `MFR_CloseResultFile`, `MFR_CreateOverviewTable`, `MFR_GetBrickletCount`, `MFR_GetBrickletData`, `MFR_GetBrickletDeployData`, `MFR_GetBrickletMetaData`, `MFR_GetBrickletRawData`, `MFR_GetReportTemplate`, `MFR_GetResultFileMetaData`, `MFR_GetResultFileName`, `MFR_GetVernissageVersion`, `MFR_GetVersion`, `MFR_GetXOPErrorMessage`, `MFR_OpenResultFile`, `MLLoadWave`, `Modify`, `ModifyBoxPlot`, `ModifyBrowser`, `ModifyCamera`, `ModifyContour`, `ModifyControl`, `ModifyControlList`, `ModifyFreeAxis`, `ModifyGizmo`, `ModifyGraph`, `ModifyImage`, `ModifyLayout`, `ModifyPanel`, `ModifyTable`, `ModifyViolinPlot`, `ModifyWaterfall`, `MoveDataFolder`, `MoveFile`, `MoveFolder`, `MoveString`, `MoveSubwindow`, `MoveVariable`, `MoveWave`, `MoveWindow`, `MultiTaperPSD`, `MultiThreadingControl`, `NC_CloseFile`, `NC_DumpErrors`, `NC_Inquire`, `NC_ListAttributes`, `NC_ListObjects`, `NC_LoadData`, `NC_OpenFile`, `NeuralNetworkRun`, `NeuralNetworkTrain`, `NewCamera`, `NewDataFolder`, `NewFIFO`, `NewFIFOChan`, `NewFreeAxis`, `NewGizmo`, `NewImage`, `NewLayout`, `NewMovie`, `NewNotebook`, `NewPanel`, `NewPath`, `NewWaterfall`, `NILoadWave`, `NI4882`, `Note`, `Notebook`, `NotebookAction`, `Open`, `OpenHelp`, `OpenNotebook`, `Optimize`, `ParseOperationTemplate`, `PathInfo`, `PauseForUser`, `PauseUpdate`, `PCA`, `PlayMovie`, `PlayMovieAction`, `PlaySound`, `PopupContextualMenu`, `PopupMenu`, `Preferences`, `PrimeFactors`, `Print`, `printf`, `PrintGraphs`, `PrintLayout`, `PrintNotebook`, `PrintSettings`, `PrintTable`, `Project`, `PulseStats`, `PutScrapText`, `pwd`, `Quit`, `RatioFromNumber`, `Redimension`, `Remez`, `Remove`, `RemoveContour`, `RemoveFromGizmo`, `RemoveFromGraph`, `RemoveFromLayout`, `RemoveFromTable`, `RemoveImage`, `RemoveLayoutObjects`, `RemovePath`, `Rename`, `RenameDataFolder`, `RenamePath`, `RenamePICT`, `RenameWindow`, `ReorderImages`, `ReorderTraces`, `ReplaceText`, `ReplaceWave`, `Resample`, `ResumeUpdate`, `Reverse`, `Rotate`, `Save`, `SaveData`, `SaveExperiment`, `SaveGizmoCopy`, `SaveGraphCopy`, `SaveNotebook`, `SavePackagePreferences`, `SavePICT`, `SaveTableCopy`, `SetActiveSubwindow`, `SetAxis`, `SetBackground`, `SetDashPattern`, `SetDataFolder`, `SetDimLabel`, `SetDrawEnv`, `SetDrawLayer`, `SetFileFolderInfo`, `SetFormula`, `SetIdlePeriod`, `SetIgorHook`, `SetIgorMenuMode`, `SetIgorOption`, `SetMarquee`, `SetProcessSleep`, `SetRandomSeed`, `SetScale`, `SetVariable`, `SetWaveLock`, `SetWaveTextEncoding`, `SetWindow`, `ShowIgorMenus`, `ShowInfo`, `ShowTools`, `Silent`, `Sleep`, `Slider`, `Smooth`, `SmoothCustom`, `Sort`, `SortColumns`, `SoundInRecord`, `SoundInSet`, `SoundInStartChart`, `SoundInStatus`, `SoundInStopChart`, `SoundLoadWave`, `SoundSaveWave`, `SphericalInterpolate`, `SphericalTriangulate`, `SplitString`, `SplitWave`, `sprintf`, `SQLHighLevelOp`, `sscanf`, `Stack`, `StackWindows`, `StatsAngularDistanceTest`, `StatsANOVA1Test`, `StatsANOVA2NRTest`, `StatsANOVA2RMTest`, `StatsANOVA2Test`, `StatsChiTest`, `StatsCircularCorrelationTest`, `StatsCircularMeans`, `StatsCircularMoments`, `StatsCircularTwoSampleTest`, `StatsCochranTest`, `StatsContingencyTable`, `StatsDIPTest`, `StatsDunnettTest`, `StatsFriedmanTest`, `StatsFTest`, `StatsHodgesAjneTest`, `StatsJBTest`, `StatsKDE`, `StatsKendallTauTest`, `StatsKSTest`, `StatsKWTest`, `StatsLinearCorrelationTest`, `StatsLinearRegression`, `StatsMultiCorrelationTest`, `StatsNPMCTest`, `StatsNPNominalSRTest`, `StatsQuantiles`, `StatsRankCorrelationTest`, `StatsResample`, `StatsSample`, `StatsScheffeTest`, `StatsShapiroWilkTest`, `StatsSignTest`, `StatsSRTest`, `StatsTTest`, `StatsTukeyTest`, `StatsVariancesTest`, `StatsWatsonUSquaredTest`, `StatsWatsonWilliamsTest`, `StatsWheelerWatsonTest`, `StatsWilcoxonRankTest`, `StatsWRCorrelationTest`, `STFT`, `String`, `StructFill`, `StructGet`, `StructPut`, `SumDimension`, `SumSeries`, `TabControl`, `Tag`, `TDMLoadData`, `TDMSaveData`, `TextBox`, `ThreadGroupPutDF`, `ThreadStart`, `TickWavesFromAxis`, `Tile`, `TileWindows`, `TitleBox`, `ToCommandLine`, `ToolsGrid`, `Triangulate3d`, `Unwrap`, `URLRequest`, `ValDisplay`, `Variable`, `VDTClosePort2`, `VDTGetPortList2`, `VDTGetStatus2`, `VDTOpenPort2`, `VDTOperationsPort2`, `VDTReadBinaryWave2`, `VDTReadBinary2`, `VDTReadHexWave2`, `VDTReadHex2`, `VDTReadWave2`, `VDTRead2`, `VDTTerminalPort2`, `VDTWriteBinaryWave2`, `VDTWriteBinary2`, `VDTWriteHexWave2`, `VDTWriteHex2`, `VDTWriteWave2`, `VDTWrite2`, `VDT2`, `VISAControl`, `VISARead`, `VISAReadBinary`, `VISAReadBinaryWave`, `VISAReadWave`, `VISAWrite`, `VISAWriteBinary`, `VISAWriteBinaryWave`, `VISAWriteWave`, `WaveMeanStdv`, `WaveStats`, `WaveTransform`, `wfprintf`, `WignerTransform`, `WindowFunction`, `XLLoadWave`), NameClass, nil}, + {Words(`\b`, `\b`, `abs`, `acos`, `acosh`, `AddListItem`, `AiryA`, `AiryAD`, `AiryB`, `AiryBD`, `alog`, `AnnotationInfo`, `AnnotationList`, `area`, `areaXY`, `asin`, `asinh`, `atan`, `atanh`, `atan2`, `AxisInfo`, `AxisList`, `AxisValFromPixel`, `AxonTelegraphAGetDataNum`, `AxonTelegraphAGetDataString`, `AxonTelegraphAGetDataStruct`, `AxonTelegraphGetDataNum`, `AxonTelegraphGetDataString`, `AxonTelegraphGetDataStruct`, `AxonTelegraphGetTimeoutMs`, `AxonTelegraphSetTimeoutMs`, `Base64Decode`, `Base64Encode`, `Besseli`, `Besselj`, `Besselk`, `Bessely`, `beta`, `betai`, `BinarySearch`, `BinarySearchInterp`, `binomial`, `binomialln`, `binomialNoise`, `cabs`, `CaptureHistory`, `CaptureHistoryStart`, `ceil`, `cequal`, `char2num`, `chebyshev`, `chebyshevU`, `CheckName`, `ChildWindowList`, `CleanupName`, `cmplx`, `cmpstr`, `conj`, `ContourInfo`, `ContourNameList`, `ContourNameToWaveRef`, `ContourZ`, `ControlNameList`, `ConvertTextEncoding`, `cos`, `cosh`, `cosIntegral`, `cot`, `coth`, `CountObjects`, `CountObjectsDFR`, `cpowi`, `CreationDate`, `csc`, `csch`, `CsrInfo`, `CsrWave`, `CsrWaveRef`, `CsrXWave`, `CsrXWaveRef`, `CTabList`, `DataFolderDir`, `DataFolderExists`, `DataFolderRefsEqual`, `DataFolderRefStatus`, `date`, `datetime`, `DateToJulian`, `date2secs`, `Dawson`, `defined`, `deltax`, `digamma`, `dilogarithm`, `DimDelta`, `DimOffset`, `DimSize`, `ei`, `enoise`, `equalWaves`, `erf`, `erfc`, `erfcw`, `exists`, `exp`, `expInt`, `expIntegralE1`, `expNoise`, `factorial`, `Faddeeva`, `fakedata`, `faverage`, `faverageXY`, `fDAQmx_AI_GetReader`, `fDAQmx_AO_UpdateOutputs`, `fDAQmx_ConnectTerminals`, `fDAQmx_CTR_Finished`, `fDAQmx_CTR_IsFinished`, `fDAQmx_CTR_IsPulseFinished`, `fDAQmx_CTR_ReadCounter`, `fDAQmx_CTR_ReadWithOptions`, `fDAQmx_CTR_SetPulseFrequency`, `fDAQmx_CTR_Start`, `fDAQmx_DeviceNames`, `fDAQmx_DIO_Finished`, `fDAQmx_DIO_PortWidth`, `fDAQmx_DIO_Read`, `fDAQmx_DIO_Write`, `fDAQmx_DisconnectTerminals`, `fDAQmx_ErrorString`, `fDAQmx_ExternalCalDate`, `fDAQmx_NumAnalogInputs`, `fDAQmx_NumAnalogOutputs`, `fDAQmx_NumCounters`, `fDAQmx_NumDIOPorts`, `fDAQmx_ReadChan`, `fDAQmx_ReadNamedChan`, `fDAQmx_ResetDevice`, `fDAQmx_ScanGetAvailable`, `fDAQmx_ScanGetNextIndex`, `fDAQmx_ScanStart`, `fDAQmx_ScanStop`, `fDAQmx_ScanWait`, `fDAQmx_ScanWaitWithTimeout`, `fDAQmx_SelfCalDate`, `fDAQmx_SelfCalibration`, `fDAQmx_WaveformStart`, `fDAQmx_WaveformStop`, `fDAQmx_WF_IsFinished`, `fDAQmx_WF_WaitUntilFinished`, `fDAQmx_WriteChan`, `FetchURL`, `FindDimLabel`, `FindListItem`, `floor`, `FontList`, `FontSizeHeight`, `FontSizeStringWidth`, `FresnelCos`, `FresnelSin`, `FuncRefInfo`, `FunctionInfo`, `FunctionList`, `FunctionPath`, `gamma`, `gammaEuler`, `gammaInc`, `gammaNoise`, `gammln`, `gammp`, `gammq`, `Gauss`, `Gauss1D`, `Gauss2D`, `gcd`, `GetBrowserLine`, `GetBrowserSelection`, `GetDataFolder`, `GetDataFolderDFR`, `GetDefaultFont`, `GetDefaultFontSize`, `GetDefaultFontStyle`, `GetDimLabel`, `GetEnvironmentVariable`, `GetErrMessage`, `GetFormula`, `GetIndependentModuleName`, `GetIndexedObjName`, `GetIndexedObjNameDFR`, `GetKeyState`, `GetRTErrMessage`, `GetRTError`, `GetRTLocation`, `GetRTLocInfo`, `GetRTStackInfo`, `GetScrapText`, `GetUserData`, `GetWavesDataFolder`, `GetWavesDataFolderDFR`, `GISGetAllFileFormats`, `GISSRefsAreEqual`, `GizmoInfo`, `GizmoScale`, `gnoise`, `GrepList`, `GrepString`, `GuideInfo`, `GuideNameList`, `Hash`, `hcsr`, `HDF5AttributeInfo`, `HDF5DatasetInfo`, `HDF5LibraryInfo`, `HDF5TypeInfo`, `hermite`, `hermiteGauss`, `HyperGNoise`, `HyperGPFQ`, `HyperG0F1`, `HyperG1F1`, `HyperG2F1`, `IgorInfo`, `IgorVersion`, `imag`, `ImageInfo`, `ImageNameList`, `ImageNameToWaveRef`, `IndependentModuleList`, `IndexedDir`, `IndexedFile`, `IndexToScale`, `Inf`, `Integrate1D`, `interp`, `Interp2D`, `Interp3D`, `inverseERF`, `inverseERFC`, `ItemsInList`, `JacobiCn`, `JacobiSn`, `JulianToDate`, `Laguerre`, `LaguerreA`, `LaguerreGauss`, `LambertW`, `LayoutInfo`, `leftx`, `LegendreA`, `limit`, `ListMatch`, `ListToTextWave`, `ListToWaveRefWave`, `ln`, `log`, `logNormalNoise`, `lorentzianNoise`, `LowerStr`, `MacroList`, `magsqr`, `MandelbrotPoint`, `MarcumQ`, `MatrixCondition`, `MatrixDet`, `MatrixDot`, `MatrixRank`, `MatrixTrace`, `max`, `MCC_AutoBridgeBal`, `MCC_AutoFastComp`, `MCC_AutoPipetteOffset`, `MCC_AutoSlowComp`, `MCC_AutoWholeCellComp`, `MCC_GetBridgeBalEnable`, `MCC_GetBridgeBalResist`, `MCC_GetFastCompCap`, `MCC_GetFastCompTau`, `MCC_GetHolding`, `MCC_GetHoldingEnable`, `MCC_GetMode`, `MCC_GetNeutralizationCap`, `MCC_GetNeutralizationEnable`, `MCC_GetOscKillerEnable`, `MCC_GetPipetteOffset`, `MCC_GetPrimarySignalGain`, `MCC_GetPrimarySignalHPF`, `MCC_GetPrimarySignalLPF`, `MCC_GetRsCompBandwidth`, `MCC_GetRsCompCorrection`, `MCC_GetRsCompEnable`, `MCC_GetRsCompPrediction`, `MCC_GetSecondarySignalGain`, `MCC_GetSecondarySignalLPF`, `MCC_GetSlowCompCap`, `MCC_GetSlowCompTau`, `MCC_GetSlowCompTauX20Enable`, `MCC_GetSlowCurrentInjEnable`, `MCC_GetSlowCurrentInjLevel`, `MCC_GetSlowCurrentInjSetlTime`, `MCC_GetWholeCellCompCap`, `MCC_GetWholeCellCompEnable`, `MCC_GetWholeCellCompResist`, `MCC_SelectMultiClamp700B`, `MCC_SetBridgeBalEnable`, `MCC_SetBridgeBalResist`, `MCC_SetFastCompCap`, `MCC_SetFastCompTau`, `MCC_SetHolding`, `MCC_SetHoldingEnable`, `MCC_SetMode`, `MCC_SetNeutralizationCap`, `MCC_SetNeutralizationEnable`, `MCC_SetOscKillerEnable`, `MCC_SetPipetteOffset`, `MCC_SetPrimarySignalGain`, `MCC_SetPrimarySignalHPF`, `MCC_SetPrimarySignalLPF`, `MCC_SetRsCompBandwidth`, `MCC_SetRsCompCorrection`, `MCC_SetRsCompEnable`, `MCC_SetRsCompPrediction`, `MCC_SetSecondarySignalGain`, `MCC_SetSecondarySignalLPF`, `MCC_SetSlowCompCap`, `MCC_SetSlowCompTau`, `MCC_SetSlowCompTauX20Enable`, `MCC_SetSlowCurrentInjEnable`, `MCC_SetSlowCurrentInjLevel`, `MCC_SetSlowCurrentInjSetlTime`, `MCC_SetTimeoutMs`, `MCC_SetWholeCellCompCap`, `MCC_SetWholeCellCompEnable`, `MCC_SetWholeCellCompResist`, `mean`, `median`, `min`, `mod`, `ModDate`, `MPFXEMGPeak`, `MPFXExpConvExpPeak`, `MPFXGaussPeak`, `MPFXLorenzianPeak`, `MPFXVoigtPeak`, `NameOfWave`, `NaN`, `NewFreeDataFolder`, `NewFreeWave`, `norm`, `NormalizeUnicode`, `note`, `NumberByKey`, `numpnts`, `numtype`, `NumVarOrDefault`, `num2char`, `num2istr`, `num2str`, `NVAR_Exists`, `OperationList`, `PadString`, `PanelResolution`, `ParamIsDefault`, `ParseFilePath`, `PathList`, `pcsr`, `Pi`, `PICTInfo`, `PICTList`, `PixelFromAxisVal`, `pnt2x`, `poissonNoise`, `poly`, `PolygonArea`, `poly2D`, `PossiblyQuoteName`, `ProcedureText`, `p2rect`, `qcsr`, `real`, `RemoveByKey`, `RemoveEnding`, `RemoveFromList`, `RemoveListItem`, `ReplaceNumberByKey`, `ReplaceString`, `ReplaceStringByKey`, `rightx`, `round`, `r2polar`, `sawtooth`, `scaleToIndex`, `ScreenResolution`, `sec`, `sech`, `Secs2Date`, `Secs2Time`, `SelectNumber`, `SelectString`, `SetEnvironmentVariable`, `sign`, `sin`, `sinc`, `sinh`, `sinIntegral`, `SortList`, `SpecialCharacterInfo`, `SpecialCharacterList`, `SpecialDirPath`, `SphericalBessJ`, `SphericalBessJD`, `SphericalBessY`, `SphericalBessYD`, `SphericalHarmonics`, `SQLAllocHandle`, `SQLAllocStmt`, `SQLBinaryWavesToTextWave`, `SQLBindCol`, `SQLBindParameter`, `SQLBrowseConnect`, `SQLBulkOperations`, `SQLCancel`, `SQLCloseCursor`, `SQLColAttributeNum`, `SQLColAttributeStr`, `SQLColumnPrivileges`, `SQLColumns`, `SQLConnect`, `SQLDataSources`, `SQLDescribeCol`, `SQLDescribeParam`, `SQLDisconnect`, `SQLDriverConnect`, `SQLDrivers`, `SQLEndTran`, `SQLError`, `SQLExecDirect`, `SQLExecute`, `SQLFetch`, `SQLFetchScroll`, `SQLForeignKeys`, `SQLFreeConnect`, `SQLFreeEnv`, `SQLFreeHandle`, `SQLFreeStmt`, `SQLGetConnectAttrNum`, `SQLGetConnectAttrStr`, `SQLGetCursorName`, `SQLGetDataNum`, `SQLGetDataStr`, `SQLGetDescFieldNum`, `SQLGetDescFieldStr`, `SQLGetDescRec`, `SQLGetDiagFieldNum`, `SQLGetDiagFieldStr`, `SQLGetDiagRec`, `SQLGetEnvAttrNum`, `SQLGetEnvAttrStr`, `SQLGetFunctions`, `SQLGetInfoNum`, `SQLGetInfoStr`, `SQLGetStmtAttrNum`, `SQLGetStmtAttrStr`, `SQLGetTypeInfo`, `SQLMoreResults`, `SQLNativeSql`, `SQLNumParams`, `SQLNumResultCols`, `SQLNumResultRowsIfKnown`, `SQLNumRowsFetched`, `SQLParamData`, `SQLPrepare`, `SQLPrimaryKeys`, `SQLProcedureColumns`, `SQLProcedures`, `SQLPutData`, `SQLReinitialize`, `SQLRowCount`, `SQLSetConnectAttrNum`, `SQLSetConnectAttrStr`, `SQLSetCursorName`, `SQLSetDescFieldNum`, `SQLSetDescFieldStr`, `SQLSetDescRec`, `SQLSetEnvAttrNum`, `SQLSetEnvAttrStr`, `SQLSetPos`, `SQLSetStmtAttrNum`, `SQLSetStmtAttrStr`, `SQLSpecialColumns`, `SQLStatistics`, `SQLTablePrivileges`, `SQLTables`, `SQLTextWaveToBinaryWaves`, `SQLTextWaveTo2DBinaryWave`, `SQLUpdateBoundValues`, `SQLXOPCheckState`, `SQL2DBinaryWaveToTextWave`, `sqrt`, `StartMSTimer`, `StatsBetaCDF`, `StatsBetaPDF`, `StatsBinomialCDF`, `StatsBinomialPDF`, `StatsCauchyCDF`, `StatsCauchyPDF`, `StatsChiCDF`, `StatsChiPDF`, `StatsCMSSDCDF`, `StatsCorrelation`, `StatsDExpCDF`, `StatsDExpPDF`, `StatsErlangCDF`, `StatsErlangPDF`, `StatsErrorPDF`, `StatsEValueCDF`, `StatsEValuePDF`, `StatsExpCDF`, `StatsExpPDF`, `StatsFCDF`, `StatsFPDF`, `StatsFriedmanCDF`, `StatsGammaCDF`, `StatsGammaPDF`, `StatsGeometricCDF`, `StatsGeometricPDF`, `StatsGEVCDF`, `StatsGEVPDF`, `StatsHyperGCDF`, `StatsHyperGPDF`, `StatsInvBetaCDF`, `StatsInvBinomialCDF`, `StatsInvCauchyCDF`, `StatsInvChiCDF`, `StatsInvCMSSDCDF`, `StatsInvDExpCDF`, `StatsInvEValueCDF`, `StatsInvExpCDF`, `StatsInvFCDF`, `StatsInvFriedmanCDF`, `StatsInvGammaCDF`, `StatsInvGeometricCDF`, `StatsInvKuiperCDF`, `StatsInvLogisticCDF`, `StatsInvLogNormalCDF`, `StatsInvMaxwellCDF`, `StatsInvMooreCDF`, `StatsInvNBinomialCDF`, `StatsInvNCChiCDF`, `StatsInvNCFCDF`, `StatsInvNormalCDF`, `StatsInvParetoCDF`, `StatsInvPoissonCDF`, `StatsInvPowerCDF`, `StatsInvQCDF`, `StatsInvQpCDF`, `StatsInvRayleighCDF`, `StatsInvRectangularCDF`, `StatsInvSpearmanCDF`, `StatsInvStudentCDF`, `StatsInvTopDownCDF`, `StatsInvTriangularCDF`, `StatsInvUsquaredCDF`, `StatsInvVonMisesCDF`, `StatsInvWeibullCDF`, `StatsKuiperCDF`, `StatsLogisticCDF`, `StatsLogisticPDF`, `StatsLogNormalCDF`, `StatsLogNormalPDF`, `StatsMaxwellCDF`, `StatsMaxwellPDF`, `StatsMedian`, `StatsMooreCDF`, `StatsNBinomialCDF`, `StatsNBinomialPDF`, `StatsNCChiCDF`, `StatsNCChiPDF`, `StatsNCFCDF`, `StatsNCFPDF`, `StatsNCTCDF`, `StatsNCTPDF`, `StatsNormalCDF`, `StatsNormalPDF`, `StatsParetoCDF`, `StatsParetoPDF`, `StatsPermute`, `StatsPoissonCDF`, `StatsPoissonPDF`, `StatsPowerCDF`, `StatsPowerNoise`, `StatsPowerPDF`, `StatsQCDF`, `StatsQpCDF`, `StatsRayleighCDF`, `StatsRayleighPDF`, `StatsRectangularCDF`, `StatsRectangularPDF`, `StatsRunsCDF`, `StatsSpearmanRhoCDF`, `StatsStudentCDF`, `StatsStudentPDF`, `StatsTopDownCDF`, `StatsTriangularCDF`, `StatsTriangularPDF`, `StatsTrimmedMean`, `StatsUSquaredCDF`, `StatsVonMisesCDF`, `StatsVonMisesNoise`, `StatsVonMisesPDF`, `StatsWaldCDF`, `StatsWaldPDF`, `StatsWeibullCDF`, `StatsWeibullPDF`, `StopMSTimer`, `StringByKey`, `stringCRC`, `StringFromList`, `StringList`, `stringmatch`, `strlen`, `strsearch`, `StrVarOrDefault`, `str2num`, `StudentA`, `StudentT`, `sum`, `SVAR_Exists`, `TableInfo`, `TagVal`, `TagWaveRef`, `tan`, `tango_close_device`, `tango_command_inout`, `tango_compute_image_proj`, `tango_get_dev_attr_list`, `tango_get_dev_black_box`, `tango_get_dev_cmd_list`, `tango_get_dev_status`, `tango_get_dev_timeout`, `tango_get_error_stack`, `tango_open_device`, `tango_ping_device`, `tango_read_attribute`, `tango_read_attributes`, `tango_reload_dev_interface`, `tango_resume_attr_monitor`, `tango_set_attr_monitor_period`, `tango_set_dev_timeout`, `tango_start_attr_monitor`, `tango_stop_attr_monitor`, `tango_suspend_attr_monitor`, `tango_write_attribute`, `tango_write_attributes`, `tanh`, `TDMAddChannel`, `TDMAddGroup`, `TDMAppendDataValues`, `TDMAppendDataValuesTime`, `TDMChannelPropertyExists`, `TDMCloseChannel`, `TDMCloseFile`, `TDMCloseGroup`, `TDMCreateChannelProperty`, `TDMCreateFile`, `TDMCreateFileProperty`, `TDMCreateGroupProperty`, `TDMFilePropertyExists`, `TDMGetChannelPropertyNames`, `TDMGetChannelPropertyNum`, `TDMGetChannelPropertyStr`, `TDMGetChannelPropertyTime`, `TDMGetChannelPropertyType`, `TDMGetChannels`, `TDMGetChannelStringPropertyLen`, `TDMGetDataType`, `TDMGetDataValues`, `TDMGetDataValuesTime`, `TDMGetFilePropertyNames`, `TDMGetFilePropertyNum`, `TDMGetFilePropertyStr`, `TDMGetFilePropertyTime`, `TDMGetFilePropertyType`, `TDMGetFileStringPropertyLen`, `TDMGetGroupPropertyNames`, `TDMGetGroupPropertyNum`, `TDMGetGroupPropertyStr`, `TDMGetGroupPropertyTime`, `TDMGetGroupPropertyType`, `TDMGetGroups`, `TDMGetGroupStringPropertyLen`, `TDMGetLibraryErrorDescription`, `TDMGetNumChannelProperties`, `TDMGetNumChannels`, `TDMGetNumDataValues`, `TDMGetNumFileProperties`, `TDMGetNumGroupProperties`, `TDMGetNumGroups`, `TDMGroupPropertyExists`, `TDMOpenFile`, `TDMOpenFileEx`, `TDMRemoveChannel`, `TDMRemoveGroup`, `TDMReplaceDataValues`, `TDMReplaceDataValuesTime`, `TDMSaveFile`, `TDMSetChannelPropertyNum`, `TDMSetChannelPropertyStr`, `TDMSetChannelPropertyTime`, `TDMSetDataValues`, `TDMSetDataValuesTime`, `TDMSetFilePropertyNum`, `TDMSetFilePropertyStr`, `TDMSetFilePropertyTime`, `TDMSetGroupPropertyNum`, `TDMSetGroupPropertyStr`, `TDMSetGroupPropertyTime`, `TextEncodingCode`, `TextEncodingName`, `TextFile`, `ThreadGroupCreate`, `ThreadGroupGetDF`, `ThreadGroupGetDFR`, `ThreadGroupRelease`, `ThreadGroupWait`, `ThreadProcessorCount`, `ThreadReturnValue`, `ticks`, `time`, `TraceFromPixel`, `TraceInfo`, `TraceNameList`, `TraceNameToWaveRef`, `TrimString`, `trunc`, `UniqueName`, `UnPadString`, `UnsetEnvironmentVariable`, `UpperStr`, `URLDecode`, `URLEncode`, `VariableList`, `Variance`, `vcsr`, `viAssertIntrSignal`, `viAssertTrigger`, `viAssertUtilSignal`, `viClear`, `viClose`, `viDisableEvent`, `viDiscardEvents`, `viEnableEvent`, `viFindNext`, `viFindRsrc`, `viGetAttribute`, `viGetAttributeString`, `viGpibCommand`, `viGpibControlATN`, `viGpibControlREN`, `viGpibPassControl`, `viGpibSendIFC`, `viIn8`, `viIn16`, `viIn32`, `viLock`, `viMapAddress`, `viMapTrigger`, `viMemAlloc`, `viMemFree`, `viMoveIn8`, `viMoveIn16`, `viMoveIn32`, `viMoveOut8`, `viMoveOut16`, `viMoveOut32`, `viOpen`, `viOpenDefaultRM`, `viOut8`, `viOut16`, `viOut32`, `viPeek8`, `viPeek16`, `viPeek32`, `viPoke8`, `viPoke16`, `viPoke32`, `viRead`, `viReadSTB`, `viSetAttribute`, `viSetAttributeString`, `viStatusDesc`, `viTerminate`, `viUnlock`, `viUnmapAddress`, `viUnmapTrigger`, `viUsbControlIn`, `viUsbControlOut`, `viVxiCommandQuery`, `viWaitOnEvent`, `viWrite`, `VoigtFunc`, `VoigtPeak`, `WaveCRC`, `WaveDims`, `WaveExists`, `WaveHash`, `WaveInfo`, `WaveList`, `WaveMax`, `WaveMin`, `WaveName`, `WaveRefIndexed`, `WaveRefIndexedDFR`, `WaveRefsEqual`, `WaveRefWaveToList`, `WaveTextEncoding`, `WaveType`, `WaveUnits`, `WhichListItem`, `WinList`, `WinName`, `WinRecreation`, `WinType`, `wnoise`, `xcsr`, `XWaveName`, `XWaveRefFromTrace`, `x2pnt`, `zcsr`, `ZernikeR`, `zeromq_client_connect`, `zeromq_client_connect`, `zeromq_client_recv`, `zeromq_client_recv`, `zeromq_client_send`, `zeromq_client_send`, `zeromq_handler_start`, `zeromq_handler_start`, `zeromq_handler_stop`, `zeromq_handler_stop`, `zeromq_server_bind`, `zeromq_server_bind`, `zeromq_server_recv`, `zeromq_server_recv`, `zeromq_server_send`, `zeromq_server_send`, `zeromq_set`, `zeromq_set`, `zeromq_stop`, `zeromq_stop`, `zeromq_test_callfunction`, `zeromq_test_callfunction`, `zeromq_test_serializeWave`, `zeromq_test_serializeWave`, `zeta`), NameFunction, nil}, + {`^#(include|pragma|define|undef|ifdef|ifndef|if|elif|else|endif)`, NameDecorator, nil}, + {`[^a-z"/]+$`, Text, nil}, + {`.`, Text, nil}, + {`\n|\r`, Text, nil}, + }, + }, +)) diff --git a/vendor/github.com/alecthomas/chroma/lexers/internal/api.go b/vendor/github.com/alecthomas/chroma/lexers/internal/api.go index f1b67143..002997a5 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/internal/api.go +++ b/vendor/github.com/alecthomas/chroma/lexers/internal/api.go @@ -1,3 +1,4 @@ +// Package internal contains common API functions and structures shared between lexer packages. package internal import ( diff --git a/vendor/github.com/alecthomas/chroma/lexers/j/j.go b/vendor/github.com/alecthomas/chroma/lexers/j/j.go new file mode 100644 index 00000000..686e53b9 --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/j/j.go @@ -0,0 +1,73 @@ +package j + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// J lexer. +var J = internal.Register(MustNewLexer( + &Config{ + Name: "J", + Aliases: []string{"j"}, + Filenames: []string{"*.ijs"}, + MimeTypes: []string{"text/x-j"}, + }, + Rules{ + "root": { + {`#!.*$`, CommentPreproc, nil}, + {`NB\..*`, CommentSingle, nil}, + {`\n+\s*Note`, CommentMultiline, Push("comment")}, + {`\s*Note.*`, CommentSingle, nil}, + {`\s+`, Text, nil}, + {`'`, LiteralString, Push("singlequote")}, + {`0\s+:\s*0|noun\s+define\s*$`, NameEntity, Push("nounDefinition")}, + {`(([1-4]|13)\s+:\s*0|(adverb|conjunction|dyad|monad|verb)\s+define)\b`, NameFunction, Push("explicitDefinition")}, + {Words(``, `\b[a-zA-Z]\w*\.`, `for_`, `goto_`, `label_`), NameLabel, nil}, + {Words(``, `\.`, `assert`, `break`, `case`, `catch`, `catchd`, `catcht`, `continue`, `do`, `else`, `elseif`, `end`, `fcase`, `for`, `if`, `return`, `select`, `throw`, `try`, `while`, `whilst`), NameLabel, nil}, + {`\b[a-zA-Z]\w*`, NameVariable, nil}, + {Words(``, ``, `ARGV`, `CR`, `CRLF`, `DEL`, `Debug`, `EAV`, `EMPTY`, `FF`, `JVERSION`, `LF`, `LF2`, `Note`, `TAB`, `alpha17`, `alpha27`, `apply`, `bind`, `boxopen`, `boxxopen`, `bx`, `clear`, `cutLF`, `cutopen`, `datatype`, `def`, `dfh`, `drop`, `each`, `echo`, `empty`, `erase`, `every`, `evtloop`, `exit`, `expand`, `fetch`, `file2url`, `fixdotdot`, `fliprgb`, `getargs`, `getenv`, `hfd`, `inv`, `inverse`, `iospath`, `isatty`, `isutf8`, `items`, `leaf`, `list`, `nameclass`, `namelist`, `names`, `nc`, `nl`, `on`, `pick`, `rows`, `script`, `scriptd`, `sign`, `sminfo`, `smoutput`, `sort`, `split`, `stderr`, `stdin`, `stdout`, `table`, `take`, `timespacex`, `timex`, `tmoutput`, `toCRLF`, `toHOST`, `toJ`, `tolower`, `toupper`, `type`, `ucp`, `ucpcount`, `usleep`, `utf8`, `uucp`), NameFunction, nil}, + {`=[.:]`, Operator, nil}, + {"[-=+*#$%@!~`^&\";:.,<>{}\\[\\]\\\\|/]", Operator, nil}, + {`[abCdDeEfHiIjLMoprtT]\.`, KeywordReserved, nil}, + {`[aDiLpqsStux]\:`, KeywordReserved, nil}, + {`(_[0-9])\:`, KeywordConstant, nil}, + {`\(`, Punctuation, Push("parentheses")}, + Include("numbers"), + }, + "comment": { + {`[^)]`, CommentMultiline, nil}, + {`^\)`, CommentMultiline, Pop(1)}, + {`[)]`, CommentMultiline, nil}, + }, + "explicitDefinition": { + {`\b[nmuvxy]\b`, NameDecorator, nil}, + Include("root"), + {`[^)]`, Name, nil}, + {`^\)`, NameLabel, Pop(1)}, + {`[)]`, Name, nil}, + }, + "numbers": { + {`\b_{1,2}\b`, LiteralNumber, nil}, + {`_?\d+(\.\d+)?(\s*[ejr]\s*)_?\d+(\.?=\d+)?`, LiteralNumber, nil}, + {`_?\d+\.(?=\d+)`, LiteralNumberFloat, nil}, + {`_?\d+x`, LiteralNumberIntegerLong, nil}, + {`_?\d+`, LiteralNumberInteger, nil}, + }, + "nounDefinition": { + {`[^)]`, LiteralString, nil}, + {`^\)`, NameLabel, Pop(1)}, + {`[)]`, LiteralString, nil}, + }, + "parentheses": { + {`\)`, Punctuation, Pop(1)}, + Include("explicitDefinition"), + Include("root"), + }, + "singlequote": { + {`[^']`, LiteralString, nil}, + {`''`, LiteralString, nil}, + {`'`, LiteralString, Pop(1)}, + }, + }, +)) diff --git a/vendor/github.com/alecthomas/chroma/lexers/j/javascript.go b/vendor/github.com/alecthomas/chroma/lexers/j/javascript.go index 6291e33d..282501d0 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/j/javascript.go +++ b/vendor/github.com/alecthomas/chroma/lexers/j/javascript.go @@ -5,6 +5,7 @@ import ( "github.com/alecthomas/chroma/lexers/internal" ) +// Javascript lexer. var JavascriptRules = Rules{ "commentsandwhitespace": { {`\s+`, Text, nil}, @@ -23,6 +24,7 @@ var JavascriptRules = Rules{ }, "root": { {`\A#! ?/.*?\n`, CommentHashbang, nil}, + {`^(?=\s|/|`, `||`, `&&`, `>`, `<`, `>=`, `≥`, `<=`, `≤`, `==`, `===`, `≡`, `!=`, `≠`, `!==`, `≢`, `.>`, `.<`, `.>=`, `.≥`, `.<=`, `.≤`, `.==`, `.!=`, `.≠`, `.=`, `.!`, `<:`, `>:`, `∈`, `∉`, `∋`, `∌`, `⊆`, `⊈`, `⊂`, `⊄`, `⊊`, `|>`, `<|`, `:`, `+`, `-`, `.+`, `.-`, `|`, `∪`, `$`, `<<`, `>>`, `>>>`, `.<<`, `.>>`, `.>>>`, `*`, `/`, `./`, `÷`, `.÷`, `%`, `⋅`, `.%`, `.*`, `\`, `.\`, `&`, `∩`, `//`, `.//`, `^`, `.^`, `::`, `.`, `+`, `-`, `!`, `~`, `√`, `∛`, `∜`), Operator, nil}, + {Words(``, ``, `=`, `:=`, `+=`, `-=`, `*=`, `/=`, `//=`, `.//=`, `.*=`, `./=`, `\=`, `.\=`, `^=`, `.^=`, `÷=`, `.÷=`, `%=`, `.%=`, `|=`, `&=`, `$=`, `=>`, `<<=`, `>>=`, `>>>=`, `~`, `.+=`, `.-=`, `?`, `--`, `-->`, `||`, `&&`, `>`, `<`, `>=`, `≥`, `<=`, `≤`, `==`, `===`, `≡`, `!=`, `≠`, `!==`, `≢`, `.>`, `.<`, `.>=`, `.≥`, `.<=`, `.≤`, `.==`, `.!=`, `.≠`, `.=`, `.!`, `<:`, `>:`, `∈`, `∉`, `∋`, `∌`, `⊆`, `⊈`, `⊂`, `⊄`, `⊊`, `|>`, `<|`, `:`, `+`, `-`, `.+`, `.-`, `|`, `∪`, `$`, `<<`, `>>`, `>>>`, `.<<`, `.>>`, `.>>>`, `*`, `/`, `./`, `÷`, `.÷`, `%`, `⋅`, `.%`, `.*`, `\`, `.\`, `&`, `∩`, `//`, `.//`, `^`, `.^`, `::`, `.`, `+`, `-`, `!`, `√`, `∛`, `∜`), Operator, nil}, {`'(\\.|\\[0-7]{1,3}|\\x[a-fA-F0-9]{1,3}|\\u[a-fA-F0-9]{1,4}|\\U[a-fA-F0-9]{1,6}|[^\\\'\n])'`, LiteralStringChar, nil}, {`(?<=[.\w)\]])\'+`, Operator, nil}, {`"""`, LiteralString, Push("tqstring")}, @@ -34,8 +35,8 @@ var Julia = internal.Register(MustNewLexer( {`r"""`, LiteralStringRegex, Push("tqregex")}, {`r"`, LiteralStringRegex, Push("regex")}, {"`", LiteralStringBacktick, Push("command")}, - {`(?:[a-zA-Z_¡-￿]|[𐀀-􏿿])(?:[a-zA-Z_0-9¡-￿]|[𐀀-􏿿])*!*`, Name, nil}, - {`@(?:[a-zA-Z_¡-￿]|[𐀀-􏿿])(?:[a-zA-Z_0-9¡-￿]|[𐀀-􏿿])*!*`, NameDecorator, nil}, + {`((?:[a-zA-Z_¡-￿]|[𐀀-􏿿])(?:[a-zA-Z_0-9¡-￿]|[𐀀-􏿿])*!*)(')?`, ByGroups(Name, Operator), nil}, + {`(@(?:[a-zA-Z_¡-￿]|[𐀀-􏿿])(?:[a-zA-Z_0-9¡-￿]|[𐀀-􏿿])*!*)(')?`, ByGroups(NameDecorator, Operator), nil}, {`(\d+(_\d+)+\.\d*|\d*\.\d+(_\d+)+)([eEf][+-]?[0-9]+)?`, LiteralNumberFloat, nil}, {`(\d+\.\d*|\d*\.\d+)([eEf][+-]?[0-9]+)?`, LiteralNumberFloat, nil}, {`\d+(_\d+)+[eEf][+-]?[0-9]+`, LiteralNumberFloat, nil}, diff --git a/vendor/github.com/alecthomas/chroma/lexers/m/mysql.go b/vendor/github.com/alecthomas/chroma/lexers/m/mysql.go index 52c9ad21..9f47e32a 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/m/mysql.go +++ b/vendor/github.com/alecthomas/chroma/lexers/m/mysql.go @@ -26,7 +26,7 @@ var MySQL = internal.Register(MustNewLexer( {`((?:_[a-z0-9]+)?)(")`, ByGroups(LiteralStringAffix, LiteralStringDouble), Push("double-string")}, {"[+*/<>=~!@#%^&|`?-]", Operator, nil}, {`\b(tinyint|smallint|mediumint|int|integer|bigint|date|datetime|time|bit|bool|tinytext|mediumtext|longtext|text|tinyblob|mediumblob|longblob|blob|float|double|double\s+precision|real|numeric|dec|decimal|timestamp|year|char|varchar|varbinary|varcharacter|enum|set)(\b\s*)(\()?`, ByGroups(KeywordType, Text, Punctuation), nil}, - {`\b(add|all|alter|analyze|and|as|asc|asensitive|before|between|bigint|binary|blob|both|by|call|cascade|case|change|char|character|check|collate|column|condition|constraint|continue|convert|create|cross|current_date|current_time|current_timestamp|current_user|cursor|database|databases|day_hour|day_microsecond|day_minute|day_second|dec|decimal|declare|default|delayed|delete|desc|describe|deterministic|distinct|distinctrow|div|double|drop|dual|each|else|elseif|enclosed|escaped|exists|exit|explain|fetch|flush|float|float4|float8|for|force|foreign|from|fulltext|grant|group|having|high_priority|hour_microsecond|hour_minute|hour_second|if|ignore|in|index|infile|inner|inout|insensitive|insert|int|int1|int2|int3|int4|int8|integer|interval|into|is|iterate|join|key|keys|kill|leading|leave|left|like|limit|lines|load|localtime|localtimestamp|lock|long|loop|low_priority|match|minute_microsecond|minute_second|mod|modifies|natural|no_write_to_binlog|not|numeric|on|optimize|option|optionally|or|order|out|outer|outfile|precision|primary|procedure|purge|raid0|read|reads|real|references|regexp|release|rename|repeat|replace|require|restrict|return|revoke|right|rlike|schema|schemas|second_microsecond|select|sensitive|separator|set|show|smallint|soname|spatial|specific|sql|sql_big_result|sql_calc_found_rows|sql_small_result|sqlexception|sqlstate|sqlwarning|ssl|starting|straight_join|table|terminated|then|to|trailing|trigger|undo|union|unique|unlock|unsigned|update|usage|use|using|utc_date|utc_time|utc_timestamp|values|varying|when|where|while|with|write|x509|xor|year_month|zerofill)\b`, Keyword, nil}, + {`\b(add|all|alter|analyze|and|as|asc|asensitive|before|between|bigint|binary|blob|both|by|call|cascade|case|change|char|character|check|collate|column|condition|constraint|continue|convert|create|cross|current_date|current_time|current_timestamp|current_user|cursor|database|databases|day_hour|day_microsecond|day_minute|day_second|dec|decimal|declare|default|delayed|delete|desc|describe|deterministic|distinct|distinctrow|div|double|drop|dual|each|else|elseif|enclosed|escaped|exists|exit|explain|fetch|flush|float|float4|float8|for|force|foreign|from|fulltext|grant|group|having|high_priority|hour_microsecond|hour_minute|hour_second|identified|if|ignore|in|index|infile|inner|inout|insensitive|insert|int|int1|int2|int3|int4|int8|integer|interval|into|is|iterate|join|key|keys|kill|leading|leave|left|like|limit|lines|load|localtime|localtimestamp|lock|long|loop|low_priority|match|minute_microsecond|minute_second|mod|modifies|natural|no_write_to_binlog|not|numeric|on|optimize|option|optionally|or|order|out|outer|outfile|precision|primary|privileges|procedure|purge|raid0|read|reads|real|references|regexp|release|rename|repeat|replace|require|restrict|return|revoke|right|rlike|schema|schemas|second_microsecond|select|sensitive|separator|set|show|smallint|soname|spatial|specific|sql|sql_big_result|sql_calc_found_rows|sql_small_result|sqlexception|sqlstate|sqlwarning|ssl|starting|straight_join|table|terminated|then|to|trailing|trigger|undo|union|unique|unlock|unsigned|update|usage|use|user|using|utc_date|utc_time|utc_timestamp|values|varying|when|where|while|with|write|x509|xor|year_month|zerofill)\b`, Keyword, nil}, {`\b(auto_increment|engine|charset|tables)\b`, KeywordPseudo, nil}, {`(true|false|null)`, NameConstant, nil}, {`([a-z_]\w*)(\s*)(\()`, ByGroups(NameFunction, Text, Punctuation), nil}, diff --git a/vendor/github.com/alecthomas/chroma/lexers/n/nim.go b/vendor/github.com/alecthomas/chroma/lexers/n/nim.go index 1f7ec792..b08c2f94 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/n/nim.go +++ b/vendor/github.com/alecthomas/chroma/lexers/n/nim.go @@ -16,6 +16,7 @@ var Nim = internal.Register(MustNewLexer( }, Rules{ "root": { + {`#\[[\s\S]*?\]#`, CommentMultiline, nil}, {`##.*$`, LiteralStringDoc, nil}, {`#.*$`, Comment, nil}, {`[*=><+\-/@$~&%!?|\\\[\]]`, Operator, nil}, diff --git a/vendor/github.com/alecthomas/chroma/lexers/p/prolog.go b/vendor/github.com/alecthomas/chroma/lexers/p/prolog.go index b5d91606..08b48121 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/p/prolog.go +++ b/vendor/github.com/alecthomas/chroma/lexers/p/prolog.go @@ -15,7 +15,6 @@ var Prolog = internal.Register(MustNewLexer( }, Rules{ "root": { - {`^#.*`, CommentSingle, nil}, {`/\*`, CommentMultiline, Push("nested-comment")}, {`%.*`, CommentSingle, nil}, {`0\'.`, LiteralStringChar, nil}, diff --git a/vendor/github.com/alecthomas/chroma/lexers/r/r.go b/vendor/github.com/alecthomas/chroma/lexers/r/r.go index b2e205ed..c2d3f56c 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/r/r.go +++ b/vendor/github.com/alecthomas/chroma/lexers/r/r.go @@ -18,17 +18,13 @@ var R = internal.Register(MustNewLexer( {`#.*$`, CommentSingle, nil}, }, "valid_name": { - {`[a-zA-Z][\w.]*`, Text, nil}, - {`\.[a-zA-Z_][\w.]*`, Text, nil}, + {"(?:`[^`\\\\]*(?:\\\\.[^`\\\\]*)*`)|(?:(?:[a-zA-z]|[_.][^0-9])[\\w_.]*)", Name, nil}, }, "punctuation": { {`\[{1,2}|\]{1,2}|\(|\)|;|,`, Punctuation, nil}, }, "keywords": { - {Words(``, `(?![\w. =])`, `Arg`, `Conj`, `Cstack_info`, `Encoding`, `FALSE`, `Filter`, `Find`, `I`, `ISOdate`, `ISOdatetime`, `Im`, `Inf`, `La.svd`, `Map`, `Math.Date`, `Math.POSIXt`, `Math.data.frame`, `Math.difftime`, `Math.factor`, `Mod`, `NA_character_`, `NA_complex_`, `NA_real_`, `NCOL`, `NROW`, `NULLNA_integer_`, `NaN`, `Negate`, `NextMethod`, `Ops.Date`, `Ops.POSIXt`, `Ops.data.frame`, `Ops.difftime`, `Ops.factor`, `Ops.numeric_version`, `Ops.ordered`, `Position`, `R.Version`, `R.home`, `R.version`, `R.version.string`, `RNGkind`, `RNGversion`, `R_system_version`, `Re`, `Recall`, `Reduce`, `Summary.Date`, `Summary.POSIXct`, `Summary.POSIXlt`, `Summary.data.frame`, `Summary.difftime`, `Summary.factor`, `Summary.numeric_version`, `Summary.ordered`, `Sys.Date`, `Sys.chmod`, `Sys.getenv`, `Sys.getlocale`, `Sys.getpid`, `Sys.glob`, `Sys.info`, `Sys.localeconv`, `Sys.readlink`, `Sys.setFileTime`, `Sys.setenv`, `Sys.setlocale`, `Sys.sleep`, `Sys.time`, `Sys.timezone`, `Sys.umask`, `Sys.unsetenv`, `Sys.which`, `TRUE`, `UseMethod`, `Vectorize`, `abbreviate`, `abs`, `acos`, `acosh`, `addNA`, `addTaskCallback`, `agrep`, `alist`, `all`, `all.equal`, `all.equal.POSIXct`, `all.equal.character`, `all.equal.default`, `all.equal.factor`, `all.equal.formula`, `all.equal.language`, `all.equal.list`, `all.equal.numeric`, `all.equal.raw`, `all.names`, `all.vars`, `any`, `anyDuplicated`, `anyDuplicated.array`, `anyDuplicated.data.frame`, `anyDuplicated.default`, `anyDuplicated.matrix`, `aperm`, `aperm.default`, `aperm.table`, `append`, `apply`, `args`, `arrayInd`, `as.Date`, `as.Date.POSIXct`, `as.Date.POSIXlt`, `as.Date.character`, `as.Date.date`, `as.Date.dates`, `as.Date.default`, `as.Date.factor`, `as.Date.numeric`, `as.POSIXct`, `as.POSIXct.Date`, `as.POSIXct.POSIXlt`, `as.POSIXct.date`, `as.POSIXct.dates`, `as.POSIXct.default`, `as.POSIXct.numeric`, `as.POSIXlt`, `as.POSIXlt.Date`, `as.POSIXlt.POSIXct`, `as.POSIXlt.character`, `as.POSIXlt.date`, `as.POSIXlt.dates`, `as.POSIXlt.default`, `as.POSIXlt.factor`, `as.POSIXlt.numeric`, `as.array`, `as.array.default`, `as.call`, `as.character`, `as.character.Date`, `as.character.POSIXt`, `as.character.condition`, `as.character.default`, `as.character.error`, `as.character.factor`, `as.character.hexmode`, `as.character.numeric_version`, `as.character.octmode`, `as.character.srcref`, `as.complex`, `as.data.frame`, `as.data.frame.AsIs`, `as.data.frame.Date`, `as.data.frame.POSIXct`, `as.data.frame.POSIXlt`, `as.data.frame.array`, `as.data.frame.character`, `as.data.frame.complex`, `as.data.frame.data.frame`, `as.data.frame.default`, `as.data.frame.difftime`, `as.data.frame.factor`, `as.data.frame.integer`, `as.data.frame.list`, `as.data.frame.logical`, `as.data.frame.matrix`, `as.data.frame.model.matrix`, `as.data.frame.numeric`, `as.data.frame.numeric_version`, `as.data.frame.ordered`, `as.data.frame.raw`, `as.data.frame.table`, `as.data.frame.ts`, `as.data.frame.vector`, `as.difftime`, `as.double`, `as.double.POSIXlt`, `as.double.difftime`, `as.environment`, `as.expression`, `as.expression.default`, `as.factor`, `as.function`, `as.function.default`, `as.hexmode`, `as.integer`, `as.list`, `as.list.Date`, `as.list.POSIXct`, `as.list.data.frame`, `as.list.default`, `as.list.environment`, `as.list.factor`, `as.list.function`, `as.list.numeric_version`, `as.logical`, `as.logical.factor`, `as.matrix`, `as.matrix.POSIXlt`, `as.matrix.data.frame`, `as.matrix.default`, `as.matrix.noquote`, `as.name`, `as.null`, `as.null.default`, `as.numeric`, `as.numeric_version`, `as.octmode`, `as.ordered`, `as.package_version`, `as.pairlist`, `as.qr`, `as.raw`, `as.single`, `as.single.default`, `as.symbol`, `as.table`, `as.table.default`, `as.vector`, `as.vector.factor`, `asNamespace`, `asS3`, `asS4`, `asin`, `asinh`, `assign`, `atan`, `atan2`, `atanh`, `attachNamespace`, `attr`, `attr.all.equal`, `attributes`, `autoload`, `autoloader`, `backsolve`, `baseenv`, `basename`, `besselI`, `besselJ`, `besselK`, `besselY`, `beta`, `bindingIsActive`, `bindingIsLocked`, `bindtextdomain`, `bitwAnd`, `bitwNot`, `bitwOr`, `bitwShiftL`, `bitwShiftR`, `bitwXor`, `body`, `bquote`, `browser`, `browserCondition`, `browserSetDebug`, `browserText`, `builtins`, `by`, `by.data.frame`, `by.default`, `bzfile`, `c.Date`, `c.POSIXct`, `c.POSIXlt`, `c.noquote`, `c.numeric_version`, `call`, `callCC`, `capabilities`, `casefold`, `cat`, `category`, `cbind`, `cbind.data.frame`, `ceiling`, `char.expand`, `charToRaw`, `charmatch`, `chartr`, `check_tzones`, `chol`, `chol.default`, `chol2inv`, `choose`, `class`, `clearPushBack`, `close`, `close.connection`, `close.srcfile`, `close.srcfilealias`, `closeAllConnections`, `col`, `colMeans`, `colSums`, `colnames`, `commandArgs`, `comment`, `computeRestarts`, `conditionCall`, `conditionCall.condition`, `conditionMessage`, `conditionMessage.condition`, `conflicts`, `contributors`, `cos`, `cosh`, `crossprod`, `cummax`, `cummin`, `cumprod`, `cumsum`, `cut`, `cut.Date`, `cut.POSIXt`, `cut.default`, `dQuote`, `data.class`, `data.matrix`, `date`, `debug`, `debugonce`, `default.stringsAsFactors`, `delayedAssign`, `deparse`, `det`, `determinant`, `determinant.matrix`, `dget`, `diag`, `diff`, `diff.Date`, `diff.POSIXt`, `diff.default`, `difftime`, `digamma`, `dim`, `dim.data.frame`, `dimnames`, `dimnames.data.frame`, `dir`, `dir.create`, `dirname`, `do.call`, `dput`, `drop`, `droplevels`, `droplevels.data.frame`, `droplevels.factor`, `dump`, `duplicated`, `duplicated.POSIXlt`, `duplicated.array`, `duplicated.data.frame`, `duplicated.default`, `duplicated.matrix`, `duplicated.numeric_version`, `dyn.load`, `dyn.unload`, `eapply`, `eigen`, `else`, `emptyenv`, `enc2native`, `enc2utf8`, `encodeString`, `enquote`, `env.profile`, `environment`, `environmentIsLocked`, `environmentName`, `eval`, `eval.parent`, `evalq`, `exists`, `exp`, `expand.grid`, `expm1`, `expression`, `factor`, `factorial`, `fifo`, `file`, `file.access`, `file.append`, `file.choose`, `file.copy`, `file.create`, `file.exists`, `file.info`, `file.link`, `file.path`, `file.remove`, `file.rename`, `file.show`, `file.symlink`, `find.package`, `findInterval`, `findPackageEnv`, `findRestart`, `floor`, `flush`, `flush.connection`, `force`, `formals`, `format`, `format.AsIs`, `format.Date`, `format.POSIXct`, `format.POSIXlt`, `format.data.frame`, `format.default`, `format.difftime`, `format.factor`, `format.hexmode`, `format.info`, `format.libraryIQR`, `format.numeric_version`, `format.octmode`, `format.packageInfo`, `format.pval`, `format.summaryDefault`, `formatC`, `formatDL`, `forwardsolve`, `gamma`, `gc`, `gc.time`, `gcinfo`, `gctorture`, `gctorture2`, `get`, `getAllConnections`, `getCallingDLL`, `getCallingDLLe`, `getConnection`, `getDLLRegisteredRoutines`, `getDLLRegisteredRoutines.DLLInfo`, `getDLLRegisteredRoutines.character`, `getElement`, `getExportedValue`, `getHook`, `getLoadedDLLs`, `getNamespace`, `getNamespaceExports`, `getNamespaceImports`, `getNamespaceInfo`, `getNamespaceName`, `getNamespaceUsers`, `getNamespaceVersion`, `getNativeSymbolInfo`, `getOption`, `getRversion`, `getSrcLines`, `getTaskCallbackNames`, `geterrmessage`, `gettext`, `gettextf`, `getwd`, `gl`, `globalenv`, `gregexpr`, `grep`, `grepRaw`, `grepl`, `gsub`, `gzcon`, `gzfile`, `head`, `iconv`, `iconvlist`, `icuSetCollate`, `identical`, `identity`, `ifelse`, `importIntoEnv`, `in`, `inherits`, `intToBits`, `intToUtf8`, `interaction`, `interactive`, `intersect`, `inverse.rle`, `invisible`, `invokeRestart`, `invokeRestartInteractively`, `is.R`, `is.array`, `is.atomic`, `is.call`, `is.character`, `is.complex`, `is.data.frame`, `is.double`, `is.element`, `is.environment`, `is.expression`, `is.factor`, `is.finite`, `is.function`, `is.infinite`, `is.integer`, `is.language`, `is.list`, `is.loaded`, `is.logical`, `is.matrix`, `is.na`, `is.na.POSIXlt`, `is.na.data.frame`, `is.na.numeric_version`, `is.name`, `is.nan`, `is.null`, `is.numeric`, `is.numeric.Date`, `is.numeric.POSIXt`, `is.numeric.difftime`, `is.numeric_version`, `is.object`, `is.ordered`, `is.package_version`, `is.pairlist`, `is.primitive`, `is.qr`, `is.raw`, `is.recursive`, `is.single`, `is.symbol`, `is.table`, `is.unsorted`, `is.vector`, `isBaseNamespace`, `isIncomplete`, `isNamespace`, `isOpen`, `isRestart`, `isS4`, `isSeekable`, `isSymmetric`, `isSymmetric.matrix`, `isTRUE`, `isatty`, `isdebugged`, `jitter`, `julian`, `julian.Date`, `julian.POSIXt`, `kappa`, `kappa.default`, `kappa.lm`, `kappa.qr`, `kronecker`, `l10n_info`, `labels`, `labels.default`, `lapply`, `lazyLoad`, `lazyLoadDBexec`, `lazyLoadDBfetch`, `lbeta`, `lchoose`, `length`, `length.POSIXlt`, `letters`, `levels`, `levels.default`, `lfactorial`, `lgamma`, `library.dynam`, `library.dynam.unload`, `licence`, `license`, `list.dirs`, `list.files`, `list2env`, `load`, `loadNamespace`, `loadedNamespaces`, `loadingNamespaceInfo`, `local`, `lockBinding`, `lockEnvironment`, `log`, `log10`, `log1p`, `log2`, `logb`, `lower.tri`, `ls`, `make.names`, `make.unique`, `makeActiveBinding`, `mapply`, `margin.table`, `mat.or.vec`, `match`, `match.arg`, `match.call`, `match.fun`, `max`, `max.col`, `mean`, `mean.Date`, `mean.POSIXct`, `mean.POSIXlt`, `mean.default`, `mean.difftime`, `mem.limits`, `memCompress`, `memDecompress`, `memory.profile`, `merge`, `merge.data.frame`, `merge.default`, `message`, `mget`, `min`, `missing`, `mode`, `month.abb`, `month.name`, `months`, `months.Date`, `months.POSIXt`, `months.abb`, `months.nameletters`, `names`, `names.POSIXlt`, `namespaceExport`, `namespaceImport`, `namespaceImportClasses`, `namespaceImportFrom`, `namespaceImportMethods`, `nargs`, `nchar`, `ncol`, `new.env`, `ngettext`, `nlevels`, `noquote`, `norm`, `normalizePath`, `nrow`, `numeric_version`, `nzchar`, `objects`, `oldClass`, `on.exit`, `open`, `open.connection`, `open.srcfile`, `open.srcfilealias`, `open.srcfilecopy`, `options`, `order`, `ordered`, `outer`, `packBits`, `packageEvent`, `packageHasNamespace`, `packageStartupMessage`, `package_version`, `pairlist`, `parent.env`, `parent.frame`, `parse`, `parseNamespaceFile`, `paste`, `paste0`, `path.expand`, `path.package`, `pipe`, `pmatch`, `pmax`, `pmax.int`, `pmin`, `pmin.int`, `polyroot`, `pos.to.env`, `pretty`, `pretty.default`, `prettyNum`, `print`, `print.AsIs`, `print.DLLInfo`, `print.DLLInfoList`, `print.DLLRegisteredRoutines`, `print.Date`, `print.NativeRoutineList`, `print.POSIXct`, `print.POSIXlt`, `print.by`, `print.condition`, `print.connection`, `print.data.frame`, `print.default`, `print.difftime`, `print.factor`, `print.function`, `print.hexmode`, `print.libraryIQR`, `print.listof`, `print.noquote`, `print.numeric_version`, `print.octmode`, `print.packageInfo`, `print.proc_time`, `print.restart`, `print.rle`, `print.simple.list`, `print.srcfile`, `print.srcref`, `print.summary.table`, `print.summaryDefault`, `print.table`, `print.warnings`, `prmatrix`, `proc.time`, `prod`, `prop.table`, `provideDimnames`, `psigamma`, `pushBack`, `pushBackLength`, `q`, `qr`, `qr.Q`, `qr.R`, `qr.X`, `qr.coef`, `qr.default`, `qr.fitted`, `qr.qty`, `qr.qy`, `qr.resid`, `qr.solve`, `quarters`, `quarters.Date`, `quarters.POSIXt`, `quit`, `quote`, `range`, `range.default`, `rank`, `rapply`, `raw`, `rawConnection`, `rawConnectionValue`, `rawShift`, `rawToBits`, `rawToChar`, `rbind`, `rbind.data.frame`, `rcond`, `read.dcf`, `readBin`, `readChar`, `readLines`, `readRDS`, `readRenviron`, `readline`, `reg.finalizer`, `regexec`, `regexpr`, `registerS3method`, `registerS3methods`, `regmatches`, `remove`, `removeTaskCallback`, `rep`, `rep.Date`, `rep.POSIXct`, `rep.POSIXlt`, `rep.factor`, `rep.int`, `rep.numeric_version`, `rep_len`, `replace`, `replicate`, `requireNamespace`, `restartDescription`, `restartFormals`, `retracemem`, `rev`, `rev.default`, `rle`, `rm`, `round`, `round.Date`, `round.POSIXt`, `row`, `row.names`, `row.names.data.frame`, `row.names.default`, `rowMeans`, `rowSums`, `rownames`, `rowsum`, `rowsum.data.frame`, `rowsum.default`, `sQuote`, `sample`, `sample.int`, `sapply`, `save`, `save.image`, `saveRDS`, `scale`, `scale.default`, `scan`, `search`, `searchpaths`, `seek`, `seek.connection`, `seq`, `seq.Date`, `seq.POSIXt`, `seq.default`, `seq.int`, `seq_along`, `seq_len`, `sequence`, `serialize`, `set.seed`, `setHook`, `setNamespaceInfo`, `setSessionTimeLimit`, `setTimeLimit`, `setdiff`, `setequal`, `setwd`, `shQuote`, `showConnections`, `sign`, `signalCondition`, `signif`, `simpleCondition`, `simpleError`, `simpleMessage`, `simpleWarning`, `simplify2array`, `sin`, `single`, `sinh`, `sink`, `sink.number`, `slice.index`, `socketConnection`, `socketSelect`, `solve`, `solve.default`, `solve.qr`, `sort`, `sort.POSIXlt`, `sort.default`, `sort.int`, `sort.list`, `split`, `split.Date`, `split.POSIXct`, `split.data.frame`, `split.default`, `sprintf`, `sqrt`, `srcfile`, `srcfilealias`, `srcfilecopy`, `srcref`, `standardGeneric`, `stderr`, `stdin`, `stdout`, `stop`, `stopifnot`, `storage.mode`, `strftime`, `strptime`, `strsplit`, `strtoi`, `strtrim`, `structure`, `strwrap`, `sub`, `subset`, `subset.data.frame`, `subset.default`, `subset.matrix`, `substitute`, `substr`, `substring`, `sum`, `summary`, `summary.Date`, `summary.POSIXct`, `summary.POSIXlt`, `summary.connection`, `summary.data.frame`, `summary.default`, `summary.factor`, `summary.matrix`, `summary.proc_time`, `summary.srcfile`, `summary.srcref`, `summary.table`, `suppressMessages`, `suppressPackageStartupMessages`, `suppressWarnings`, `svd`, `sweep`, `sys.call`, `sys.calls`, `sys.frame`, `sys.frames`, `sys.function`, `sys.load.image`, `sys.nframe`, `sys.on.exit`, `sys.parent`, `sys.parents`, `sys.save.image`, `sys.source`, `sys.status`, `system`, `system.file`, `system.time`, `system2`, `t`, `t.data.frame`, `t.default`, `table`, `tabulate`, `tail`, `tan`, `tanh`, `tapply`, `taskCallbackManager`, `tcrossprod`, `tempdir`, `tempfile`, `testPlatformEquivalence`, `textConnection`, `textConnectionValue`, `toString`, `toString.default`, `tolower`, `topenv`, `toupper`, `trace`, `traceback`, `tracemem`, `tracingState`, `transform`, `transform.data.frame`, `transform.default`, `trigamma`, `trunc`, `trunc.Date`, `trunc.POSIXt`, `truncate`, `truncate.connection`, `try`, `tryCatch`, `typeof`, `unclass`, `undebug`, `union`, `unique`, `unique.POSIXlt`, `unique.array`, `unique.data.frame`, `unique.default`, `unique.matrix`, `unique.numeric_version`, `units`, `units.difftime`, `unix.time`, `unlink`, `unlist`, `unloadNamespace`, `unlockBinding`, `unname`, `unserialize`, `unsplit`, `untrace`, `untracemem`, `unz`, `upper.tri`, `url`, `utf8ToInt`, `vapply`, `version`, `warning`, `warnings`, `weekdays`, `weekdays.Date`, `weekdays.POSIXt`, `which`, `which.max`, `which.min`, `with`, `with.default`, `withCallingHandlers`, `withRestarts`, `withVisible`, `within`, `within.data.frame`, `within.list`, `write`, `write.dcf`, `writeBin`, `writeChar`, `writeLines`, `xor`, `xor.hexmode`, `xor.octmode`, `xpdrows.data.frame`, `xtfrm`, `xtfrm.AsIs`, `xtfrm.Date`, `xtfrm.POSIXct`, `xtfrm.POSIXlt`, `xtfrm.Surv`, `xtfrm.default`, `xtfrm.difftime`, `xtfrm.factor`, `xtfrm.numeric_version`, `xzfile`, `zapsmall`), KeywordPseudo, nil}, {`(if|else|for|while|repeat|in|next|break|return|switch|function)(?![\w.])`, KeywordReserved, nil}, - {`(array|category|character|complex|double|function|integer|list|logical|matrix|numeric|vector|data.frame|c)(?![\w.])`, KeywordType, nil}, - {`(library|require|attach|detach|source)(?![\w.])`, KeywordNamespace, nil}, }, "operators": { {`<>?|-|==|<=|>=|<|>|&&?|!=|\|\|?|\?`, Operator, nil}, @@ -45,17 +41,17 @@ var R = internal.Register(MustNewLexer( "statements": { Include("comments"), {`\s+`, Text, nil}, - {"`.*?`", LiteralStringBacktick, nil}, {`\'`, LiteralString, Push("string_squote")}, {`\"`, LiteralString, Push("string_dquote")}, Include("builtin_symbols"), + Include("valid_name"), Include("numbers"), Include("keywords"), Include("punctuation"), Include("operators"), - Include("valid_name"), }, "root": { + {"((?:`[^`\\\\]*(?:\\\\.[^`\\\\]*)*`)|(?:(?:[a-zA-z]|[_.][^0-9])[\\w_.]*))\\s*(?=\\()", NameFunction, nil}, Include("statements"), {`\{|\}`, Punctuation, nil}, {`.`, Text, nil}, diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/scss.go b/vendor/github.com/alecthomas/chroma/lexers/s/scss.go index 1847cac2..48195de3 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/s/scss.go +++ b/vendor/github.com/alecthomas/chroma/lexers/s/scss.go @@ -80,7 +80,7 @@ var Scss = internal.Register(MustNewLexer( {`[\w-]+`, NameTag, nil}, {`#\{`, LiteralStringInterpol, Push("interpolation")}, {`&`, Keyword, nil}, - {`[~^*!&\[\]()<>|+=@:;,./?-]`, Operator, nil}, + {`[~^*!&\[\]()<>|+=@:,./?-]`, Operator, nil}, {`"`, LiteralStringDouble, Push("string-double")}, {`'`, LiteralStringSingle, Push("string-single")}, {`\n`, Text, nil}, @@ -92,9 +92,9 @@ var Scss = internal.Register(MustNewLexer( {`"`, LiteralStringDouble, Pop(1)}, }, "string-single": { - {`(\\.|#(?=[^\n{])|[^\n'#])+`, LiteralStringDouble, nil}, + {`(\\.|#(?=[^\n{])|[^\n'#])+`, LiteralStringSingle, nil}, {`#\{`, LiteralStringInterpol, Push("interpolation")}, - {`'`, LiteralStringDouble, Pop(1)}, + {`'`, LiteralStringSingle, Pop(1)}, }, "string-url": { {`(\\#|#(?=[^\n{])|[^\n#)])+`, LiteralStringOther, nil}, diff --git a/vendor/github.com/alecthomas/chroma/lexers/s/sql.go b/vendor/github.com/alecthomas/chroma/lexers/s/sql.go index 138ce0e2..6f4e3e07 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/s/sql.go +++ b/vendor/github.com/alecthomas/chroma/lexers/s/sql.go @@ -22,7 +22,7 @@ var SQL = internal.Register(MustNewLexer( {`/\*`, CommentMultiline, Push("multiline-comments")}, {`'`, LiteralStringSingle, Push("string")}, {`"`, LiteralStringDouble, Push("double-string")}, - {Words(``, `\b`, `ABORT`, `ABS`, `ABSOLUTE`, `ACCESS`, `ADA`, `ADD`, `ADMIN`, `AFTER`, `AGGREGATE`, `ALIAS`, `ALL`, `ALLOCATE`, `ALTER`, `ANALYSE`, `ANALYZE`, `AND`, `ANY`, `ARE`, `AS`, `ASC`, `ASENSITIVE`, `ASSERTION`, `ASSIGNMENT`, `ASYMMETRIC`, `AT`, `ATOMIC`, `AUTHORIZATION`, `AVG`, `BACKWARD`, `BEFORE`, `BEGIN`, `BETWEEN`, `BITVAR`, `BIT_LENGTH`, `BOTH`, `BREADTH`, `BY`, `C`, `CACHE`, `CALL`, `CALLED`, `CARDINALITY`, `CASCADE`, `CASCADED`, `CASE`, `CAST`, `CATALOG`, `CATALOG_NAME`, `CHAIN`, `CHARACTERISTICS`, `CHARACTER_LENGTH`, `CHARACTER_SET_CATALOG`, `CHARACTER_SET_NAME`, `CHARACTER_SET_SCHEMA`, `CHAR_LENGTH`, `CHECK`, `CHECKED`, `CHECKPOINT`, `CLASS`, `CLASS_ORIGIN`, `CLOB`, `CLOSE`, `CLUSTER`, `COALSECE`, `COBOL`, `COLLATE`, `COLLATION`, `COLLATION_CATALOG`, `COLLATION_NAME`, `COLLATION_SCHEMA`, `COLUMN`, `COLUMN_NAME`, `COMMAND_FUNCTION`, `COMMAND_FUNCTION_CODE`, `COMMENT`, `COMMIT`, `COMMITTED`, `COMPLETION`, `CONDITION_NUMBER`, `CONNECT`, `CONNECTION`, `CONNECTION_NAME`, `CONSTRAINT`, `CONSTRAINTS`, `CONSTRAINT_CATALOG`, `CONSTRAINT_NAME`, `CONSTRAINT_SCHEMA`, `CONSTRUCTOR`, `CONTAINS`, `CONTINUE`, `CONVERSION`, `CONVERT`, `COPY`, `CORRESPONTING`, `COUNT`, `CREATE`, `CREATEDB`, `CREATEUSER`, `CROSS`, `CUBE`, `CURRENT`, `CURRENT_DATE`, `CURRENT_PATH`, `CURRENT_ROLE`, `CURRENT_TIME`, `CURRENT_TIMESTAMP`, `CURRENT_USER`, `CURSOR`, `CURSOR_NAME`, `CYCLE`, `DATA`, `DATABASE`, `DATETIME_INTERVAL_CODE`, `DATETIME_INTERVAL_PRECISION`, `DAY`, `DEALLOCATE`, `DECLARE`, `DEFAULT`, `DEFAULTS`, `DEFERRABLE`, `DEFERRED`, `DEFINED`, `DEFINER`, `DELETE`, `DELIMITER`, `DELIMITERS`, `DEREF`, `DESC`, `DESCRIBE`, `DESCRIPTOR`, `DESTROY`, `DESTRUCTOR`, `DETERMINISTIC`, `DIAGNOSTICS`, `DICTIONARY`, `DISCONNECT`, `DISPATCH`, `DISTINCT`, `DO`, `DOMAIN`, `DROP`, `DYNAMIC`, `DYNAMIC_FUNCTION`, `DYNAMIC_FUNCTION_CODE`, `EACH`, `ELSE`, `ELSIF`, `ENCODING`, `ENCRYPTED`, `END`, `END-EXEC`, `EQUALS`, `ESCAPE`, `EVERY`, `EXCEPTION`, `EXCEPT`, `EXCLUDING`, `EXCLUSIVE`, `EXEC`, `EXECUTE`, `EXISTING`, `EXISTS`, `EXPLAIN`, `EXTERNAL`, `EXTRACT`, `FALSE`, `FETCH`, `FINAL`, `FIRST`, `FOR`, `FORCE`, `FOREIGN`, `FORTRAN`, `FORWARD`, `FOUND`, `FREE`, `FREEZE`, `FROM`, `FULL`, `FUNCTION`, `G`, `GENERAL`, `GENERATED`, `GET`, `GLOBAL`, `GO`, `GOTO`, `GRANT`, `GRANTED`, `GROUP`, `GROUPING`, `HANDLER`, `HAVING`, `HIERARCHY`, `HOLD`, `HOST`, `IDENTITY`, `IF`, `IGNORE`, `ILIKE`, `IMMEDIATE`, `IMMUTABLE`, `IMPLEMENTATION`, `IMPLICIT`, `IN`, `INCLUDING`, `INCREMENT`, `INDEX`, `INDITCATOR`, `INFIX`, `INHERITS`, `INITIALIZE`, `INITIALLY`, `INNER`, `INOUT`, `INPUT`, `INSENSITIVE`, `INSERT`, `INSTANTIABLE`, `INSTEAD`, `INTERSECT`, `INTO`, `INVOKER`, `IS`, `ISNULL`, `ISOLATION`, `ITERATE`, `JOIN`, `KEY`, `KEY_MEMBER`, `KEY_TYPE`, `LANCOMPILER`, `LANGUAGE`, `LARGE`, `LAST`, `LATERAL`, `LEADING`, `LEFT`, `LENGTH`, `LESS`, `LEVEL`, `LIKE`, `LIMIT`, `LISTEN`, `LOAD`, `LOCAL`, `LOCALTIME`, `LOCALTIMESTAMP`, `LOCATION`, `LOCATOR`, `LOCK`, `LOWER`, `MAP`, `MATCH`, `MAX`, `MAXVALUE`, `MESSAGE_LENGTH`, `MESSAGE_OCTET_LENGTH`, `MESSAGE_TEXT`, `METHOD`, `MIN`, `MINUTE`, `MINVALUE`, `MOD`, `MODE`, `MODIFIES`, `MODIFY`, `MONTH`, `MORE`, `MOVE`, `MUMPS`, `NAMES`, `NATIONAL`, `NATURAL`, `NCHAR`, `NCLOB`, `NEW`, `NEXT`, `NO`, `NOCREATEDB`, `NOCREATEUSER`, `NONE`, `NOT`, `NOTHING`, `NOTIFY`, `NOTNULL`, `NULL`, `NULLABLE`, `NULLIF`, `OBJECT`, `OCTET_LENGTH`, `OF`, `OFF`, `OFFSET`, `OIDS`, `OLD`, `ON`, `ONLY`, `OPEN`, `OPERATION`, `OPERATOR`, `OPTION`, `OPTIONS`, `OR`, `ORDER`, `ORDINALITY`, `OUT`, `OUTER`, `OUTPUT`, `OVERLAPS`, `OVERLAY`, `OVERRIDING`, `OWNER`, `PAD`, `PARAMETER`, `PARAMETERS`, `PARAMETER_MODE`, `PARAMATER_NAME`, `PARAMATER_ORDINAL_POSITION`, `PARAMETER_SPECIFIC_CATALOG`, `PARAMETER_SPECIFIC_NAME`, `PARAMATER_SPECIFIC_SCHEMA`, `PARTIAL`, `PASCAL`, `PENDANT`, `PLACING`, `PLI`, `POSITION`, `POSTFIX`, `PRECISION`, `PREFIX`, `PREORDER`, `PREPARE`, `PRESERVE`, `PRIMARY`, `PRIOR`, `PRIVILEGES`, `PROCEDURAL`, `PROCEDURE`, `PUBLIC`, `READ`, `READS`, `RECHECK`, `RECURSIVE`, `REF`, `REFERENCES`, `REFERENCING`, `REINDEX`, `RELATIVE`, `RENAME`, `REPEATABLE`, `REPLACE`, `RESET`, `RESTART`, `RESTRICT`, `RESULT`, `RETURN`, `RETURNED_LENGTH`, `RETURNED_OCTET_LENGTH`, `RETURNED_SQLSTATE`, `RETURNS`, `REVOKE`, `RIGHT`, `ROLE`, `ROLLBACK`, `ROLLUP`, `ROUTINE`, `ROUTINE_CATALOG`, `ROUTINE_NAME`, `ROUTINE_SCHEMA`, `ROW`, `ROWS`, `ROW_COUNT`, `RULE`, `SAVE_POINT`, `SCALE`, `SCHEMA`, `SCHEMA_NAME`, `SCOPE`, `SCROLL`, `SEARCH`, `SECOND`, `SECURITY`, `SELECT`, `SELF`, `SENSITIVE`, `SERIALIZABLE`, `SERVER_NAME`, `SESSION`, `SESSION_USER`, `SET`, `SETOF`, `SETS`, `SHARE`, `SHOW`, `SIMILAR`, `SIMPLE`, `SIZE`, `SOME`, `SOURCE`, `SPACE`, `SPECIFIC`, `SPECIFICTYPE`, `SPECIFIC_NAME`, `SQL`, `SQLCODE`, `SQLERROR`, `SQLEXCEPTION`, `SQLSTATE`, `SQLWARNINIG`, `STABLE`, `START`, `STATE`, `STATEMENT`, `STATIC`, `STATISTICS`, `STDIN`, `STDOUT`, `STORAGE`, `STRICT`, `STRUCTURE`, `STYPE`, `SUBCLASS_ORIGIN`, `SUBLIST`, `SUBSTRING`, `SUM`, `SYMMETRIC`, `SYSID`, `SYSTEM`, `SYSTEM_USER`, `TABLE`, `TABLE_NAME`, ` TEMP`, `TEMPLATE`, `TEMPORARY`, `TERMINATE`, `THAN`, `THEN`, `TIMESTAMP`, `TIMEZONE_HOUR`, `TIMEZONE_MINUTE`, `TO`, `TOAST`, `TRAILING`, `TRANSATION`, `TRANSACTIONS_COMMITTED`, `TRANSACTIONS_ROLLED_BACK`, `TRANSATION_ACTIVE`, `TRANSFORM`, `TRANSFORMS`, `TRANSLATE`, `TRANSLATION`, `TREAT`, `TRIGGER`, `TRIGGER_CATALOG`, `TRIGGER_NAME`, `TRIGGER_SCHEMA`, `TRIM`, `TRUE`, `TRUNCATE`, `TRUSTED`, `TYPE`, `UNCOMMITTED`, `UNDER`, `UNENCRYPTED`, `UNION`, `UNIQUE`, `UNKNOWN`, `UNLISTEN`, `UNNAMED`, `UNNEST`, `UNTIL`, `UPDATE`, `UPPER`, `USAGE`, `USER`, `USER_DEFINED_TYPE_CATALOG`, `USER_DEFINED_TYPE_NAME`, `USER_DEFINED_TYPE_SCHEMA`, `USING`, `VACUUM`, `VALID`, `VALIDATOR`, `VALUES`, `VARIABLE`, `VERBOSE`, `VERSION`, `VIEW`, `VOLATILE`, `WHEN`, `WHENEVER`, `WHERE`, `WITH`, `WITHOUT`, `WORK`, `WRITE`, `YEAR`, `ZONE`), Keyword, nil}, + {Words(``, `\b`, `ABORT`, `ABS`, `ABSOLUTE`, `ACCESS`, `ADA`, `ADD`, `ADMIN`, `AFTER`, `AGGREGATE`, `ALIAS`, `ALL`, `ALLOCATE`, `ALTER`, `ANALYSE`, `ANALYZE`, `AND`, `ANY`, `ARE`, `AS`, `ASC`, `ASENSITIVE`, `ASSERTION`, `ASSIGNMENT`, `ASYMMETRIC`, `AT`, `ATOMIC`, `AUTHORIZATION`, `AVG`, `BACKWARD`, `BEFORE`, `BEGIN`, `BETWEEN`, `BITVAR`, `BIT_LENGTH`, `BOTH`, `BREADTH`, `BY`, `C`, `CACHE`, `CALL`, `CALLED`, `CARDINALITY`, `CASCADE`, `CASCADED`, `CASE`, `CAST`, `CATALOG`, `CATALOG_NAME`, `CHAIN`, `CHARACTERISTICS`, `CHARACTER_LENGTH`, `CHARACTER_SET_CATALOG`, `CHARACTER_SET_NAME`, `CHARACTER_SET_SCHEMA`, `CHAR_LENGTH`, `CHECK`, `CHECKED`, `CHECKPOINT`, `CLASS`, `CLASS_ORIGIN`, `CLOB`, `CLOSE`, `CLUSTER`, `COALSECE`, `COBOL`, `COLLATE`, `COLLATION`, `COLLATION_CATALOG`, `COLLATION_NAME`, `COLLATION_SCHEMA`, `COLUMN`, `COLUMN_NAME`, `COMMAND_FUNCTION`, `COMMAND_FUNCTION_CODE`, `COMMENT`, `COMMIT`, `COMMITTED`, `COMPLETION`, `CONDITION_NUMBER`, `CONNECT`, `CONNECTION`, `CONNECTION_NAME`, `CONSTRAINT`, `CONSTRAINTS`, `CONSTRAINT_CATALOG`, `CONSTRAINT_NAME`, `CONSTRAINT_SCHEMA`, `CONSTRUCTOR`, `CONTAINS`, `CONTINUE`, `CONVERSION`, `CONVERT`, `COPY`, `CORRESPONTING`, `COUNT`, `CREATE`, `CREATEDB`, `CREATEUSER`, `CROSS`, `CUBE`, `CURRENT`, `CURRENT_DATE`, `CURRENT_PATH`, `CURRENT_ROLE`, `CURRENT_TIME`, `CURRENT_TIMESTAMP`, `CURRENT_USER`, `CURSOR`, `CURSOR_NAME`, `CYCLE`, `DATA`, `DATABASE`, `DATETIME_INTERVAL_CODE`, `DATETIME_INTERVAL_PRECISION`, `DAY`, `DEALLOCATE`, `DECLARE`, `DEFAULT`, `DEFAULTS`, `DEFERRABLE`, `DEFERRED`, `DEFINED`, `DEFINER`, `DELETE`, `DELIMITER`, `DELIMITERS`, `DEREF`, `DESC`, `DESCRIBE`, `DESCRIPTOR`, `DESTROY`, `DESTRUCTOR`, `DETERMINISTIC`, `DIAGNOSTICS`, `DICTIONARY`, `DISCONNECT`, `DISPATCH`, `DISTINCT`, `DO`, `DOMAIN`, `DROP`, `DYNAMIC`, `DYNAMIC_FUNCTION`, `DYNAMIC_FUNCTION_CODE`, `EACH`, `ELSE`, `ELSIF`, `ENCODING`, `ENCRYPTED`, `END`, `END-EXEC`, `EQUALS`, `ESCAPE`, `EVERY`, `EXCEPTION`, `EXCEPT`, `EXCLUDING`, `EXCLUSIVE`, `EXEC`, `EXECUTE`, `EXISTING`, `EXISTS`, `EXPLAIN`, `EXTERNAL`, `EXTRACT`, `FALSE`, `FETCH`, `FINAL`, `FIRST`, `FOR`, `FORCE`, `FOREIGN`, `FORTRAN`, `FORWARD`, `FOUND`, `FREE`, `FREEZE`, `FROM`, `FULL`, `FUNCTION`, `G`, `GENERAL`, `GENERATED`, `GET`, `GLOBAL`, `GO`, `GOTO`, `GRANT`, `GRANTED`, `GROUP`, `GROUPING`, `HANDLER`, `HAVING`, `HIERARCHY`, `HOLD`, `HOST`, `IDENTITY`, `IF`, `IGNORE`, `ILIKE`, `IMMEDIATE`, `IMMUTABLE`, `IMPLEMENTATION`, `IMPLICIT`, `IN`, `INCLUDING`, `INCREMENT`, `INDEX`, `INDITCATOR`, `INFIX`, `INHERITS`, `INITIALIZE`, `INITIALLY`, `INNER`, `INOUT`, `INPUT`, `INSENSITIVE`, `INSERT`, `INSTANTIABLE`, `INSTEAD`, `INTERSECT`, `INTO`, `INVOKER`, `IS`, `ISNULL`, `ISOLATION`, `ITERATE`, `JOIN`, `KEY`, `KEY_MEMBER`, `KEY_TYPE`, `LANCOMPILER`, `LANGUAGE`, `LARGE`, `LAST`, `LATERAL`, `LEADING`, `LEFT`, `LENGTH`, `LESS`, `LEVEL`, `LIKE`, `LIMIT`, `LISTEN`, `LOAD`, `LOCAL`, `LOCALTIME`, `LOCALTIMESTAMP`, `LOCATION`, `LOCATOR`, `LOCK`, `LOWER`, `MAP`, `MATCH`, `MAX`, `MAXVALUE`, `MESSAGE_LENGTH`, `MESSAGE_OCTET_LENGTH`, `MESSAGE_TEXT`, `METHOD`, `MIN`, `MINUTE`, `MINVALUE`, `MOD`, `MODE`, `MODIFIES`, `MODIFY`, `MONTH`, `MORE`, `MOVE`, `MUMPS`, `NAMES`, `NATIONAL`, `NATURAL`, `NCHAR`, `NCLOB`, `NEW`, `NEXT`, `NO`, `NOCREATEDB`, `NOCREATEUSER`, `NONE`, `NOT`, `NOTHING`, `NOTIFY`, `NOTNULL`, `NULL`, `NULLABLE`, `NULLIF`, `OBJECT`, `OCTET_LENGTH`, `OF`, `OFF`, `OFFSET`, `OIDS`, `OLD`, `ON`, `ONLY`, `OPEN`, `OPERATION`, `OPERATOR`, `OPTION`, `OPTIONS`, `OR`, `ORDER`, `ORDINALITY`, `OUT`, `OUTER`, `OUTPUT`, `OVERLAPS`, `OVERLAY`, `OVERRIDING`, `OWNER`, `PAD`, `PARAMETER`, `PARAMETERS`, `PARAMETER_MODE`, `PARAMATER_NAME`, `PARAMATER_ORDINAL_POSITION`, `PARAMETER_SPECIFIC_CATALOG`, `PARAMETER_SPECIFIC_NAME`, `PARAMATER_SPECIFIC_SCHEMA`, `PARTIAL`, `PASCAL`, `PENDANT`, `PLACING`, `PLI`, `POSITION`, `POSTFIX`, `PRECISION`, `PREFIX`, `PREORDER`, `PREPARE`, `PRESERVE`, `PRIMARY`, `PRIOR`, `PRIVILEGES`, `PROCEDURAL`, `PROCEDURE`, `PUBLIC`, `READ`, `READS`, `RECHECK`, `RECURSIVE`, `REF`, `REFERENCES`, `REFERENCING`, `REINDEX`, `RELATIVE`, `RENAME`, `REPEATABLE`, `REPLACE`, `RESET`, `RESTART`, `RESTRICT`, `RESULT`, `RETURN`, `RETURNED_LENGTH`, `RETURNED_OCTET_LENGTH`, `RETURNED_SQLSTATE`, `RETURNS`, `REVOKE`, `RIGHT`, `ROLE`, `ROLLBACK`, `ROLLUP`, `ROUTINE`, `ROUTINE_CATALOG`, `ROUTINE_NAME`, `ROUTINE_SCHEMA`, `ROW`, `ROWS`, `ROW_COUNT`, `RULE`, `SAVE_POINT`, `SCALE`, `SCHEMA`, `SCHEMA_NAME`, `SCOPE`, `SCROLL`, `SEARCH`, `SECOND`, `SECURITY`, `SELECT`, `SELF`, `SENSITIVE`, `SERIALIZABLE`, `SERVER_NAME`, `SESSION`, `SESSION_USER`, `SET`, `SETOF`, `SETS`, `SHARE`, `SHOW`, `SIMILAR`, `SIMPLE`, `SIZE`, `SOME`, `SOURCE`, `SPACE`, `SPECIFIC`, `SPECIFICTYPE`, `SPECIFIC_NAME`, `SQL`, `SQLCODE`, `SQLERROR`, `SQLEXCEPTION`, `SQLSTATE`, `SQLWARNINIG`, `STABLE`, `START`, `STATE`, `STATEMENT`, `STATIC`, `STATISTICS`, `STDIN`, `STDOUT`, `STORAGE`, `STRICT`, `STRUCTURE`, `STYPE`, `SUBCLASS_ORIGIN`, `SUBLIST`, `SUBSTRING`, `SUM`, `SYMMETRIC`, `SYSID`, `SYSTEM`, `SYSTEM_USER`, `TABLE`, `TABLE_NAME`, ` TEMP`, `TEMPLATE`, `TEMPORARY`, `TERMINATE`, `THAN`, `THEN`, `TIMESTAMP`, `TIMEZONE_HOUR`, `TIMEZONE_MINUTE`, `TO`, `TOAST`, `TRAILING`, `TRANSACTION`, `TRANSACTIONS_COMMITTED`, `TRANSACTIONS_ROLLED_BACK`, `TRANSACTION_ACTIVE`, `TRANSFORM`, `TRANSFORMS`, `TRANSLATE`, `TRANSLATION`, `TREAT`, `TRIGGER`, `TRIGGER_CATALOG`, `TRIGGER_NAME`, `TRIGGER_SCHEMA`, `TRIM`, `TRUE`, `TRUNCATE`, `TRUSTED`, `TYPE`, `UNCOMMITTED`, `UNDER`, `UNENCRYPTED`, `UNION`, `UNIQUE`, `UNKNOWN`, `UNLISTEN`, `UNNAMED`, `UNNEST`, `UNTIL`, `UPDATE`, `UPPER`, `USAGE`, `USER`, `USER_DEFINED_TYPE_CATALOG`, `USER_DEFINED_TYPE_NAME`, `USER_DEFINED_TYPE_SCHEMA`, `USING`, `VACUUM`, `VALID`, `VALIDATOR`, `VALUES`, `VARIABLE`, `VERBOSE`, `VERSION`, `VIEW`, `VOLATILE`, `WHEN`, `WHENEVER`, `WHERE`, `WITH`, `WITHOUT`, `WORK`, `WRITE`, `YEAR`, `ZONE`), Keyword, nil}, {Words(``, `\b`, `ARRAY`, `BIGINT`, `BINARY`, `BIT`, `BLOB`, `BOOLEAN`, `CHAR`, `CHARACTER`, `DATE`, `DEC`, `DECIMAL`, `FLOAT`, `INT`, `INTEGER`, `INTERVAL`, `NUMBER`, `NUMERIC`, `REAL`, `SERIAL`, `SMALLINT`, `VARCHAR`, `VARYING`, `INT8`, `SERIAL8`, `TEXT`), NameBuiltin, nil}, {"[+*/<>=~!@#%^&|`?-]", Operator, nil}, {`[0-9]+`, LiteralNumberInteger, nil}, diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/tradingview.go b/vendor/github.com/alecthomas/chroma/lexers/t/tradingview.go index 0614a568..e3d8a7ac 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/t/tradingview.go +++ b/vendor/github.com/alecthomas/chroma/lexers/t/tradingview.go @@ -5,7 +5,7 @@ import ( "github.com/alecthomas/chroma/lexers/internal" ) -// TradingView lexer. +// TradingView lexer var TradingView = internal.Register(MustNewLexer( &Config{ Name: "TradingView", @@ -26,10 +26,12 @@ var TradingView = internal.Register(MustNewLexer( {`'\\.'|'[^\\]'`, LiteralString, nil}, {`[0-9](\.[0-9]*)?([eE][+-][0-9]+)?`, LiteralNumber, nil}, {`#[a-fA-F0-9]{8}|#[a-fA-F0-9]{6}|#[a-fA-F0-9]{3}`, LiteralStringOther, nil}, - {`(abs|acos|alertcondition|alma|asin|atan|atr|avg|barcolor|barssince|bgcolor|cci|ceil|change|cog|correlation|cos|crossover|crossunder|cum|dev|ema|exp|falling|fill|fixnan|floor|heikinashi|highest|highestbars|hline|iff|input|kagi|linebreak|linreg|log|log10|lowest|lowestbars|macd|max|min|mom|nz|percentile_(linear_interpolation|nearest_rank)|percentrank|pivothigh|pivotlow|plot|plotarrow|plotbar|plotcandle|plotchar|plotshape|pointfigure|pow|renko|rising|rma|roc|round|rsi|sar|security|sign|sin|sma|sqrt|stdev|stoch|study|sum|swma|tan|timestamp|tostring|tsi|valuewhen|variance|vwma|wma|strategy\.(cancel|cancel_all|close|close_all|entry|exit|order|risk\.(allow_entry_in|max_cons_loss_days|max_drawdown|max_intraday_filled_orders|max_intraday_loss|max_position_size)))\b`, NameFunction, nil}, - {`\b(cross|dayofmonth|dayofweek|hour|minute|month|na|offset|second|strategy|tickerid|time|tr|vwap|weekofyear|year)(\()`, ByGroups(NameFunction, Text), nil}, // functions that can also be variable - {`(accdist|adjustment\.(dividends|none|splits)|aqua|area|areabr|black|blue|bool|circles|close|columns|currency\.(AUD|CAD|CHF|EUR|GBP|HKD|JPY|NOK|NONE|NZD|RUB|SEK|SGD|TRY|USD|ZAR)|dashed|dotted|float|friday|fuchsia|gray|green|high|histogram|hl2|hlc3|integer|interval|isdaily|isdwm|isintraday|ismonthly|isweekly|lime|line|linebr|location\.(abovebar|absolute|belowbar|bottom|top)|low|maroon|monday|n|navy|ohlc4|olive|open|orange|period|purple|red|resolution|saturday|scale\.(left|none|right)|session|session\.(extended|regular)|silver|size\.(auto|huge|large|normal|small|tiny)|solid|source|stepline|string|sunday|symbol|syminfo\.(mintick|pointvalue|prefix|root|session|timezone)|teal|thursday|ticker|timenow|tuesday|volume|wednesday|white|yellow|strategy\.(cash|closedtrades|commission\.(cash_per_contract|cash_per_order|percent)|direction\.(all|long|short)|equity|eventrades|fixed|grossloss|grossprofit|initial_capital|long|losstrades|max_contracts_held_(all|long|short)|max_drawdown|netprofit|oca\.(cancel|none|reduce)|openprofit|opentrades|percent_of_equity|position_avg_price|position_entry_name|position_size|short|wintrades)|shape\.(arrowdown|arrowup|circle|cross|diamond|flag|labeldown|labelup|square|triangledown|triangleup|xcross)|barstate\.is(first|history|last|new|realtime)|barmerge\.(gaps_on|gaps_off|lookahead_on|lookahead_off))\b`, NameVariable, nil}, + {`(abs|acos|alertcondition|alma|asin|atan|atr|avg|barcolor|barssince|bgcolor|cci|ceil|change|cog|color\.new|correlation|cos|crossover|crossunder|cum|dev|ema|exp|falling|fill|fixnan|floor|heikinashi|highest|highestbars|hline|iff|kagi|label\.(delete|get_text|get_x|get_y|new|set_color|set_size|set_style|set_text|set_textcolor|set_x|set_xloc|set_xy|set_y|set_yloc)|line\.(new|delete|get_x1|get_x2|get_y1|get_y2|set_color|set_width|set_style|set_extend|set_xy1|set_xy2|set_x1|set_x2|set_y1|set_y2|set_xloc)|linebreak|linreg|log|log10|lowest|lowestbars|macd|max|max_bars_back|min|mom|nz|percentile_(linear_interpolation|nearest_rank)|percentrank|pivothigh|pivotlow|plot|plotarrow|plotbar|plotcandle|plotchar|plotshape|pointfigure|pow|renko|rising|rma|roc|round|rsi|sar|security|sign|sin|sma|sqrt|stdev|stoch|study|sum|swma|tan|timestamp|tostring|tsi|valuewhen|variance|vwma|wma|strategy\.(cancel|cancel_all|close|close_all|entry|exit|order|risk\.(allow_entry_in|max_cons_loss_days|max_drawdown|max_intraday_filled_orders|max_intraday_loss|max_position_size)))\b`, NameFunction, nil}, + {`\b(bool|color|cross|dayofmonth|dayofweek|float|hour|input|int|label|line|minute|month|na|offset|second|strategy|string|tickerid|time|tr|vwap|weekofyear|year)(\()`, ByGroups(NameFunction, Text), nil}, // functions that can also be variable + {`(accdist|adjustment\.(dividends|none|splits)|aqua|area|areabr|bar_index|black|blue|bool|circles|close|columns|currency\.(AUD|CAD|CHF|EUR|GBP|HKD|JPY|NOK|NONE|NZD|RUB|SEK|SGD|TRY|USD|ZAR)|color\.(aqua|black|blue|fuchsia|gray|green|lime|maroon|navy|olive|orange|purple|red|silver|teal|white|yellow)|dashed|dotted|dayofweek\.(monday|tuesday|wednesday|thursday|friday|saturday|sunday)|extend\.(both|left|right|none)|float|format\.(inherit|price|volume)|friday|fuchsia|gray|green|high|histogram|hl2|hlc3|hline\.style_(dotted|solid|dashed)|input\.(bool|float|integer|resolution|session|source|string|symbol)|integer|interval|isdaily|isdwm|isintraday|ismonthly|isweekly|label\.style_(arrowdown|arrowup|circle|cross|diamond|flag|labeldown|labelup|none|square|triangledown|triangleup|xcross)|lime|line\.style_(dashed|dotted|solid|arrow_both|arrow_left|arrow_right)|linebr|location\.(abovebar|absolute|belowbar|bottom|top)|low|maroon|monday|n|navy|ohlc4|olive|open|orange|period|plot\.style_(area|areabr|circles|columns|cross|histogram|line|linebr|stepline)|purple|red|resolution|saturday|scale\.(left|none|right)|session|session\.(extended|regular)|silver|size\.(auto|huge|large|normal|small|tiny)|solid|source|stepline|string|sunday|symbol|syminfo\.(mintick|pointvalue|prefix|root|session|ticker|tickerid|timezone)|teal|thursday|ticker|timeframe\.(isdaily|isdwm|isintraday|ismonthly|isweekly|multiplier|period)|timenow|tuesday|volume|wednesday|white|yellow|strategy\.(cash|closedtrades|commission\.(cash_per_contract|cash_per_order|percent)|direction\.(all|long|short)|equity|eventrades|fixed|grossloss|grossprofit|initial_capital|long|losstrades|max_contracts_held_(all|long|short)|max_drawdown|netprofit|oca\.(cancel|none|reduce)|openprofit|opentrades|percent_of_equity|position_avg_price|position_entry_name|position_size|short|wintrades)|shape\.(arrowdown|arrowup|circle|cross|diamond|flag|labeldown|labelup|square|triangledown|triangleup|xcross)|barstate\.is(first|history|last|new|realtime)|barmerge\.(gaps_on|gaps_off|lookahead_on|lookahead_off)|xloc\.bar_(index|time)|yloc\.(abovebar|belowbar|price))\b`, NameVariable, nil}, {`(cross|dayofmonth|dayofweek|hour|minute|month|na|second|tickerid|time|tr|vwap|weekofyear|year)(\b[^\(])`, ByGroups(NameVariable, Text), nil}, // variables that can also be function + {`(int|float|bool|color|string|label|line)(\b[^\(=.])`, ByGroups(KeywordType, Text), nil}, // types that can also be a function + {`(var)\b`, KeywordType, nil}, {`(true|false)\b`, KeywordConstant, nil}, {`(and|or|not|if|else|for|to)\b`, OperatorWord, nil}, {`@?[_a-zA-Z]\w*`, Text, nil}, diff --git a/vendor/github.com/alecthomas/chroma/lexers/t/typescript.go b/vendor/github.com/alecthomas/chroma/lexers/t/typescript.go index 07bae024..57d08bf1 100644 --- a/vendor/github.com/alecthomas/chroma/lexers/t/typescript.go +++ b/vendor/github.com/alecthomas/chroma/lexers/t/typescript.go @@ -13,6 +13,7 @@ var TypeScript = internal.Register(MustNewLexer( Filenames: []string{"*.ts", "*.tsx"}, MimeTypes: []string{"text/x-typescript"}, DotAll: true, + EnsureNL: true, }, Rules{ "commentsandwhitespace": { diff --git a/vendor/github.com/alecthomas/chroma/lexers/v/vue.go b/vendor/github.com/alecthomas/chroma/lexers/v/vue.go new file mode 100644 index 00000000..5c2457de --- /dev/null +++ b/vendor/github.com/alecthomas/chroma/lexers/v/vue.go @@ -0,0 +1,107 @@ +package v + +import ( + . "github.com/alecthomas/chroma" // nolint + "github.com/alecthomas/chroma/lexers/internal" +) + +// Vue lexer. +// +// This was generated from https://github.com/testdrivenio/vue-lexer +var Vue = internal.Register(MustNewLexer( + &Config{ + Name: "vue", + Aliases: []string{"vue", "vuejs"}, + Filenames: []string{"*.vue"}, + MimeTypes: []string{"text/x-vue", "application/x-vue"}, + DotAll: true, + }, + Rules{ + "commentsandwhitespace": { + {`\s+`, Text, nil}, + {`