Octopus.Script exported 2021-03-17 by adamoctoclose belongs to ‘Octopus’ category.
Step template to Register an Listening Deployment Target with Octopus Deploy using the API. Useful when spinning up machines and you want to wait to register until the machine finishes installing all additional software.
Parameters
When steps based on the template are included in a project’s deployment process, the parameters below can be set.
Octopus Base Url
RegisterListeningTarget.Octopus.Base.Url =
The base url of your Octopus Deploy instance. Example: https://samples.octopus.app
Octopus Api Key
RegisterListeningTarget.Octopus.Api.Key =
The API key of a user in Octopus Deploy who has permissions to register the cluster.
Machine Name
RegisterListeningTarget.Machine.Name =
The name of the machine to register with Octopus Deploy.
Machine Address
RegisterListeningTarget.Machine.Address =
The machine address (IP Address or Domain Name) to connect to
Port Number
RegisterListeningTarget.Machine.Port = 10933
The port the tentacle is listening on
Role CSV List
RegisterListeningTarget.Roles.List =
Comma separated list of environments to assign to the machine in Octopus Deploy.
Environment CSV List
RegisterListeningTarget.Environment.List =
Comma separated list of environments to assign to the the machine in Octopus Deploy.
Tenant CSV List
RegisterListeningTarget.Tenant.List =
(Optional) If this is for a tenant, the a comma separated list of tenants to assign the machine to in Octopus Deploy
Tenanted Deployments
RegisterListeningTarget.Tenant.DeploymentType = Untenanted
Choose the kind of deployment where this deployment target should be included.
Machine Policy Id Or Name
RegisterListeningTarget.MachinePolicy.IdOrName = Default Machine Policy
Enter in the name or the Id of the Machine Policy in Octopus Deploy for the AKS Cluster.
Overwrite Existing Registration
RegisterListeningTarget.Overwrite.Existing = False
Indicates if the existing listening tentacle should be overwritten in Octopus.
Script body
Steps based on this template will execute the following PowerShell script.
[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
$OctopusAPIKey = $OctopusParameters["RegisterListeningTarget.Octopus.Api.Key"]
$RegistrationName = $OctopusParameters["RegisterListeningTarget.Machine.Name"]
$RegistrationAddress = $OctopusParameters["RegisterListeningTarget.Machine.Address"]
$OctopusUrl = $OctopusParameters["RegisterListeningTarget.Octopus.Base.Url"]
$Roles = $OctopusParameters["RegisterListeningTarget.Roles.List"]
$Environments = $OctopusParameters["RegisterListeningTarget.Environment.List"]
$SpaceId = $OctopusParameters["Octopus.Space.Id"]
$MachinePolicyIdOrName = $OctopusParameters["RegisterListeningTarget.MachinePolicy.IdOrName"]
$Tenants = $OctopusParameters["RegisterListeningTarget.Tenant.List"]
$DeploymentType = $OctopusParameters["RegisterListeningTarget.Tenant.DeploymentType"]
$PortNumber = $OctopusParameters["RegisterListeningTarget.Machine.Port"]
$OverwriteExisting = $OctopusParameters["RegisterListeningTarget.Overwrite.Existing"]
$OverwriteExisting = $OverwriteExisting -eq "True"
Write-Host "Machine Name: $RegistrationName"
Write-Host "Machine Address: $RegistrationAddress"
Write-Host "Machine Port: $PortNumber"
Write-Host "Octopus Url: $OctopusUrl"
Write-Host "Role List: $Roles"
Write-Host "Environments: $Environments"
Write-Host "Machine Policy Name or Id: $MachinePolicyIdOrName"
Write-Host "Tenant List: $Tenants"
Write-Host "Deployment Type: $DeploymentType"
Write-Host "Overwrite Existing: $OverwriteExisting"
$header = New-Object "System.Collections.Generic.Dictionary[[String],[String]]"
$header.Add("X-Octopus-ApiKey", $OctopusAPIKey)
# If tenanted only deployments is set then you require at least one tenant in the tenant list
if($tenantList -eq $null -and $DeploymentType -eq "Tenanted"){
Fail-Step "Tenanted only deployments require at least one associated tenants!"
}
$baseApiUrl = "$OctopusUrl/api"
$baseApiInformation = Invoke-RestMethod $baseApiUrl -Headers $header
if ((Get-Member -InputObject $baseApiInformation.Links -Name "Spaces" -MemberType Properties) -ne $null)
{
$baseApiUrl = "$baseApiUrl/$SpaceId"
}
Write-Host "Base API Url: $baseApiUrl"
$existingMachineResultsUrl = "$baseApiUrl/machines?partialName=$RegistrationName&skip=0&take=1000"
Write-Host "Attempting to find existing machine with similar name at $existingMachineResultsUrl"
$existingMachineResponse = Invoke-RestMethod $existingMachineResultsUrl -Headers $header
Write-Host $existingMachineResponse
$machineFound = $false
$machineId = $null
foreach ($item in $existingMachineResponse.Items)
{
if ($item.Name -eq $RegistrationName)
{
$machineFound = $true
if ($OverwriteExisting)
{
$machineId = $item.Id
}
break
}
}
if ($machineFound -and $OverwriteExisting -eq $false)
{
Write-Highlight "Machine already exists, skipping registration"
Exit 0
}
$roleList = $Roles -split ","
$environmentList = $Environments -split ","
$environmentIdList = @()
Write-Host "Getting the ids for all environments specified"
foreach($environment in $environmentList)
{
Write-Host "Getting the id for the environment $environment"
$environmentEscaped = $environment.Replace(" ", "%20")
$environmentUrl = "$baseApiUrl/environments?skip=0&take=1000&name=$environmentEscaped"
$environmentResponse = Invoke-RestMethod $environmentUrl -Headers $header
$environmentId = $environmentResponse.Items[0].Id
Write-Host "The id for environment $environment is $environmentId"
$environmentIdList += $environmentId
}
$tenantList = $Tenants -split ","
$tenantIdList = @()
# If tenant list is null then no need to go trhough this or it will pick the first tenant from all the tenants in Octopus
if($tenantIdList -ne $null){
foreach($tenant in $tenantList)
{
Write-Host "Getting the id for tenant $tenant"
$tenantEscaped = $tenant.Replace(" ", "%20")
$tenantUrl = "$baseApiUrl/tenants?skip=0&take=1000&name=$tenantEscaped"
$tenantResponse = Invoke-RestMethod $tenantUrl -Headers $header
$tenantId = $tenantResponse.Items[0].Id
Write-Host "The id for tenant $tenant is $tenantId"
$tenantIdList += $tenantId
}
}
$machinePolicyId = $machinePolicyIdOrName
if ($machinePolicyIdOrName.StartsWith("MachinePolicies-") -eq $false)
{
Write-Host "The machine policy specified $machinePolicyIdOrName appears to be a name"
$machinePolicyNameEscaped = $machinePolicyIdOrName.Replace(" ", "%20")
$machinePolicyResponse = Invoke-RestMethod "$baseApiUrl/machinepolicies?partialName=$machinePolicyNameEscaped" -Headers $header
$machinePolicyId = $machinePolicyResponse.Items[0].Id
Write-Host "The machine policy id is $machinePolicyId"
}
$discoverUrl = "$baseApiUrl/machines/discover?host=$RegistrationAddress&port=$PortNumber&type=TentaclePassive"
Write-Host "Discovering the machine $discoverUrl"
$discoverResponse = Invoke-RestMethod $discoverUrl -Headers $header
Write-Host "ProjectResponse: $discoverResponse"
$machineThumbprint = $discoverResponse.EndPoint.Thumbprint
Write-Host "Thumbprint = $machineThumbprint"
$rawRequest = @{
Id = $machineId;
MachinePolicyId = $machinePolicyId;
Name = $RegistrationName;
IsDisabled = $false;
HealthStatus = "Unknown";
HasLatestCalamari = $true;
StatusSummary = $null;
IsInProcess = $true;
Endpoint = @{
Id = $null;
CommunicationStyle = "TentaclePassive";
Links = $null;
Uri = "https://$RegistrationAddress`:$PortNumber";
Thumbprint = "$machineThumbprint";
ProxyId = $null
};
Links = $null;
Roles = $roleList;
EnvironmentIds = $environmentIdList;
TenantIds = $tenantIdList;
TenantTags = $null;
TenantedDeploymentParticipation = $DeploymentType
}
$jsonRequest = $rawRequest | ConvertTo-Json -Depth 10
Write-Host "Sending in the request $jsonRequest"
$machineUrl = "$baseApiUrl/machines"
$method = "POST"
if ($OverwriteExisting -and $machineId -ne $null)
{
$machineUrl = "$machineUrl/$machineId"
$method = "PUT"
}
Write-Host "Posting to url $machineUrl"
$machineResponse = Invoke-RestMethod $machineUrl -Headers $header -Method $method -Body $jsonRequest
Write-Host "Create machine's response: $machineResponse"
Provided under the Apache License version 2.0.
To use this template in Octopus Deploy, copy the JSON below and paste it into the Library → Step templates → Import dialog.
{
"Id": "6f95a351-a1a1-43d1-a378-410a9acf0e60",
"Name": "Register Listening Deployment Target with Octopus",
"Description": "Step template to Register an Listening Deployment Target with Octopus Deploy using the API. Useful when spinning up machines and you want to wait to register until the machine finishes installing all additional software.",
"Version": 2,
"ExportedAt": "2021-03-17T15:37:29.866Z",
"ActionType": "Octopus.Script",
"Author": "adamoctoclose",
"Packages": [],
"Parameters": [
{
"Id": "e98dc4e2-0766-4d2d-a753-eafe294fdeea",
"Name": "RegisterListeningTarget.Octopus.Base.Url",
"Label": "Octopus Base Url",
"HelpText": "The base url of your Octopus Deploy instance. Example: https://samples.octopus.app",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "cb3cdd41-3d1f-49c6-820e-acfa24bf5a88",
"Name": "RegisterListeningTarget.Octopus.Api.Key",
"Label": "Octopus Api Key",
"HelpText": "The API key of a user in Octopus Deploy who has permissions to register the cluster.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "Sensitive"
}
},
{
"Id": "ca9d9733-2032-466b-9e80-2aa6abd3c977",
"Name": "RegisterListeningTarget.Machine.Name",
"Label": "Machine Name",
"HelpText": "The name of the machine to register with Octopus Deploy.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "1d3d8695-27a3-4d3e-9457-6b483253a609",
"Name": "RegisterListeningTarget.Machine.Address",
"Label": "Machine Address",
"HelpText": "The machine address (IP Address or Domain Name) to connect to",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "ea762a1e-07ee-4eec-af7a-b6e29bf274d8",
"Name": "RegisterListeningTarget.Machine.Port",
"Label": "Port Number",
"HelpText": "The port the tentacle is listening on",
"DefaultValue": "10933",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "fa4bd89d-bb86-4d3f-87ff-17125cd88f24",
"Name": "RegisterListeningTarget.Roles.List",
"Label": "Role CSV List",
"HelpText": "Comma separated list of environments to assign to the machine in Octopus Deploy.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "0c80326d-cdc1-439d-be6b-fbab4da42cda",
"Name": "RegisterListeningTarget.Environment.List",
"Label": "Environment CSV List",
"HelpText": "Comma separated list of environments to assign to the the machine in Octopus Deploy.",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "667a18b3-1694-4333-87a4-9be712b59122",
"Name": "RegisterListeningTarget.Tenant.List",
"Label": "Tenant CSV List",
"HelpText": "(Optional) If this is for a tenant, the a comma separated list of tenants to assign the machine to in Octopus Deploy",
"DefaultValue": "",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "db2de612-45bb-4e4a-ab95-64083dd80393",
"Name": "RegisterListeningTarget.Tenant.DeploymentType",
"Label": "Tenanted Deployments",
"HelpText": "Choose the kind of deployment where this deployment target should be included.",
"DefaultValue": "Untenanted",
"DisplaySettings": {
"Octopus.ControlType": "Select",
"Octopus.SelectOptions": "Untenanted|Exclude from tenanted deployments (default)\nTenanted|Include only in tenanted deployments\nTenantedOrUntenanted|Include in both tenanted and untenanted deployments"
}
},
{
"Id": "5ef91f37-b13b-413d-955c-872c7f274c7e",
"Name": "RegisterListeningTarget.MachinePolicy.IdOrName",
"Label": "Machine Policy Id Or Name",
"HelpText": "Enter in the name or the Id of the Machine Policy in Octopus Deploy for the AKS Cluster.",
"DefaultValue": "Default Machine Policy",
"DisplaySettings": {
"Octopus.ControlType": "SingleLineText"
}
},
{
"Id": "5b2e0993-7f96-4447-b47b-029c8f225688",
"Name": "RegisterListeningTarget.Overwrite.Existing",
"Label": "Overwrite Existing Registration",
"HelpText": "Indicates if the existing listening tentacle should be overwritten in Octopus.",
"DefaultValue": "False",
"DisplaySettings": {
"Octopus.ControlType": "Checkbox"
}
}
],
"Properties": {
"Octopus.Action.RunOnServer": "true",
"Octopus.Action.Script.ScriptSource": "Inline",
"Octopus.Action.Script.Syntax": "PowerShell",
"Octopus.Action.Script.ScriptBody": "[Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12\n\n$OctopusAPIKey = $OctopusParameters[\"RegisterListeningTarget.Octopus.Api.Key\"]\n$RegistrationName = $OctopusParameters[\"RegisterListeningTarget.Machine.Name\"]\n$RegistrationAddress = $OctopusParameters[\"RegisterListeningTarget.Machine.Address\"]\n$OctopusUrl = $OctopusParameters[\"RegisterListeningTarget.Octopus.Base.Url\"]\n$Roles = $OctopusParameters[\"RegisterListeningTarget.Roles.List\"]\n$Environments = $OctopusParameters[\"RegisterListeningTarget.Environment.List\"]\n$SpaceId = $OctopusParameters[\"Octopus.Space.Id\"]\n$MachinePolicyIdOrName = $OctopusParameters[\"RegisterListeningTarget.MachinePolicy.IdOrName\"]\n$Tenants = $OctopusParameters[\"RegisterListeningTarget.Tenant.List\"]\n$DeploymentType = $OctopusParameters[\"RegisterListeningTarget.Tenant.DeploymentType\"]\n$PortNumber = $OctopusParameters[\"RegisterListeningTarget.Machine.Port\"]\n$OverwriteExisting = $OctopusParameters[\"RegisterListeningTarget.Overwrite.Existing\"]\n$OverwriteExisting = $OverwriteExisting -eq \"True\"\n\nWrite-Host \"Machine Name: $RegistrationName\"\nWrite-Host \"Machine Address: $RegistrationAddress\"\nWrite-Host \"Machine Port: $PortNumber\"\nWrite-Host \"Octopus Url: $OctopusUrl\"\nWrite-Host \"Role List: $Roles\"\nWrite-Host \"Environments: $Environments\"\nWrite-Host \"Machine Policy Name or Id: $MachinePolicyIdOrName\"\nWrite-Host \"Tenant List: $Tenants\"\nWrite-Host \"Deployment Type: $DeploymentType\"\nWrite-Host \"Overwrite Existing: $OverwriteExisting\"\n\n$header = New-Object \"System.Collections.Generic.Dictionary[[String],[String]]\"\n$header.Add(\"X-Octopus-ApiKey\", $OctopusAPIKey)\n\n# If tenanted only deployments is set then you require at least one tenant in the tenant list\nif($tenantList -eq $null -and $DeploymentType -eq \"Tenanted\"){\n\tFail-Step \"Tenanted only deployments require at least one associated tenants!\"\n}\n\n$baseApiUrl = \"$OctopusUrl/api\"\n$baseApiInformation = Invoke-RestMethod $baseApiUrl -Headers $header\nif ((Get-Member -InputObject $baseApiInformation.Links -Name \"Spaces\" -MemberType Properties) -ne $null)\n{ \t\n\t$baseApiUrl = \"$baseApiUrl/$SpaceId\" \n}\n\nWrite-Host \"Base API Url: $baseApiUrl\"\n\n$existingMachineResultsUrl = \"$baseApiUrl/machines?partialName=$RegistrationName&skip=0&take=1000\"\nWrite-Host \"Attempting to find existing machine with similar name at $existingMachineResultsUrl\"\n$existingMachineResponse = Invoke-RestMethod $existingMachineResultsUrl -Headers $header\nWrite-Host $existingMachineResponse\n\n$machineFound = $false\n$machineId = $null\nforeach ($item in $existingMachineResponse.Items)\n{\n\tif ($item.Name -eq $RegistrationName)\n {\n \t$machineFound = $true\n if ($OverwriteExisting)\n {\n \t$machineId = $item.Id \n }\n break\n }\n}\n\nif ($machineFound -and $OverwriteExisting -eq $false)\n{\n\tWrite-Highlight \"Machine already exists, skipping registration\"\n Exit 0\n}\n\n$roleList = $Roles -split \",\"\n$environmentList = $Environments -split \",\"\n$environmentIdList = @()\nWrite-Host \"Getting the ids for all environments specified\"\nforeach($environment in $environmentList)\n{\n\tWrite-Host \"Getting the id for the environment $environment\"\n $environmentEscaped = $environment.Replace(\" \", \"%20\")\n $environmentUrl = \"$baseApiUrl/environments?skip=0&take=1000&name=$environmentEscaped\"\n $environmentResponse = Invoke-RestMethod $environmentUrl -Headers $header \n\n $environmentId = $environmentResponse.Items[0].Id\n Write-Host \"The id for environment $environment is $environmentId\"\n $environmentIdList += $environmentId\n}\n$tenantList = $Tenants -split \",\"\n$tenantIdList = @()\n\n# If tenant list is null then no need to go trhough this or it will pick the first tenant from all the tenants in Octopus\nif($tenantIdList -ne $null){\n\n\tforeach($tenant in $tenantList)\n\t{\n\t\tWrite-Host \"Getting the id for tenant $tenant\"\n\t\t$tenantEscaped = $tenant.Replace(\" \", \"%20\")\n\t\t$tenantUrl = \"$baseApiUrl/tenants?skip=0&take=1000&name=$tenantEscaped\"\n\t\t$tenantResponse = Invoke-RestMethod $tenantUrl -Headers $header \n\t\n\t\t$tenantId = $tenantResponse.Items[0].Id\n\t\tWrite-Host \"The id for tenant $tenant is $tenantId\"\n\t\t$tenantIdList += $tenantId\n\t}\n\t\n}\n\n\n\n$machinePolicyId = $machinePolicyIdOrName\nif ($machinePolicyIdOrName.StartsWith(\"MachinePolicies-\") -eq $false)\n{\n\tWrite-Host \"The machine policy specified $machinePolicyIdOrName appears to be a name\"\n\t$machinePolicyNameEscaped = $machinePolicyIdOrName.Replace(\" \", \"%20\")\n\t$machinePolicyResponse = Invoke-RestMethod \"$baseApiUrl/machinepolicies?partialName=$machinePolicyNameEscaped\" -Headers $header\n \n $machinePolicyId = $machinePolicyResponse.Items[0].Id\n Write-Host \"The machine policy id is $machinePolicyId\"\n}\n\n$discoverUrl = \"$baseApiUrl/machines/discover?host=$RegistrationAddress&port=$PortNumber&type=TentaclePassive\"\nWrite-Host \"Discovering the machine $discoverUrl\"\n$discoverResponse = Invoke-RestMethod $discoverUrl -Headers $header \nWrite-Host \"ProjectResponse: $discoverResponse\"\n\n$machineThumbprint = $discoverResponse.EndPoint.Thumbprint\nWrite-Host \"Thumbprint = $machineThumbprint\"\n\n$rawRequest = @{\n\tId = $machineId;\n\tMachinePolicyId = $machinePolicyId;\n\tName = $RegistrationName;\n\tIsDisabled = $false;\n\tHealthStatus = \"Unknown\";\n\tHasLatestCalamari = $true;\n\tStatusSummary = $null;\n\tIsInProcess = $true;\n\tEndpoint = @{\n \t\tId = $null;\n\t\tCommunicationStyle = \"TentaclePassive\";\n\t\tLinks = $null;\n\t\tUri = \"https://$RegistrationAddress`:$PortNumber\";\n\t\tThumbprint = \"$machineThumbprint\";\n\t\tProxyId = $null\n\t};\n\tLinks = $null;\t\n\tRoles = $roleList;\n\tEnvironmentIds = $environmentIdList;\n\tTenantIds = $tenantIdList;\n\tTenantTags = $null;\n\tTenantedDeploymentParticipation = $DeploymentType\n}\n\n$jsonRequest = $rawRequest | ConvertTo-Json -Depth 10\n\nWrite-Host \"Sending in the request $jsonRequest\"\n\n$machineUrl = \"$baseApiUrl/machines\"\n\n$method = \"POST\"\nif ($OverwriteExisting -and $machineId -ne $null)\n{\n\t$machineUrl = \"$machineUrl/$machineId\" \n \t$method = \"PUT\"\n}\nWrite-Host \"Posting to url $machineUrl\"\n$machineResponse = Invoke-RestMethod $machineUrl -Headers $header -Method $method -Body $jsonRequest\n\nWrite-Host \"Create machine's response: $machineResponse\""
},
"Category": "Octopus",
"HistoryUrl": "https://github.com/OctopusDeploy/Library/commits/master/step-templates//opt/buildagent/work/75443764cd38076d/step-templates/octopus-register-listening-target.json",
"Website": "/step-templates/6f95a351-a1a1-43d1-a378-410a9acf0e60",
"Logo": "iVBORw0KGgoAAAANSUhEUgAAAMgAAADICAMAAACahl6sAAAAGXRFWHRTb2Z0d2FyZQBBZG9iZSBJbWFnZVJlYWR5ccllPAAAAC1QTFRFT6Tl////L5Pg8vj9Y67omsvwPJrisdfzfbzs5fL7y+T32Ov5isLucLXqvt31CJPHWwAABMJJREFUeNrs3deW4jAMAFDF3U75/89dlp0ZhiU4blJEjvQ8hYubLJsA00UCBCIQgQhEIAIRiEAEIhCBCEQgAhGIQAQiEIEIhD8kJm+t+QprfdKfB9HbYpx6CWfspj8HMi+gMgHL/AmQA8W3JTKH+ALFvzCeL0RbpyoCPE9IJeNOSQwh5Z3qd6yRGWQ2qi2cZQWxqj1WzQYSjeoJmJlAklOd4VlArOqPhQEkqBERToeMcfRJBkC0Uep8CfBpjz4JsHJ0zF3dkEWNje0kiB/sUC6eApndaIiCMyAa1PiwJ0AWhRGJHJJQHG2dC7h1rNbO1QOxSA7lNCkkKrQIpJCAB1GREILYIC1NAiwbpKFJgGWDNExcwGstfExcZBCHC6nOglshHtmhViLIig1RNBCN7qjtW8C0Z1UvJcC1Z9XmwMBzzvobmgAyEzgq91dtEEsBsQSQQAFZCSBAATEEEApHZbrVBIkkEIUPSVeB+KtALA0kXQUSrwKZBCIQBnk8Y4i5CsReBeKvkqLM+BCSDWJlrZFvGk9SRTHshkgjZCGAaArIxm3H3grhVzFlW2msfl1ca79UJ1bofYvsDHHlNdTZnlh5MghuPd5NdBDUNZHyCkfktIh03XzALGRPlBDPac7qgWjHZzWcmF5zmmkhidMQ6boKiDXcDTUEaylZqCGJ0Vjvu/fLJtHqhSANEvqb2OYqkOUqEHuVMbJcZdZCGiPhKhC4yjqiIjEE7XThMp8fAWII3mY3kUIQD+AMKQTzPiBhgQ63HlT/KSvgtoi0dq5mCPah1UIE0eh3sT0NhOByvKeAkFzi8PgQomumFhsyOxpIzZN4gLOj5plVwNpR0b2AuePWKBEHQu24pSsJA+LVCeHHQxZ1SiyDIdqok8IOhSSnTottHEQTdyt4ettAj4KkzA4dMikk2Dht2S5ptm1vswnPDxn0YyDZ5oDM3iToo2T5voWaYe+Q+vdjH80QyAzZhCgcDtLMI1Tmtz9w++XHgziHQHJJu/OZ3bs9Xn8gQ72NcP3dKqEfkp10F51xhoIi2I91R+LurXV/5q7pH+wx061CzO16oSQleMyr8fXvwMA0Pro8432DPD/ySx8XrHfSuDAM8n6UhnjQabaiXf5Bq/lREHvEeNtn1rJ08+C/uXkQZHeguxAPC3UvtcJYUogLzZX5hhZZvS6onG5lxXtzWGaygwb79vT/IXhdlNibwlKYOR6T8xjI7W8n+xV7T+GH4tMzWwR+lZhRkJYSsC0thpmCYqyngOz3rN2FLBZ2wZflBCggUHF0Vnp88JKienzIXLSEZCZqU7IKr/gQW9yx3pzV7Y9kvWZWTRRIqDmTtRUnU7b2lLcTYmoqHqnmiO1poER0SPkAeZMAZxaJx0Y3TCdAclsIqDz03ALcyxfTCZBsthoGXWmigGyVhWPLFJJfuuKQWycoEFdXbH4dJJoJxNR1eD/kshz6yn48cF8yW8sFoitflB1w6Q8n+/15Za7oA17/pYNmYgP5fmWm8L1NOHPWgK8kuFew1/JXtOA0yJCv7ah7X8ObUuT5kObU30+fDZm8+zqP+HTIpK0xQ796b5Kv2hSIQAQiEIEIRCACEYhABCIQgQhEIAIRiEAEIpBf8UeAAQAEjtYmlDTcCgAAAABJRU5ErkJggg==",
"$Meta": {
"Type": "ActionTemplate"
}
}
Page updated on Wednesday, March 17, 2021