Defender Status - script lies. Defender NOT Healthy

I wouldn't usually create an issue in community scripts but considering you can disable defender and this script will still say its HEALTHY seems like a huge missing.
https://github.com/amidaware/community-scripts/blob/116e51dcfa448e37fee787c22f5300dd4c636619/scripts/Win_Defender_Status_Report.ps1#L35

I'll look into that

I wouldn't usually create an issue in community scripts

Why not?

hows this?
<#
.Synopsis
    Defender - Status Report
.DESCRIPTION
    This will check Event Log for Windows Defender Malware and Antispyware reports, otherwise will report as Healthy. By default if no command parameter is provided it will check the last 1 day (good for a scheduled daily task).
    If a number is provided as a command parameter it will search back that number of days back provided (good for collecting all AV alerts on the computer).
    Additionally, it will use Get-MpComputerStatus to report on the overall health and status of Windows Defender.
.EXAMPLE
    .\DefenderStatusReport.ps1 -DaysBack 365 -FullScanThreshold 7 -QuickScanThreshold 1 -SignatureUpdateThreshold 1
.NOTES
    v1 dinger initial release 2021
    v1.1 bdrayer Adding full message output if items found
    v1.2 added extra event IDs for ASR monitoring suggested by SDM216
    v1.3 added Get-MpComputerStatus for comprehensive Defender health status
#>

param (
    [int]$DaysBack = 1,
    [int]$FullScanThreshold = 7,
    [int]$QuickScanThreshold = 1,
    [int]$SignatureUpdateThreshold = 1
)

$ErrorActionPreference = 'SilentlyContinue'
$TimeSpan = (Get-Date) - (New-TimeSpan -Day $DaysBack)

$eventFilter = @{
    LogName = 'Microsoft-Windows-Windows Defender/Operational'
    ID = '1122', '1012', '1009', '1119', '1118', '1008', '1006', '1116', '1121', '1015', '1124', '1123', '1160'
    StartTime = $TimeSpan
}

$events = Get-WinEvent -FilterHashtable $eventFilter
$issueFound = $false

if ($events) {
    Write-Output "Virus Found or Issue with Defender"
    $events | Select-Object -ExpandProperty Message -First 1
    $issueFound = $true
}

# Additional health status from Get-MpComputerStatus
$mpStatus = Get-MpComputerStatus

$defenderErrors = @()
if (-not $mpStatus.AMServiceEnabled) { $defenderErrors += "Antimalware Service is not enabled" }
if (-not $mpStatus.AntispywareEnabled) { $defenderErrors += "Antispyware is not enabled" }
if (-not $mpStatus.AntivirusEnabled) { $defenderErrors += "Antivirus is not enabled" }
if (-not $mpStatus.RealTimeProtectionEnabled) { $defenderErrors += "Real-time protection is not enabled" }
if (-not $mpStatus.NISEnabled) { $defenderErrors += "Network Inspection System is not enabled" }

if ($mpStatus.FullScanAge -gt $FullScanThreshold) { $defenderErrors += "Full scan has not been performed in the last $FullScanThreshold days" }
if ($mpStatus.QuickScanAge -gt $QuickScanThreshold) { $defenderErrors += "Quick scan has not been performed in the last $QuickScanThreshold days" }

# Check if signature updates are within the acceptable timeframe
$signatureDate = [DateTime]::ParseExact($mpStatus.AntivirusSignatureVersion.Split('-')[0], "yyyyMMdd", $null)
$signatureAge = (Get-Date) - $signatureDate
if ($signatureAge.Days -gt $SignatureUpdateThreshold) { $defenderErrors += "Antivirus signatures have not been updated in the last $SignatureUpdateThreshold days" }

if ($defenderErrors.Count -gt 0) {
    Write-Output "Issues found with Windows Defender status:"
    $defenderErrors | ForEach-Object { Write-Output $_ }
    $issueFound = $true
}

if (-not $issueFound) {
    Write-Output "No Virus Found, Defender is Healthy"
    $healthyEvents = Get-WinEvent -FilterHashtable @{LogName = 'Microsoft-Windows-Windows Defender/Operational'; ID = '1150', '1001'; StartTime = $TimeSpan }
    $healthyEvents | ForEach-Object { $_.Message }
}

Write-Output "Windows Defender Status Report:"
Write-Output "--------------------------------"
Write-Output "Service Enabled: $($mpStatus.AMServiceEnabled)"
Write-Output "Antispyware Enabled: $($mpStatus.AntispywareEnabled)"
Write-Output "Antivirus Enabled: $($mpStatus.AntivirusEnabled)"
Write-Output "Full Scan Age: $($mpStatus.FullScanAge) Days ago"
Write-Output "Quick Scan Age: $($mpStatus.QuickScanAge) Days ago"
Write-Output "Real Time Protection Enabled: $($mpStatus.RealTimeProtectionEnabled)"
Write-Output "NIS Enabled: $($mpStatus.NISEnabled)"
Write-Output "Engine Version: $($mpStatus.AMEngineVersion)"
Write-Output "Signature Version: $($mpStatus.AntivirusSignatureVersion)"

if ($issueFound) {
    exit 1
} else {
    exit 0
}

Anything I have missed? this is the output of Get-MpComputerStatus
AMEngineVersion                  : 1.1.24060.5
AMProductVersion                 : 4.18.24060.7
AMRunningMode                    : Normal
AMServiceEnabled                 : True
AMServiceVersion                 : 4.18.24060.7
AntispywareEnabled               : True
AntispywareSignatureAge          : 0
AntispywareSignatureLastUpdated  : 27/07/2024 01:55:01
AntispywareSignatureVersion      : 1.415.348.0
AntivirusEnabled                 : True
AntivirusSignatureAge            : 0
AntivirusSignatureLastUpdated    : 27/07/2024 01:55:00
AntivirusSignatureVersion        : 1.415.348.0
BehaviorMonitorEnabled           : True
ComputerID                       : 8479BDD3-8D27-4071-B785-BDB344B5F85B
ComputerState                    : 0
DefenderSignaturesOutOfDate      : False
DeviceControlDefaultEnforcement  :
DeviceControlPoliciesLastUpdated : 27/03/2023 01:05:50
DeviceControlState               : Disabled
FullScanAge                      :<PHONE_NUMBER>
FullScanEndTime                  :
FullScanOverdue                  : False
FullScanRequired                 : False
FullScanSignatureVersion         :
FullScanStartTime                :
InitializationProgress           : ServiceStartedSuccessfully
IoavProtectionEnabled            : True
IsTamperProtected                : True
IsVirtualMachine                 : False
LastFullScanSource               : 0
LastQuickScanSource              : 2
NISEnabled                       : True
NISEngineVersion                 : 1.1.24060.5
NISSignatureAge                  : 0
NISSignatureLastUpdated          : 27/07/2024 01:55:00
NISSignatureVersion              : 1.415.348.0
OnAccessProtectionEnabled        : True
ProductStatus                    : 524288
QuickScanAge                     : 3
QuickScanEndTime                 : 24/07/2024 11:22:08
QuickScanOverdue                 : False
QuickScanSignatureVersion        : 1.415.295.0
QuickScanStartTime               : 24/07/2024 11:19:15
RealTimeProtectionEnabled        : True
RealTimeScanDirection            : 0
RebootRequired                   : False
SmartAppControlExpiration        :
SmartAppControlState             : Off
TamperProtectionSource           : Signatures
TDTCapable                       : N/A
TDTMode                          : N/A
TDTSiloType                      : N/A
TDTStatus                        : N/A
TDTTelemetry                     : N/A
TroubleShootingDailyMaxQuota     :
TroubleShootingDailyQuotaLeft    :
TroubleShootingEndTime           :
TroubleShootingExpirationLeft    :
TroubleShootingMode              :
TroubleShootingModeSource        :
TroubleShootingQuotaResetTime    :
TroubleShootingStartTime         :
PSComputerName                   :

Before Write-Output "Windows Defender Status Report:":
# Cleanup some variables for rendering
if ($mpStatus.FullScanAge -ge<PHONE_NUMBER>) {
    # If never ran, will report an absurdly large number instead.
    $FullScanAge = "NEVER RAN"
}
else {
    $FullScanAge = "$($mpStatus.FullScanAge) Days ago"
}

if ($mpStatus.QuickScanAge -ge<PHONE_NUMBER>) {
    # If never ran, will report an absurdly large number instead.
    $QuickScanAge = "NEVER RAN"
}
else {
    $QuickScanAge = "$($mpStatus.QuickScanAge) Days ago"
}

Then swap the 2 corresponding lines in the output with:
Write-Output "Full Scan Age: $FullScanAge"
Write-Output "Quick Scan Age: $QuickScanAge"

Fixes Full Scan Age:<PHONE_NUMBER> Days ago from being displayed.
"Never Ran?" "Never Run?"  One of the two is correct, I never remember which is grammatically correct.

Never ran would be grammatically correct.
I was thinking also if it's over a high number to make it never ran. Probably over 6 years (2,190 days) then it's never ran?
Does that make sense?

Yeah, that would work too.  One of my boxes reported that specific number as did Silversword's, so that's just what I used.  If it's 2190 days, that should be sufficiently useful too.

thoughts on this? Do we need anything from Get-MpComputerStatus
<#
.SYNOPSIS
    Defender - Status Report
.DESCRIPTION
    This script checks Windows Defender status for malware and antispyware reports and reports overall health status. By default, it checks the last 1 day, but this can be adjusted with parameters.
    The script also uses Get-MpComputerStatus to report on the overall health and status of Windows Defender.
.PARAMETER DaysBack
    Specifies the number of days back to search for AV alerts on the computer.
.PARAMETER FullScanThreshold
    Specifies the threshold in days for the full scan age. If set to 0, the check is disabled.
.PARAMETER QuickScanThreshold
    Specifies the threshold in days for the quick scan age. If set to 0, the check is disabled.
.PARAMETER SignatureUpdateThreshold
    Specifies the threshold in days for the signature update age.
.EXAMPLE
    .\DefenderStatusReport.ps1 -DaysBack 365 -FullScanThreshold 7 -QuickScanThreshold 1 -SignatureUpdateThreshold 1
    Checks the status of Windows Defender for the past 365 days, with thresholds for full scan, quick scan, and signature updates.
.EXAMPLE
    .\DefenderStatusReport.ps1 -DaysBack 30 -FullScanThreshold 0 -QuickScanThreshold 0 -SignatureUpdateThreshold 1
    Checks the status of Windows Defender for the past 30 days, but disables the checks for full and quick scan ages.
.NOTES
    v1 dinger initial release 2021
    v1.1 bdrayer Adding full message output if items found
    v1.2 added extra event IDs for ASR monitoring suggested by SDM216
    v1.3 dinger added Get-MpComputerStatus for comprehensive Defender health status, added parameters, replaced Event Viewer checks with PowerShell commands, added logic for "Never Ran" and exit codes
#>

param (
    [int]$DaysBack = 1,
    [int]$FullScanThreshold = 7,
    [int]$QuickScanThreshold = 1,
    [int]$SignatureUpdateThreshold = 1
)

$ErrorActionPreference = 'SilentlyContinue'
$TimeSpan = (Get-Date).AddDays(-$DaysBack)

# Check for detected threats within the date range
$threats = Get-MpThreat | Where-Object { $_.DetectionTime -ge $TimeSpan }
$issueFound = $false

if ($threats) {
    Write-Output "Defender has found Threats"
    Write-Output "--------------------------------"
    $threats | Select-Object -ExpandProperty ThreatName -First 1
    $issueFound = $true
    Write-Output " "
}

# Check for ASR events in the Event Viewer
$asrEventFilter = @{
    LogName = 'Microsoft-Windows-Windows Defender/Operational'
    ID = '1122', '1123', '1124', '1125', '1126', '1127', '1128', '1129', '1130', '1131'
    StartTime = $TimeSpan
}

$asrEvents = Get-WinEvent -FilterHashtable $asrEventFilter

if ($asrEvents) {
    Write-Output "ASR Rule Hit Detected"
    Write-Output "--------------------------------"
    $asrEvents | Select-Object -ExpandProperty Message -First 1
    $issueFound = $true
    Write-Output " "
}

# Additional health status from Get-MpComputerStatus
$mpStatus = Get-MpComputerStatus

$defenderErrors = @()
if (-not $mpStatus.AMServiceEnabled) { $defenderErrors += "Antimalware Service is not enabled" }
if (-not $mpStatus.AntispywareEnabled) { $defenderErrors += "Antispyware is not enabled" }
if (-not $mpStatus.AntivirusEnabled) { $defenderErrors += "Antivirus is not enabled" }
if (-not $mpStatus.RealTimeProtectionEnabled) { $defenderErrors += "Real-time protection is not enabled" }
if (-not $mpStatus.NISEnabled) { $defenderErrors += "Network Inspection System is not enabled" }

if ($FullScanThreshold -ne 0) {
    if ($mpStatus.FullScanAge -eq<PHONE_NUMBER> -or $mpStatus.FullScanAge -gt 2190) {
        $defenderErrors += "Full scan has Never Ran"
    } elseif ($mpStatus.FullScanAge -gt $FullScanThreshold) {
        $defenderErrors += "Full scan has not been performed in the last $FullScanThreshold days"
    }

    if ($mpStatus.FullScanOverdue) { $defenderErrors += "Full scan is overdue" }
}

if ($QuickScanThreshold -ne 0) {
    if ($mpStatus.QuickScanAge -eq<PHONE_NUMBER> -or $mpStatus.QuickScanAge -gt 2190) {
        $defenderErrors += "Quick scan has Never Ran"
    } elseif ($mpStatus.QuickScanAge -gt $QuickScanThreshold) {
        $defenderErrors += "Quick scan has not been performed in the last $QuickScanThreshold days"
    }

    if ($mpStatus.QuickScanOverdue) { $defenderErrors += "Quick scan is overdue" }
}

# Check if signature updates are within the acceptable timeframe
if ($mpStatus.AntivirusSignatureAge -gt $SignatureUpdateThreshold) { $defenderErrors += "Antivirus signatures have not been updated in the last $SignatureUpdateThreshold days" }

if ($defenderErrors.Count -gt 0) {
    Write-Output "Issues found with Windows Defender status:"
    Write-Output "--------------------------------"
    $defenderErrors | ForEach-Object { Write-Output $_ }
    $issueFound = $true
    Write-Output " "
}

if (-not $issueFound) {
    Write-Output "Defender is Healthy"
    Write-Output " "
}

Write-Output "Windows Defender Status Report:"
Write-Output "--------------------------------"
Write-Output "Service Enabled: $($mpStatus.AMServiceEnabled)"
Write-Output "Antispyware Enabled: $($mpStatus.AntispywareEnabled)"
Write-Output "Antivirus Enabled: $($mpStatus.AntivirusEnabled)"

# Display scan ages or 'Never Ran'
if ($FullScanThreshold -eq 0) {
    Write-Output "Full Scan Age: Disabled"
} elseif ($mpStatus.FullScanAge -eq<PHONE_NUMBER> -or $mpStatus.FullScanAge -gt 2190) {
    Write-Output "Full Scan Age: Never Ran"
} else {
    Write-Output "Full Scan Age: $($mpStatus.FullScanAge) Days ago"
}

if ($QuickScanThreshold -eq 0) {
    Write-Output "Quick Scan Age: Disabled"
} elseif ($mpStatus.QuickScanAge -eq<PHONE_NUMBER> -or $mpStatus.QuickScanAge -gt 2190) {
    Write-Output "Quick Scan Age: Never Ran"
} else {
    Write-Output "Quick Scan Age: $($mpStatus.QuickScanAge) Days ago"
}

Write-Output "Real Time Protection Enabled: $($mpStatus.RealTimeProtectionEnabled)"
Write-Output "NIS Enabled: $($mpStatus.NISEnabled)"
Write-Output "Engine Version: $($mpStatus.AMEngineVersion)"
Write-Output "Signature Version: $($mpStatus.AntivirusSignatureVersion)"

if ($issueFound) {
    $host.SetShouldExit(1)
} else {
    $host.SetShouldExit(0)
}

on the back of this updated the defender enable script
<#
.SYNOPSIS
    Enables Windows Defender and sets preferences to enhance security on workstations Win10+.
.DESCRIPTION
    Windows Defender in its default configuration provides basic protections. Running this script will enable additional settings to increase security.
    The script includes options to enable or disable full scans, quick scans, and ASR rules, and to manage controlled folder access.
.PARAMETER FullScanFrequency
    Specifies the frequency in days for scheduling full scans. If set to 0, full scans are disabled.
.PARAMETER QuickScanFrequency
    Specifies the frequency in days for scheduling quick scans. If set to 0, quick scans are disabled.
.PARAMETER SignatureUpdateFrequency
    Specifies the frequency in hours for scheduling signature updates.
.PARAMETER NoControlledFolders
    Adding this parameter will not enable Controlled Folders.
.PARAMETER AuditOnly
    Adding this parameter will set ASR rules to Audit mode.
.EXAMPLE
    .\SetupDefender.ps1 -FullScanFrequency 7 -QuickScanFrequency 1 -SignatureUpdateFrequency 8
    Configures Windows Defender to run full scans every 7 days, quick scans every 1 day, and signature updates every 8 hours.
.EXAMPLE
    .\SetupDefender.ps1 -FullScanFrequency 0 -QuickScanFrequency 0 -SignatureUpdateFrequency 8
    Configures Windows Defender to disable the scheduling of full and quick scans.
.EXAMPLE
    .\SetupDefender.ps1 -NoControlledFolders -AuditOnly
    Configures Windows Defender without enabling Controlled Folders and sets ASR rules to Audit mode.
.NOTES
    v1 dinger initial release 2021
    v1.1 adding command parameters for Controlled Folder access by Tremor and silversword
    v1.2 adding command parameter for audit mode for ASR and added extra ASR rules suggested by SDM216
    v1.3 adding parameters to manage scan frequencies and ASR rules
#>

param (
    [int]$FullScanFrequency = 7,
    [int]$QuickScanFrequency = 1,
    [int]$SignatureUpdateFrequency = 8,
    [switch]$NoControlledFolders,
    [switch]$AuditOnly
)

# Verifies that script is running on Windows 10 or greater
function Check-IsWindows10 {
    if ([System.Environment]::OSVersion.Version.Major -ge "10") {
        Write-Output $true
    }
    else {
        Write-Output $false
    }
}

# Verifies that script is running on Windows 10 1709 or greater
function Check-IsWindows10-1709 {
    if ([System.Environment]::OSVersion.Version.Build -ge 16299) {
        Write-Output $true
    }
    else {
        Write-Output $false
    }
}

function SetRegistryKey([string]$key, [int]$value) {
    # Editing Windows Defender settings AV via registry is NOT supported. This is a scripting workaround instead of using Group Policy or SCCM for Windows 10 version 1703
    $amRegistryPath = "HKLM:\Software\Policies\Microsoft\Microsoft Antimalware\MpEngine"
    $wdRegistryPath = "HKLM:\Software\Policies\Microsoft\Windows Defender\MpEngine"
    $regPathToUse = $wdRegistryPath # Default to WD path
    if (Test-Path $amRegistryPath) {
        $regPathToUse = $amRegistryPath
    }
    New-ItemProperty -Path $regPathToUse -Name $key -Value $value -PropertyType DWORD -Force | Out-Null
}

#### Setup Windows Defender Secure Settings

# Start Windows Defender Service
Set-Service -Name "WinDefend" -Status running -StartupType automatic
Set-Service -Name "WdNisSvc" -Status running -StartupType automatic

# Enable real-time monitoring
Set-MpPreference -DisableRealtimeMonitoring 0

# Enable cloud-delivered protection
Set-MpPreference -MAPSReporting Advanced

# Enable sample submission
Set-MpPreference -SubmitSamplesConsent 1

# Enable checking signatures before scanning
Set-MpPreference -CheckForSignaturesBeforeRunningScan 1

# Enable behavior monitoring
Set-MpPreference -DisableBehaviorMonitoring 0

# Enable IOAV protection
Set-MpPreference -DisableIOAVProtection 0

# Enable script scanning
Set-MpPreference -DisableScriptScanning 0

# Enable removable drive scanning
Set-MpPreference -DisableRemovableDriveScanning 0

# Enable Block at first sight
Set-MpPreference -DisableBlockAtFirstSeen 0

# Enable potentially unwanted apps
Set-MpPreference -PUAProtection Enabled

# Schedule signature updates
Set-MpPreference -SignatureUpdateInterval $SignatureUpdateFrequency

# Enable archive scanning
Set-MpPreference -DisableArchiveScanning 0

# Enable email scanning
Set-MpPreference -DisableEmailScanning 0

# Schedule full scans if not disabled
if ($FullScanFrequency -ne 0) {
    Set-MpPreference -ScanFull -ScanScheduleDay 0 -ScanScheduleQuickScanTime $(Get-Date).AddDays($FullScanFrequency)
} else {
    Write-Output "Full scans are disabled"
}

# Schedule quick scans if not disabled
if ($QuickScanFrequency -ne 0) {
    Set-MpPreference -ScanQuick -ScanScheduleDay 0 -ScanScheduleQuickScanTime $(Get-Date).AddDays($QuickScanFrequency)
} else {
    Write-Output "Quick scans are disabled"
}

# Configure ASR rules if AuditOnly is specified
if ($AuditOnly) {
    Write-Output "Enabling Exploit Guard ASR rules and setting to Audit mode"
    #Block abuse of exploited vulnerable signed drivers
    Set-MpPreference -AttackSurfaceReductionRules_Ids "56a863a9-875e-4185-98a7-b882c64b5ce5" -AttackSurfaceReductionRules_Actions AuditMode
    #Block executable content from email client and webmail
    Add-MpPreference -AttackSurfaceReductionRules_Ids "BE9BA2D9-53EA-4CDC-84E5-9B1EEEE46550" -AttackSurfaceReductionRules_Actions AuditMode
    #Block all Office applications from creating child processes
    Add-MpPreference -AttackSurfaceReductionRules_Ids "D4F940AB-401B-4EFC-AADC-AD5F3C50688A" -AttackSurfaceReductionRules_Actions AuditMode
    #Block Office applications from creating executable content
    Add-MpPreference -AttackSurfaceReductionRules_Ids "3B576869-A4EC-4529-8536-B80A7769E899" -AttackSurfaceReductionRules_Actions AuditMode
    #Block Office applications from injecting code into other processes
    Add-MpPreference -AttackSurfaceReductionRules_Ids "75668C1F-73B5-4CF0-BB93-3ECF5CB7CC84" -AttackSurfaceReductionRules_Actions AuditMode
    #Block JavaScript or VBScript from launching downloaded executable content
    Add-MpPreference -AttackSurfaceReductionRules_Ids "D3E037E1-3EB8-44C8-A917-57927947596D" -AttackSurfaceReductionRules_Actions AuditMode
    #Block execution of potentially obfuscated scripts
    Add-MpPreference -AttackSurfaceReductionRules_Ids "5BEB7EFE-FD9A-4556-801D-275E5FFC04CC" -AttackSurfaceReductionRules_Actions AuditMode
    #Block Win32 API calls from Office macros
    Add-MpPreference -AttackSurfaceReductionRules_Ids "92E97FA1-2EDF-4476-BDD6-9DD0B4DDDC7B" -AttackSurfaceReductionRules_Actions AuditMode
    #Block executable files from running unless they meet a prevalence, age, or trusted list criterion
    Add-MpPreference -AttackSurfaceReductionRules_Ids "01443614-cd74-433a-b99e-2ecdc07bfc25" -AttackSurfaceReductionRules_Actions AuditMode
    #Use advanced protection against ransomware
    Add-MpPreference -AttackSurfaceReductionRules_Ids "c1db55ab-c21a-4637-bb3f-a12568109d35" -AttackSurfaceReductionRules_Actions AuditMode
    #Block credential stealing from the Windows local security authority subsystem (lsass.exe)
    Add-MpPreference -AttackSurfaceReductionRules_Ids "9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2" -AttackSurfaceReductionRules_Actions AuditMode
    #Block process creations originating from PSExec and WMI commands
    Add-MpPreference -AttackSurfaceReductionRules_Ids "d1e49aac-8f56-4280-b9ba-993a6d77406c" -AttackSurfaceReductionRules_Actions AuditMode
    #Block untrusted and unsigned processes that run from USB
    Add-MpPreference -AttackSurfaceReductionRules_Ids "b2b3f03d-6a65-4f7b-a9c7-1c7ef74a9ba4" -AttackSurfaceReductionRules_Actions AuditMode
    #Block Office communication application from creating child processes
    Add-MpPreference -AttackSurfaceReductionRules_Ids "26190899-1602-49e8-8b27-eb1d0a1ce869" -AttackSurfaceReductionRules_Actions AuditMode
    #Block Adobe Reader from creating child processes
    Add-MpPreference -AttackSurfaceReductionRules_Ids "7674ba52-37eb-4a4f-a9a1-f0f9a1619a2c" -AttackSurfaceReductionRules_Actions AuditMode
    #Block persistence through WMI event subscription
    Add-MpPreference -AttackSurfaceReductionRules_Ids "e6db77e5-3df2-4cf1-b95a-636979351e5b" -AttackSurfaceReductionRules_Actions AuditMode
} else {
    Write-Output "Enabling Exploit Guard ASR rules and setting to suggested modes"
    #Block abuse of exploited vulnerable signed drivers
    Set-MpPreference -AttackSurfaceReductionRules_Ids "56a863a9-875e-4185-98a7-b882c64b5ce5" -AttackSurfaceReductionRules_Actions Enabled
    #Block executable content from email client and webmail
    Add-MpPreference -AttackSurfaceReductionRules_Ids "BE9BA2D9-53EA-4CDC-84E5-9B1EEEE46550" -AttackSurfaceReductionRules_Actions Enabled
    #Block all Office applications from creating child processes
    Add-MpPreference -AttackSurfaceReductionRules_Ids "D4F940AB-401B-4EFC-AADC-AD5F3C50688A" -AttackSurfaceReductionRules_Actions Enabled
    #Block Office applications from creating executable content
    Add-MpPreference -AttackSurfaceReductionRules_Ids "3B576869-A4EC-4529-8536-B80A7769E899" -AttackSurfaceReductionRules_Actions Enabled
    #Block Office applications from injecting code into other processes
    Add-MpPreference -AttackSurfaceReductionRules_Ids "75668C1F-73B5-4CF0-BB93-3ECF5CB7CC84" -AttackSurfaceReductionRules_Actions Enabled
    #Block JavaScript or VBScript from launching downloaded executable content
    Add-MpPreference -AttackSurfaceReductionRules_Ids "D3E037E1-3EB8-44C8-A917-57927947596D" -AttackSurfaceReductionRules_Actions Enabled
    #Block execution of potentially obfuscated scripts
    Add-MpPreference -AttackSurfaceReductionRules_Ids "5BEB7EFE-FD9A-4556-801D-275E5FFC04CC" -AttackSurfaceReductionRules_Actions Enabled
    #Block Win32 API calls from Office macros
    Add-MpPreference -AttackSurfaceReductionRules_Ids "92E97FA1-2EDF-4476-BDD6-9DD0B4DDDC7B" -AttackSurfaceReductionRules_Actions Enabled
    #Block executable files from running unless they meet a prevalence, age, or trusted list criterion
    Add-MpPreference -AttackSurfaceReductionRules_Ids "01443614-cd74-433a-b99e-2ecdc07bfc25" -AttackSurfaceReductionRules_Actions Enabled
    #Use advanced protection against ransomware
    Add-MpPreference -AttackSurfaceReductionRules_Ids "c1db55ab-c21a-4637-bb3f-a12568109d35" -AttackSurfaceReductionRules_Actions Enabled
    #Block credential stealing from the Windows local security authority subsystem (lsass.exe)
    Add-MpPreference -AttackSurfaceReductionRules_Ids "9e6c4e1f-7d60-472f-ba1a-a39ef669e4b2" -AttackSurfaceReductionRules_Actions AuditMode
    #Block process creations originating from PSExec and WMI commands
    Add-MpPreference -AttackSurfaceReductionRules_Ids "d1e49aac-8f56-4280-b9ba-993a6d77406c" -AttackSurfaceReductionRules_Actions Enabled
    #Block untrusted and unsigned processes that run from USB
    Add-MpPreference -AttackSurfaceReductionRules_Ids "b2b3f03d-6a65-4f7b-a9c7-1c7ef74a9ba4" -AttackSurfaceReductionRules_Actions Enabled
    #Block Office communication application from creating child processes
    Add-MpPreference -AttackSurfaceReductionRules_Ids "26190899-1602-49e8-8b27-eb1d0a1ce869" -AttackSurfaceReductionRules_Actions AuditMode
    #Block Adobe Reader from creating child processes
    Add-MpPreference -AttackSurfaceReductionRules_Ids "7674ba52-37eb-4a4f-a9a1-f0f9a1619a2c" -AttackSurfaceReductionRules_Actions AuditMode
    #Block persistence through WMI event subscription
    Add-MpPreference -AttackSurfaceReductionRules_Ids "e6db77e5-3df2-4cf1-b95a-636979351e5b" -AttackSurfaceReductionRules_Actions Enabled
}

# Controlled Folder Access
if ($NoControlledFolders) {
    Write-Output "Skipping enabling Controlled folders"
} else {
    Write-Output "Enabling Controlled folders"
    Set-MpPreference -EnableControlledFolderAccess Enabled
}

# Check for Windows 10 version and apply respective settings
if (Check-IsWindows10-1709) {
    Write-Output "Updating Windows Defender Exploit Guard settings"
    Set-MpPreference -EnableNetworkProtection Enabled

    if ($false -eq (Test-Path ProcessMitigation.xml)) {
        Write-Output "Downloading Process Mitigation file from https://demo.wd.microsoft.com/Content/ProcessMitigation.xml"
        $url = 'https://demo.wd.microsoft.com/Content/ProcessMitigation.xml'
        Invoke-WebRequest $url -OutFile ProcessMitigation.xml
    }

    Write-Output "Enabling Exploit Protection"
    Set-ProcessMitigation -PolicyFilePath ProcessMitigation.xml
} else {
    Write-Output "Applying settings for Windows 10 version 1703 or earlier"
    SetRegistryKey -key MpCloudBlockLevel -value 2
    SetRegistryKey -key MpBafsExtendedTimeout -value 50
}

Write-Output "Settings update complete"
Write-Output "Output Windows Defender AV settings status"
Get-MpPreference

For Defender Status 1.4 Added WarnOnMissedScans switch and date on scan stuff
<#
.SYNOPSIS
    This script monitors and reports the status of Windows Defender based on specified thresholds and historical data.

.DESCRIPTION
    Performs checks on malware threats, scan frequencies, and system health related to Windows Defender, outputting a detailed status report. The script can also exit with a status code indicating the presence of issues if the 'WarnOnMissedScans' parameter is used.

.PARAMETER DaysBack
    The number of days to look back for detecting threats and system events.

.PARAMETER FullScanThreshold
    The maximum acceptable age (in days) of the last full scan before it's considered outdated.

.PARAMETER QuickScanThreshold
    The maximum acceptable age (in days) of the last quick scan before it's considered outdated.

.PARAMETER SignatureUpdateThreshold
    The maximum acceptable age (in days) of the signature updates before they're considered outdated.

.PARAMETER WarnOnMissedScans
    If set, the script exits with a status code of 1 to indicate critical issues when scans or updates are not in compliance with set thresholds.

.EXAMPLE
    -DaysBack 30 -WarnOnMissedScans
    Checks the Defender status over the past 30 days and exits with code 1 if any compliance issues are found.

.NOTES
    v1 dinger initial release 2021
    v1.1 bdrayer Adding full message output if items found
    v1.2 added extra event IDs for ASR monitoring suggested by SDM216
    v1.3 dinger added Get-MpComputerStatus for comprehensive Defender health status, added parameters and replaced Event Viewer checks with PowerShell commands
    v1.4 silversword411 and cdp1337 adding never run output cleaning and WarnOnMissedScans param
#>

param (
    [int]$DaysBack = 1,
    [int]$FullScanThreshold = 7,
    [int]$QuickScanThreshold = 1,
    [int]$SignatureUpdateThreshold = 1,
    [switch]$WarnOnMissedScans
)

$ErrorActionPreference = 'SilentlyContinue'
$TimeSpan = (Get-Date).AddDays(-$DaysBack)

# Check for detected threats within the date range
$threats = Get-MpThreat | Where-Object { $_.DetectionTime -ge $TimeSpan }
$issueFound = $false

if ($threats) {
    Write-Output "Defender has found Threats"
    Write-Output "--------------------------------"
    $threats | Select-Object -ExpandProperty ThreatName -First 1
    $issueFound = $true
    Write-Output " "
}

# Check for ASR events in the Event Viewer
$asrEventFilter = @{
    LogName = 'Microsoft-Windows-Windows Defender/Operational'
    ID = '1122', '1123', '1124', '1125', '1126', '1127', '1128', '1129', '1130', '1131'
    StartTime = $TimeSpan
}

$asrEvents = Get-WinEvent -FilterHashtable $asrEventFilter

if ($asrEvents) {
    Write-Output "ASR Rule Hit Detected"
    Write-Output "--------------------------------"
    $asrEvents | Select-Object -ExpandProperty Message -First 1
    $issueFound = $true
    Write-Output " "
}

# Additional health status from Get-MpComputerStatus
$mpStatus = Get-MpComputerStatus

$defenderErrors = @()
if (-not $mpStatus.AMServiceEnabled) { $defenderErrors += "Antimalware Service is not enabled" }
if (-not $mpStatus.AntispywareEnabled) { $defenderErrors += "Antispyware is not enabled" }
if (-not $mpStatus.AntivirusEnabled) { $defenderErrors += "Antivirus is not enabled" }
if (-not $mpStatus.RealTimeProtectionEnabled) { $defenderErrors += "Real-time protection is not enabled" }
if (-not $mpStatus.NISEnabled) { $defenderErrors += "Network Inspection System is not enabled" }

if ($mpStatus.FullScanAge -gt $FullScanThreshold) { $defenderErrors += "Full scan has not been performed in the last $FullScanThreshold days" }
if ($mpStatus.QuickScanAge -gt $QuickScanThreshold) { $defenderErrors += "Quick scan has not been performed in the last $QuickScanThreshold days" }
if ($mpStatus.FullScanOverdue) { $defenderErrors += "Full scan is overdue" }
if ($mpStatus.QuickScanOverdue) { $defenderErrors += "Quick scan is overdue" }

# Check if signature updates are within the acceptable timeframe
if ($mpStatus.AntivirusSignatureAge -gt $SignatureUpdateThreshold) { $defenderErrors += "Antivirus signatures have not been updated in the last $SignatureUpdateThreshold days" }

if ($defenderErrors.Count -gt 0) {
    Write-Output "Issues found with Windows Defender status:"
    Write-Output "--------------------------------"
    $defenderErrors | ForEach-Object { Write-Output $_ }
    $issueFound = $true
    Write-Output " "

}

if (-not $issueFound) {
    Write-Output "Defender is Healthy"
    Write-Output " "
}

# Cleanup some variables for rendering
if ($mpStatus.FullScanAge -ge 2190) {
    # If never ran, will report an absurdly large number instead.
    $FullScanAge = "NEVER RAN"
}
else {
    $FullScanAge = "$($mpStatus.FullScanAge) Days ago"
}

if ($mpStatus.QuickScanAge -ge 2190) {
    # If never ran, will report an absurdly large number instead.
    $QuickScanAge = "NEVER RAN"
}
else {
    $QuickScanAge = "$($mpStatus.QuickScanAge) Days ago"
}

Write-Output "Windows Defender Status Report:"
Write-Output "--------------------------------"
Write-Output "Service Enabled: $($mpStatus.AMServiceEnabled)"
Write-Output "Antispyware Enabled: $($mpStatus.AntispywareEnabled)"
Write-Output "Antivirus Enabled: $($mpStatus.AntivirusEnabled)"
Write-Output "Full Scan Age: $FullScanAge Days ago"
Write-Output "Quick Scan Age: $QuickScanAge Days ago"
Write-Output "Real Time Protection Enabled: $($mpStatus.RealTimeProtectionEnabled)"
Write-Output "NIS Enabled: $($mpStatus.NISEnabled)"
Write-Output "Engine Version: $($mpStatus.AMEngineVersion)"
Write-Output "Signature Version: $($mpStatus.AntivirusSignatureVersion)"

if ($issueFound) {
    if ($WarnOnMissedScans) {
        $host.SetShouldExit(1)
    } else {
        Write-Output "Issues detected, but no exit code 1 due to WarnOnMissedScans not being set."
    }
} else {
    $host.SetShouldExit(0)
}

why? already done, if you set days to 0 then it disables the check

completed status script, any comments welcome
<#
.SYNOPSIS
    Defender - Status Report
.DESCRIPTION
    This script checks Windows Defender status for malware and antispyware reports and reports overall health status. By default, it checks the last 1 day, but this can be adjusted with parameters.
    The script also uses Get-MpComputerStatus to report on the overall health and status of Windows Defender.
.PARAMETER DaysBack
    Specifies the number of days back to search for AV alerts on the computer.
.PARAMETER FullScanThreshold
    Specifies the threshold in days for the full scan age. If set to 0, the check is disabled.
.PARAMETER QuickScanThreshold
    Specifies the threshold in days for the quick scan age. If set to 0, the check is disabled.
.PARAMETER SignatureUpdateThreshold
    Specifies the threshold in days for the signature update age.
.PARAMETER CheckCloudBlockLevel
    Switch to check if the cloud block level is set to High Plus.
.PARAMETER CheckCloudExtendedTimeout
    Switch to check if the cloud extended timeout is set to 50.
.PARAMETER CheckPUAProtection
    Switch to check if protection against potentially unwanted applications is enabled.
.PARAMETER MonitorControlledFolderAccess
    Specifies whether to monitor the status of Controlled Folder Access.
.EXAMPLE
    -DaysBack 365 -FullScanThreshold 7 -QuickScanThreshold 1 -SignatureUpdateThreshold 1 -CheckCloudBlockLevel -CheckCloudExtendedTimeout -CheckPUAProtection -MonitorControlledFolderAccess
    Checks the status of Windows Defender for the past 365 days, with thresholds for full scan, quick scan, and signature updates, and verifies the cloud block level, cloud extended timeout, PUA protection, and Controlled Folder Access.
.EXAMPLE
    -DaysBack 30 -FullScanThreshold 0 -QuickScanThreshold 0 -SignatureUpdateThreshold 1
    Checks the status of Windows Defender for the past 30 days, but disables the checks for full and quick scan ages.
.NOTES
    v1 dinger initial release 2021
    v1.1 bdrayer Adding full message output if items found
    v1.2 added extra event IDs for ASR monitoring suggested by SDM216
    v1.3 dinger added Get-MpComputerStatus for comprehensive Defender health status, added parameters, replaced Event Viewer checks with PowerShell commands, added logic for "Never Ran" and exit codes
    v1.4 added additional checks for cloud block level, cloud extended timeout, and PUA protection
#>

param (
    [int]$DaysBack = 1,
    [int]$FullScanThreshold = 7,
    [int]$QuickScanThreshold = 1,
    [int]$SignatureUpdateThreshold = 1,
    [switch]$CheckCloudBlockLevel,
    [switch]$CheckCloudExtendedTimeout,
    [switch]$CheckPUAProtection,
    [switch]$MonitorControlledFolderAccess
)

$ErrorActionPreference = 'SilentlyContinue'
$TimeSpan = (Get-Date).AddDays(-$DaysBack)

# Check for detected threats within the date range
$threats = Get-MpThreat | Where-Object { $_.DetectionTime -ge $TimeSpan }
$issueFound = $false

if ($threats) {
    Write-Output "Defender has found Threats"
    Write-Output "--------------------------------"
    $threats | Select-Object -ExpandProperty ThreatName -First 1
    $issueFound = $true
    Write-Output " "
}

# Check for ASR events in the Event Viewer
$asrEventFilter = @{
    LogName = 'Microsoft-Windows-Windows Defender/Operational'
    ID = '1122', '1123', '1124', '1125', '1126', '1127', '1128', '1129', '1130', '1131'
    StartTime = $TimeSpan
}

$asrEvents = Get-WinEvent -FilterHashtable $asrEventFilter

if ($asrEvents) {
    Write-Output "ASR Rule Hit Detected"
    Write-Output "--------------------------------"
    $asrEvents | Select-Object -ExpandProperty Message -First 1
    $issueFound = $true
    Write-Output " "
}

# Additional health status from Get-MpComputerStatus
$mpStatus = Get-MpComputerStatus

$defenderErrors = @()
if (-not $mpStatus.AMServiceEnabled) { $defenderErrors += "Antimalware Service is not enabled" }
if (-not $mpStatus.AntispywareEnabled) { $defenderErrors += "Antispyware is not enabled" }
if (-not $mpStatus.AntivirusEnabled) { $defenderErrors += "Antivirus is not enabled" }
if (-not $mpStatus.RealTimeProtectionEnabled) { $defenderErrors += "Real-time protection is not enabled" }
if (-not $mpStatus.NISEnabled) { $defenderErrors += "Network Inspection System is not enabled" }

if ($FullScanThreshold -ne 0) {
    if ($mpStatus.FullScanAge -eq<PHONE_NUMBER> -or $mpStatus.FullScanAge -gt 2190) {
        $defenderErrors += "Full scan has Never Ran"
    } elseif ($mpStatus.FullScanAge -gt $FullScanThreshold) {
        $defenderErrors += "Full scan has not been performed in the last $FullScanThreshold days"
    }

    if ($mpStatus.FullScanOverdue) { $defenderErrors += "Full scan is overdue" }
}

if ($QuickScanThreshold -ne 0) {
    if ($mpStatus.QuickScanAge -eq<PHONE_NUMBER> -or $mpStatus.QuickScanAge -gt 2190) {
        $defenderErrors += "Quick scan has Never Ran"
    } elseif ($mpStatus.QuickScanAge -gt $QuickScanThreshold) {
        $defenderErrors += "Quick scan has not been performed in the last $QuickScanThreshold days"
    }

    if ($mpStatus.QuickScanOverdue) { $defenderErrors += "Quick scan is overdue" }
}

# Check if signature updates are within the acceptable timeframe
if ($mpStatus.AntivirusSignatureAge -gt $SignatureUpdateThreshold) { $defenderErrors += "Antivirus signatures have not been updated in the last $SignatureUpdateThreshold days" }

# Get preferences for additional checks
$mpPreference = Get-MpPreference

# Check if cloud block level is enabled
if ($CheckCloudBlockLevel) {
    if ($mpPreference.CloudBlockLevel -ne 2) {
        $defenderErrors += "Cloud block level is not set to High Plus"
    }
}

# Check if cloud extended timeout is enabled
if ($CheckCloudExtendedTimeout) {
    if ($mpPreference.CloudExtendedTimeout -ne 50) {
        $defenderErrors += "Cloud extended timeout is not set to 50"
    }
}

# Check if PUA protection is enabled
if ($CheckPUAProtection) {
    if ($mpPreference.PUAProtection -ne 1) {
        $defenderErrors += "PUA protection is not enabled"
    }
}

# Check additional settings using Get-MpPreference
if ($mpPreference.MAPSReporting -ne 2) {
    $defenderErrors += "Cloud-delivered protection is not enabled"
}

if ($mpPreference.DisableTamperProtection) {
    $defenderErrors += "Tamper protection is not enabled"
}

if ($mpPreference.SubmitSamplesConsent -ne 1) {
    $defenderErrors += "Automatic sample submission is not enabled"
}

# Check Controlled Folder Access if the parameter is set
if ($MonitorControlledFolderAccess -and $mpPreference.EnableControlledFolderAccess -ne 1) {
    $defenderErrors += "Controlled Folder Access is not enabled"
}

if ($defenderErrors.Count -gt 0) {
    Write-Output "Issues found with Windows Defender status:"
    Write-Output "--------------------------------"
    $defenderErrors | ForEach-Object { Write-Output $_ }
    $issueFound = $true
    Write-Output " "
}

if (-not $issueFound) {
    Write-Output "Defender is Healthy"
    Write-Output " "
}

Write-Output "Windows Defender Status Report:"
Write-Output "--------------------------------"
Write-Output "Service Enabled: $($mpStatus.AMServiceEnabled)"
Write-Output "Antispyware Enabled: $($mpStatus.AntispywareEnabled)"
Write-Output "Antivirus Enabled: $($mpStatus.AntivirusEnabled)"

# Display scan ages or 'Never Ran'
if ($FullScanThreshold -eq 0) {
    Write-Output "Full Scan Age: Disabled"
} elseif ($mpStatus.FullScanAge -eq<PHONE_NUMBER> -or $mpStatus.FullScanAge -gt 2190) {
    Write-Output "Full Scan Age: Never Ran"
} else {
    Write-Output "Full Scan Age: $($mpStatus.FullScanAge) Days ago"
}

if ($QuickScanThreshold -eq 0) {
    Write-Output "Quick Scan Age: Disabled"
} elseif ($mpStatus.QuickScanAge -eq<PHONE_NUMBER> -or $mpStatus.QuickScanAge -gt 2190) {
    Write-Output "Quick Scan Age: Never Ran"
} else {
    Write-Output "Quick Scan Age: $($mpStatus.QuickScanAge) Days ago"
}

Write-Output "Real Time Protection Enabled: $($mpStatus.RealTimeProtectionEnabled)"
Write-Output "NIS Enabled: $($mpStatus.NISEnabled)"
Write-Output "Engine Version: $($mpStatus.AMEngineVersion)"
Write-Output "Signature Version: $($mpStatus.AntivirusSignatureVersion)"

# Only output the additional settings if the corresponding checks were enabled and passed
if ($CheckCloudBlockLevel -and $mpPreference.CloudBlockLevel -eq 2) {
    Write-Output "Cloud Block Level: High Plus"
}
if ($CheckCloudExtendedTimeout -and $mpPreference.CloudExtendedTimeout -eq 50) {
    Write-Output "Cloud Extended Timeout: 50"
}
if ($CheckPUAProtection -and $mpPreference.PUAProtection -eq 1) {
    Write-Output "PUA Protection: Enabled"
}

if ($mpPreference.MAPSReporting -eq 2) {
    Write-Output "Cloud-delivered Protection Enabled"
}
if (-not $mpPreference.DisableTamperProtection) {
    Write-Output "Tamper Protection Enabled"
}
if ($mpPreference.SubmitSamplesConsent -eq 1) {
    Write-Output "Automatic Sample Submission Enabled"
}

if ($issueFound) {
    $host.SetShouldExit(1)
} else {
    $host.SetShouldExit(0)
}

i feel like some of the settings you're looking at are somewhat subjective. like CloudExtendedTimeout, CloudBlockLevel, FullScanAge
I see some of it is optional as well which is fine.
I havent messed with Get-MpThreat much but I think for that you want (Get-MpThreat).IsActive.

It's all stuff that the enable script enables so makes sense to check for it, ie full scans etc.
A lot does have params to enable/disable to make things easier and allow it to be customised.
I'll look at get threat and get that added to the script.

yeah added get-mpthreat and works fine, any other comments?
Should we make checking for full and quick scans default to 0? So it doesnt alert on them

Should we make checking for full and quick scans default to 0? So it doesnt alert on them

Yes, that was one of the two changes I made above :)

yeah I changed it all since then :) added in more stuff


Add Code of Conduct

In the past Facebook didn't promote including a Code of Conduct when creating new projects, and many projects skipped this important document. Let's fix it. :)
why make this change?:
Facebook Open Source provides a Code of Conduct statement for all
projects to follow, to promote a welcoming and safe open source community.
Exposing the COC via a separate markdown file is a standard being
promoted by Github via the Community Profile in order to meet their Open
Source Guide's recommended community standards.
As you can see, adding this file will improve the php-webdriver community profile
checklist and increase the visibility of our COC.
test plan:
Viewing it on my branch -

issue:
internal task t23481323

I'm +1 for this. But I'd like to let @gfosco or someone directly from Facebook to merge/approve this ;-).


Upgrade to 5.14.1

seems to work ok on yoe distro /yoe-qt5-wayland-image

Merged without the middle commit, because the 5.14.1 was merged to 5.14 branch now.
f13a3cec..23914740  master -> master

@schnitzeltony FYI

Yes - saw that - thanks a lot


[Event Request] codeunit 951 "Time Sheet Approval Management" - OnAfterRejectBeforeModify

Could we please have an event OnAfterRejectBeforeModify in Codeunit 951 "Time Sheet Approval Management" in function Reject?
Code Example:
procedure Reject(var TimeSheetLine: Record "Time Sheet Line")
begin
with TimeSheetLine do begin
if Status = Status::Rejected then
exit;
TestField(Status, Status::Submitted);
CheckApproverPermissions(TimeSheetLine);
Status := Status::Rejected;
// start kvspsa - Event Raiser
OnAfterRejectBeforeModify(TimeSheetLine);
// stop kvspsa
Modify(true);
OnAfterReject(TimeSheetLine);
end;
end;
Event:
[IntegrationEvent(false, false)]
local procedure OnAfterRejectBeforeModify(var TimeSheetLine: Record "Time Sheet Line")
begin
end;
Thank you and kind regards

Thanks for reporting this. We agree, and we’ll publish a fix asap, either in an update for the current version or in the next major release. We will update this issue with information about availability.


Pact DSL for java List of Map

i have to create a pact dsl part to match the json to be serialized into the following java object:
List<Map<String, List>> attributes = new ArrayList<>();
Currently i have following pact dsl part which is not working:
         .eachLike("attributes")
            .eachKeyMappedToAnArrayLike("sale")
              .stringType("new sale")
              .closeObject()
            .closeArray()
        .closeObject()
        .closeArray();

what's the issue in the above pact dsl? i am following this github page to implement that:

.eachLike("attributes") will create a Map with a key called attributes and the value is a List, which is not what you want.
Use PactDslJsonArray.arrayEachLike() which creates the outer list.


Add a panel to manage the local dictionary

This panel should be able to:

List hosts.
Allow to edit them.
Allow to create new ones.
Allow to remove some of them.
Visualize the XML output (e.g. for contributions or sharing).
Import from XML.

Now considered as a duplicate of #35.

Hi,

i.redd.it

.+

self


Make the self-hosted runner configurable as the workflow's options

Current Behavior

We had an implementation of running SMP on self-hosted runner #39 , but the configuration of self-hosted runner is hardcoded as "c3.small.x86".
Desired Behavior

We should make self-hosted runner configurable as the workflow's options, e.g. server type, location......
Implementation

Acceptance Tests

Mockups

Contributor Guide

Is this still an open need?

@leecalcote  I think yes, this issue is to make machine type can be configurable rather than hardcoding as "c3.small.x86".
@hershd23 If you're around, can you look at this?

Thank you for reopening.


bug: Payout Methods is UNPROTECTED from Authentication Check and along with Calendar their Navbars are Overflowing onto the Page Contents as well.

Describe The Bugs

The /payout-methods route is unprotected from authentication check i.e, users can access this page irrespective of them being logged in or not.
The /payout-methods and /calendar pages have their Navbar overflowing onto the page contents which leads to it not being visible completely.

To Reproduce
Steps to reproduce the behavior of Issue 1:

Visit https://app.100xdevs.com/payout-methods using any browser window that does not have your logged-in cookie (ex. incognito)
You will still be able to access this page even if you aren't logged in.

Steps to reproduce the behavior of Issue 2:

Visit /payout-methods and /calendar routes at app.100xdevs.com.
You will notice the Navbar overflows onto the contents of the page.

Expected behavior for Issue 1
Users who are logged in should only be the ones allowed to access the page. (i.e only who has the auth cookie)
Expected behavior for Issue 2
The Page Contents should follow under the Navbar with appropriate padding and margin.
Video for Issue 1
https://github.com/user-attachments/assets/e031e387-2f01-4839-ba44-47508e309e6b
Video for Issue 1
https://github.com/user-attachments/assets/2ab0671f-8389-4cac-9b62-3f28ed16322f
Info (please complete the following information):

Browser [e.g. chrome, safari]

Additional context
#1159 and #1168 already dicusses about the Navbar overlow issue but donot completey fix the authentication bug as well.

resolves #1169

Hey,
I checked out #1169 but it only solves the Navbar Overflow Issue.
Please go through this issue carefully once again, Here I have talked about both the auth check implementation in /payout-methods and the navbar overflow. Both of these issues can be solved with just a simple re-structure of the files which I did my my PR #1203. So technically #1169 does not fix this issue completely.

But your pr was empty pr


Error cloning certificates repo, please make sure you have read access to the repository you want to use

New Issue Checklist

[x] Updated fastlane to the latest version
[x] I read the Contribution Guidelines
[x] I read docs.fastlane.tools
[x] I searched for existing GitHub issues

Issue Description

I have a flutter app which use fastlane to build and push to testflight, a few days ago, it was ok, but recently it gave me Error cloning certificates repo, please make sure you have read access to the repository you want to use error in ci logs (https://github.com/triple-tree/colorful_classroom_app/runs/938744942) when clone the certificates repo. If I use the same envs locally, and it was worked too.
Command executed

    match(
      type: "appstore",
      readonly: is_ci,
      keychain_name: "keychain_name",
      keychain_password: "keychain_password"
    )

Complete output when running fastlane, including the stack trace and command used

See the detailed log of ci (https://github.com/triple-tree/colorful_classroom_app/runs/938744942).
Environment

✅ fastlane environment ✅
Stack

Key
Value

OS
10.15.5

Ruby
2.6.3

Bundler?
false

Git
git version 2.24.3 (Apple Git-128)

Installation Source
/usr/local/bin/fastlane

Host
Mac OS X 10.15.5 (19F101)

Ruby Lib Dir
/System/Library/Frameworks/Ruby.framework/Versions/2.6/usr/lib

OpenSSL Version
LibreSSL 2.8.3

Is contained
false

Is homebrew
false

Is installed via Fabric.app
false

Xcode Path
/Applications/Xcode.app/Contents/Developer/

Xcode Version
11.5

System Locale

Variable
Value

LANG
en_US.UTF-8
✅

LC_ALL
en_US.UTF-8
✅

LANGUAGE

fastlane files:
`./fastlane/Fastfile`
# This file contains the fastlane.tools configuration
# You can find the documentation at https://docs.fastlane.tools
#
# For a list of all available actions, check out
#
#     https://docs.fastlane.tools/actions
#
# For a list of all available plugins, check out
#
#     https://docs.fastlane.tools/plugins/available-plugins
#

# Uncomment the line if you want fastlane to automatically update itself
# update_fastlane

default_platform(:ios)

platform :ios do
  desc "Push a new beta build to TestFlight"

	lane :everything do
		setup
		compile
		deploy
	end

  lane :setup do
	  setup_project
  end

  lane :compile do
	  build
  end

  lane :deploy do
	  upload_testflight
  end

  private_lane :setup_project do
    create_keychain(
      name: "keychain_name",
      password: "keychain_password",
      default_keychain: true,
      unlock: true,
      timeout: 3600,
      lock_when_sleeps: false
    )
  end

  private_lane :build do
	  match(
      type: "appstore",
      readonly: is_ci,
	  	keychain_name: "keychain_name",
	  	keychain_password: "keychain_password"
  	)
    # https://docs.fastlane.tools/actions/increment_build_number/
    # increment_build_number
    build_app(workspace: "Runner.xcworkspace", scheme: "Runner", export_method: "app-store", include_bitcode: false, configuration: "Release")
  end

  private_lane :upload_testflight do
    # https://github.com/fastlane/fastlane/issues/13718
    ENV["DELIVER_ITMSTRANSPORTER_ADDITIONAL_UPLOAD_PARAMETERS"] = " "
  	upload_to_testflight(
      username: ENV["FASTLANE_USER"],
      app_identifier: ENV["APP_IDENTIFIER"],
    )
  end

end

`./fastlane/Appfile`
app_identifier("com.color.world.colorful-classroom") # The bundle identifier of your app
<EMAIL_ADDRESS># Your Apple email address

itc_team_id("121310322") # App Store Connect Team ID
team_id("RRSZCY4GHG") # Developer Portal Team ID

# For more information about the Appfile, see:
#     https://docs.fastlane.tools/advanced/#appfile

fastlane gems

Gem
Version
Update-Status

fastlane
2.154.0
✅ Up-To-Date

Loaded fastlane plugins:
No plugins Loaded
Loaded gems

Gem
Version

did_you_mean
1.3.0

slack-notifier
2.3.2

atomos
0.1.3

CFPropertyList
2.3.6

claide
1.0.3

colored2
3.1.2

nanaimo
0.2.6

xcodeproj
1.16.0

rouge
2.0.7

xcpretty
0.3.0

terminal-notifier
2.0.0

unicode-display_width
1.7.0

terminal-table
1.8.0

plist
3.5.0

public_suffix
2.0.5

addressable
2.7.0

multipart-post
2.0.0

word_wrap
1.0.0

tty-screen
0.8.0

tty-cursor
0.7.1

tty-spinner
0.9.3

babosa
1.0.3

colored
1.2

highline
1.7.10

commander-fastlane
4.4.6

excon
0.73.0

faraday
1.0.1

unf_ext
<IP_ADDRESS>

unf
0.1.4

domain_name
0.5.20190701

http-cookie
1.0.3

faraday-cookie_jar
0.0.6

faraday_middleware
1.0.0

fastimage
2.1.7

gh_inspector
1.1.3

json
2.1.0

mini_magick
4.10.1

rubyzip
2.3.0

security
0.1.3

xcpretty-travis-formatter
1.0.0

dotenv
2.7.5

bundler
1.17.2

naturally
2.2.0

simctl
1.6.8

jwt
2.1.0

uber
0.1.0

declarative
0.0.10

declarative-option
0.1.0

representable
3.0.4

retriable
3.1.2

mini_mime
1.0.2

multi_json
1.14.1

signet
0.14.0

memoist
0.16.2

os
1.1.0

googleauth
0.12.0

httpclient
2.8.3

google-api-client
0.38.0

google-cloud-env
1.3.2

google-cloud-errors
1.0.1

google-cloud-core
1.5.0

digest-crc
0.5.1

google-cloud-storage
1.26.2

emoji_regex
1.0.1

jmespath
1.4.0

aws-partitions
1.328.0

aws-eventstream
1.1.0

aws-sigv4
1.1.4

aws-sdk-core
3.99.0

aws-sdk-kms
1.34.0

aws-sdk-s3
1.68.0

forwardable
1.2.0

logger
1.3.0

stringio
0.0.2

ipaddr
1.2.2

openssl
2.1.2

ostruct
0.1.0

strscan
1.0.0

date
2.0.0

fileutils
1.1.0

etc
1.0.1

io-console
0.4.7

zlib
1.0.0

libxml-ruby
3.1.0

rexml
3.1.9

psych
3.1.0

mutex_m
0.1.0

webrick
1.4.2

generated on: 2020-08-03

@fastlane-bot Hi, robot, I have updated the output of fastlane env.


Generating new test snapshots for main - revenuecatui-15

Requested by @NachoSoto for main

Will generate with @charliemchapman's PR instead.


Colour Name & Hue for Impaired People

Along with the RBG colour, it would be nice to have a named display of what Colour Name it is along with its Hue Name.
Example from Color Name & Hue

dup #7361


Split consensus parameters into their own Config struct

The changes are not reflected in some unittests. (tests failing)

The changes are not reflected in some unittests. (tests failing)

The variables like quorum_shuffle_interval, tx_payload_max_size, tx_payload_fee_factor exists in the test code for NodeConfig as follows.
https://github.com/bpfkorea/agora/blob/ed5bc28c8a421ebabd0b71b3b796e19bed12fe0b/source/agora/common/Config.d#L464-L471
For validator_cycle, a new ConsensusParams variable is needed in files for the networking test like Base.d.

The variables like quorum_shuffle_interval, tx_payload_max_size, tx_payload_fee_factor exists in the test code for NodeConfig as follows.
https://github.com/bpfkorea/agora/blob/ed5bc28c8a421ebabd0b71b3b796e19bed12fe0b/source/agora/common/Config.d#L464-L471
For validator_cycle, a new ConsensusParams variable is needed in files for the networking test like Base.d.

I think there should be a clean-up of agora.consensus.data.Params as the next step. Thoughts?

I think there should be a clean-up of agora.consensus.data.Params as the next step. Thoughts?

I think there should be a clean-up of agora.consensus.data.Params as the next step. Thoughts?

Yep, although it's low-prio. I just wanted to avoid NodeConfig getting out of hand (also I have to add some fields to it for another PR).

I think there should be a clean-up of agora.consensus.data.Params as the next step. Thoughts?

Yep, although it's low-prio. I just wanted to avoid NodeConfig getting out of hand (also I have to add some fields to it for another PR).

std.conv.ConvOverflowException@/opt/hostedtoolcache/dc/ldc2-65b0fb88/x64/ldc2-65b0fb88-linux-x86_64/bin/../import/std/conv.d(2337): Overflow in integral conversion

Yeah maybe validator_tx_fee_cut shouldn't be a ubyte.

std.conv.ConvOverflowException@/opt/hostedtoolcache/dc/ldc2-65b0fb88/x64/ldc2-65b0fb88-linux-x86_64/bin/../import/std/conv.d(2337): Overflow in integral conversion

Yeah maybe validator_tx_fee_cut shouldn't be a ubyte.

Green

Green


Fix Home Manager Module

Fixes home manager module and adds some extra configs

tested and working on current machine

@fufexan this will fix the nix stuff and allow it to be merged into main

Oops, wanted to push another commit but it pushed everything to the nix branch. Well, that's also fine.
Thanks!


Cellrank based integration

Hello,
I was reading your preprint and code, I had a question on whether the Cellrank based integration is truly an "early" integration method. Since RNA velocity transition is computed on the reduced space you are effectively using a intermediate representation?
EDIT: To clarify, the moments (Ms) calculation is done in PCA space.
Best,
Chang

Hi Chang,
Thank you for your question and clarification! Yes, you are correct. For CellRank, I think it's fair to say it's not truly an early integration method. You are computing an intermediate representation first. You construct a cell similarity graph with the expression data in PCA space and then compute the RNA velocity transition matrix by reweighting the edges of this graph according to the RNA velocity directionality prior to taking a weighted sum of the two. However, this is a bit different from the other intermediate integration approaches that first transform each individual modality into their own intermediate representations (cell similarity graphs or subspaces).
Jolene

Thanks for the clarification. Do you perhaps think or see in your analysis that the (1st and 2nd) moments and velocity to be pretty batch/sample specific (in terms of the scale, etc.)?

Yes, I do think that RNA velocity estimation is fairly sample-specific!


iOS menu tap does not seem to work

While running imgui-sapp sample (fips config sapp-metal-ios-xcode-debug), I see two issues on iPhone 12:

The initial click and drag is using incorrect initial position. When you touch, the window jumps. Seems related to DPI?
If somehow, you manage to get the Imgui demo window into view, you can tap on the menu bar to open the menus, but tapping on a menu item does not seem to take affect. It does close the menu however, so something right is going on.

Hmm this might be an issue with the new evented input code in Dear ImGui, which has some issues for touch input:
https://twitter.com/ocornut/status/1491069840035135489

I just merged a PR which should fix the issue (only tested on the WASM samples webpage on my Android device, but it should generally fix touch input). See: https://github.com/floooh/sokol/pull/760 and https://github.com/floooh/sokol/issues/759


-=

error loading module 'a' from file './a.lua':
./a.lua:309: syntax error near '-'

I could not reproduce an error with this assignment operator. Could you provide the line of code that caused this error so I can investigate further?

for(var i=11;i>0;i--);
It seems that this part produced that

I've tried to reproduce the error using various approaches the last couple of days but haven't managed to @zaoqi. It would help immensely if you could provide the original javascript code.
Try pasting your code in the following sandbox: https://codesandbox.io/s/rm4k0m1xjo and supply me with the fork link

Closing due to inactivity. Please reopen when you have a reproducible scenario.


User Management: Update User's registration

User registration request must be updated in order to:

Return username and/or userId for a successful registration
In case of a userType: developer user, save its public key and certificate in attributes field
Enable user deletion from the User Management son-gtkusr API

This feature is implemented, however more tests are required

@mzacharioudakis
Please take these two fields into account when developing the user registration form:

public key
certificate

for developer users.

Hi @mzacharioudakis, @srodriguezOPT
I've just merged PR #533 which implements

POST /api/v2/users/ for user creation;
POST /api/v2/sessions/ for user login (with username and password -- not secret)

Can you please try and let me know the results?

closed by #533

Hi @jbonnet ,

User Registration
POST http://sp.int.sonata-nfv.eu:32001/api/v2/users/
with { "username": "test1" , "password": "test2" , "first_name": "firstName", "last_name": "lastName", "email"<EMAIL_ADDRESS>"phone_number": 654654654, "user_type": "customer"}
returns 201,
{
"username": "test1",
"uuid": null
}

User login (once user registration done):
POST http://sp.int.sonata-nfv.eu:32001/api/v2/sessions/
with
{ "username": "test1" , "password": "test2" }
returns
{
"error": {
"code": 401,
"message": "Unauthorized: user test1 not authenticated"
}
}

Thanks a million, @srodriguezOPT
Probably we need to wait for @dang03's opinion, but PR #534 improved logging a bit, could you try again both creation and login, please?

@jbonnet: done, but same result

Thanks, @srodriguezOPT
@dang03, help is needed here: when I do this on the command line:
$ curl -X POST sp.int3.sonata-nfv.eu:5600/api/v1/register/user -d '{ "username": "test1" , "password": "test2" , "first_name": "firs": "lastName", "email"<EMAIL_ADDRESS>"phone_number": 654654654, "user_type": "customer"}
I'm getting this:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "{ "username": "test1" , "password": "test2" , "first_name": "firstName", "last_name": "lastName", "email"<EMAIL_ADDRESS>"phone_number": 654654654, "user_type": "customer"}" (class org.keycloak.representations.idm.UserRepresentation), not marked as ignorable (24 known properties: "disableableCredentialTypes", "federatedIdentities", "enabled", "lastName", "emailVerified", "clientConsents", "self", "socialLinks", "applicationRoles", "createdTimestamp", "groups", "username", "attributes", "id", "firstName", "email", "federationLink", "serviceAccountClientId", "requiredActions", "origin", "realmRoles", "clientRoles", "totp", "credentials"])  at [Source: io.undertow.servlet.spec.ServletInputStreamImpl@5a132bc4; line: 1, column: 207] (through reference chain: org.keycloak.representations.idm.UserRepresentation["{ "username": "test1" , "password": "test2" , "first_name": "firstName", "last_name": "lastName", "email"<EMAIL_ADDRESS>"phone_number": 654654654, "user_type": "customer"}"])
Can you help?

Also, @dang03, doing a login:
$ curl http://sp.int3.sonata-nfv.eu:5600/api/v1/login/user -H 'Authentication:Basic VW5rbm93bjpOb25l' -X POST
nothing is returned... I was expecting the token to be returned, is that correct?
The same happens in the INT environment.

@jbonnet, I'm testing your command, but somehow the API has broken so I will have to rebuild again :S
What is happening here is, that the registration form you try to send to the UM is not valid for the Keycloak, for example, "first_name" should be named "firstName", "phone_number" does not exists as a valid field... What I see is that UM should parse and translate the form.
The login should work... testing

@dang03
Which fields are required in $ curl -X POST sp.int3.sonata-nfv.eu:5600/api/v1/register/user -d '{ "username": "test1" , "password": "test2" , "first_name": "firstName", "last_name": "lastName", "email"<EMAIL_ADDRESS>"phone_number": 654654654, "user_type": "customer"}' ?

@tsoenen
The API is validating only username, password and user_type.

@dang03 now with the correct JSON (I think...):
$ curl -X POST sp.int.sonata-nfv.eu:5600/api/v1/register/user -d '{ "username": "test1" , credentials":{"type":"password","value":"test2"}, "firstName": "firstName", "lastName": "lastName", "email": "mail@mail.com","attributes":{"phone_number":"654654654","userType":["customer"]}'
gives me
{"error":""}

Please let me check the logs and test it.
About the valid fields, @jbonnet is right, those are the minimum required fields, however if you add other fields they must be valid. @tsoenen check the documentation here to see some examples:
https://github.com/sonata-nfv/son-gkeeper/wiki/GK-API---User-Management-Message-exchange
I also suggest using JSON forms such the one in the integration tests:
https://github.com/sonata-nfv/son-tests/blob/master/int-gtkusr-keycloak/resources/user_d_registration.json

Hey @jbonnet @tsoenen, I have found some kind of bug in the Keycloak tool...
If a send a malformed JSON object, then it breaks somehow, and starts to return 403 errors to any request, that's why you see {"error":""}
I'm investigating how to solve this, but seems out of my scope, so my be suggestion is, let's send properly formed JSONs.

Ok, @dang03.
Is the following JSON right?
{ "username": "test1" , "credentials":{"type":"password","value":"test2"}, "firstName": "firstName", "lastName": "lastName", "email": "mail@mail.com","attributes":{"phone_number":"654654654","userType":["customer"]}

It should be like this (note 'credentials' and 'phone_numer' are a list):
{"username": "test1" ,
"credentials":[{"type":"password","value":"test2"}],
"firstName": "firstName",
"lastName": "lastName",
"email"<EMAIL_ADDRESS>"attributes":{"phone_number":["654654654"],"userType":["customer"]}
}`

Ok, I'll force this in the API.
@srodriguezOPT can you send the phone number as a string? It's JSON, it has to be a string, right?

The phone number is not required to be a string, I have tested it a it is OK

@dang03
I've tried:
$ curl -X POST sp.int.sonata-nfv.eu:5600/api/v1/register/user -d '{ "username": "test1" ,"credentials":[{"type":"password","value":"test2"}], "firstName": "firstName", "lastName": "lastName", "email": "mail@mail.com","attributes":{"phone_number":["654654654"],"userType":["customer"]}'
still no success:
com.fasterxml.jackson.databind.exc.UnrecognizedPropertyException: Unrecognized field "{ "username": "test1" ,"credentials":[{"type":"password","value":"test2"}], "firstName": "firstName", "lastName": "lastName", "email": "mail@mail.com","attributes":{"phone_number":["654654654"],"userType":["customer"]}" (class org.keycloak.representations.idm.UserRepresentation), not marked as ignorable (24 known properties: "disableableCredentialTypes", "federatedIdentities", "enabled", "lastName", "emailVerified", "clientConsents", "self", "socialLinks", "applicationRoles", "createdTimestamp", "groups", "username", "attributes", "id", "firstName", "email", "federationLink", "serviceAccountClientId", "requiredActions", "origin", "realmRoles", "clientRoles", "totp", "credentials"])  at [Source: io.undertow.servlet.spec.ServletInputStreamImpl@a3a4a42; line: 1, column: 260] (through reference chain: org.keycloak.representations.idm.UserRepresentation["{ "username": "test1" ,"credentials":[{"type":"password","value":"test2"}], "firstName": "firstName", "lastName": "lastName", "email": "mail@mail.com","attributes":{"phone_number":["654654654"],"userType":["customer"]}"])

To even more sure about doing a proper registration request, send it with header as JSON content:
curl -X POST -H "Content-Type: application/json" -d '{"username": "test4" , "credentials":[{"type":"password","value":"test2"}], "firstName": "firstName", "lastName": "lastName", "email"<EMAIL_ADDRESS>"attributes":{"phone_number":[654654654],"userType":["customer"]} }' "http://sp.int3.sonata-nfv.eu:5600/api/v1/register/user"
This works well

@dang03
You have to tell me about your magic trick:
$ curl -X POST sp.int.sonata-nfv.eu:5600/api/v1/register/user -d '{ "username": "test1" ,"credentials":[{"type":"password","value":"test2"}], "firstName": "firstName", "lastName": "lastName", "email": "mail@mail.com","attributes":{"phone_number":["654654654"],"userType":["customer"]}' -H "Content-Type: application/json"
gave me
"743: unexpected token at '{ \"username\": \"test1\" ,\"credentials\":[{\"type\":\"password\",\"value\":\"test2\"}], \"firstName\": \"firstName\", \"lastName\": \"lastName\", \"email\": \"mail@mail.com\",\"attributes\":{\"phone_number\":[\"654654654\"],\"userType\":[\"customer\"]}'\n"
Copied yours, but there's that bug, right?
$ curl -X POST -H "Content-Type: application/json" -d '{"username": "test4" , "credentials":[{"type":"password","value":"test2"}], "firstName": "firstName", "lastName": "lastName", "email"<EMAIL_ADDRESS>"attributes":{"phone_number":[654654654],"userType":["customer"]} }' "http://sp.int3.sonata-nfv.eu:5600/api/v1/register/user"
gave
{"error":""}
What do you see in the logs?

Good morning @jbonnet,
This works correctly:
resp=$(curl -X POST -H "Content-Type: application/json" -d '{"username": "test4", "credentials":[{"type":"password","value":"test2"}], "firstName": "firstName", "lastName": "lastName", "email"<EMAIL_ADDRESS>"attributes":{"phone_number":[654654654],"userType":["customer"]}}' "http://sp.int3.sonata-nfv.eu:5600/api/v1/register/user")
echo $resp
> {"username":"test4","userId":"300a3a16-d305-41a1-96fd-480fb289fd1a"}
When you see {"error":""}, it probably means that Keycloak has broken and it needs to be rebuilt (int-18-gtkusr-keycloak)
I'm going to implement some changes in order to avoid this bug, seems that x-www-form-urlencoded requests cause this.

Git User Management wiki has been updated: https://github.com/sonata-nfv/son-gkeeper/wiki/GK-API---User-Management-Message-exchange
GET, PUT and DELETE methods are implemented for users. They have been correctly tested and are ready to work. Details about messages and request are found in the wiki.

Hey, @dang03, @mzacharioudakis
This feature s needed to update the user data in the GUI, right?
Can you give me an idea of which priority it has? I'm giving it a low priority for the moment...
Thanks,

Hi @jbonnet, @mzacharioudakis
From the GUI point of view, I can't say which is the priority for the update feature. It is already there in the User Management.
But in the SDK side, we need a GK API to update user's public key in the User Management database. Let me explain, UM exposes two different APIs:

Update user data
PUT /api/v1/users?username="username" /api/v1/users?id="id"

Update user's Public key and/or certificate
PUT /api/v1/signatures/:username

The second is a dedicated API responsible for updating user's key and certificate in the UM database (the first API can also do that).
For the package signing feature in the SDK, this API is needed from the GK API.

Ok, @dang03
What should be the body of PUT /api/v1/signatures/:username, something like {"public_key":"..."}?

@jbonnet,
yes, exactly, these are the details:

HTTP method: PUT
Authentication header includes the user's Access Token
Parameter:  username
Body: JSON object that includes public_key field (required) and certificate field (optional). Sample:

{"public_key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEArVFiBHBiLPFRGrMobAxcK98SJRKKXJOkA66NL0UEgR7g8hOjVySchYUvtGAU5wi2ZCjmPGDT0hrJd1WEBplv0kT7YrIgdRGXGH73OJFjH8c7iX+XBwk0sH1K+KMUbszSbWFCKAlyHhYa8vz95RyzmzoMJZW6TeadlhRLuVw52RECaK9eIJu311oFA8os3z8J65olLexT0vF+B9Oqtn1gVJUfC0w984PXwMoGzSOVCbb5jD0/blAXonMS8PU+JFSGF4trTwRcmjw349NDEifUQamdHE8pynuxSpAuMN2WAPAlJpjnw/fHUxQFgRNGki6vHmegnQ6qmcbuorVW3oXkMwIDAQAB", "certificate": "optional"}

User Management response:  200, OK

...and 400for errors? Or something more detailed (invalid public key? missing public key? unknown user name?)?

@dang03
Can the SDK (son-access?) use the following API (note the PATCH verb, not PUT)?
PATCH .../api/v2/users/:username, with a body as given above ({"public_key": "MIIBIjANBgk..."})?
This will reach the UM as you've specified, PUT /api/v1/signatures/:username

@jbonnet
Yes, it mostly returns error codes 400 with a specific message in JSON format.
I'm testing the son-access  right now so I'll try it :)

Closed by PR #760


ERROR: unable to download video data: <urlopen error [Errno 11004] getaddrinfo failed>

Windows 7(32 Bit).
It was fine till yesterday and I made a few downloads. No software updates recently. Just installed wo-mic client.
Getting this Error in my cmd prompt over any video I try.
Note:
When I try this cmd::
C:\Users\Public\Technical Stuff>youtube-dl.exe -F "https://www.youtube.com/watch?v=FQZbDVaT39Q"
[youtube] Setting language
[youtube] FQZbDVaT39Q: Downloading webpage
[youtube] FQZbDVaT39Q: Downloading video info webpage
[youtube] FQZbDVaT39Q: Extracting video information
[info] Available formats for FQZbDVaT39Q:
format code extension resolution  note
171         webm      audio only  DASH audio , audio@ 48k (worst)
140         m4a       audio only  DASH audio , audio@128k
160         mp4       144p        DASH video , video only
242         webm      240p        DASH video , video only
133         mp4       240p        DASH video , video only
243         webm      360p        DASH video , video only
134         mp4       360p        DASH video , video only
244         webm      480p        DASH video , video only
135         mp4       480p        DASH video , video only
247         webm      720p        DASH video , video only
136         mp4       720p        DASH video , video only
248         webm      1080p       DASH video , video only
137         mp4       1080p       DASH video , video only
17          3gp       176x144
36          3gp       320x240
5           flv       400x240
43          webm      640x360
18          mp4       640x360
22          mp4       1280x720    (best)
I get the various formats.
But when I try to download a video, I get this Error.
C:\Users\Public\Technical Stuff>youtube-dl.exe "https://www.youtube.com/watch?v=FQZbDVaT39Q"
[youtube] Setting language
[youtube] FQZbDVaT39Q: Downloading webpage
[youtube] FQZbDVaT39Q: Downloading video info webpage
[youtube] FQZbDVaT39Q: Extracting video information
ERROR: unable to download video data: <urlopen error [Errno 11004] getaddrinfo failed>
No updates as of yet I suppose.
My version of youtube-dl
C:\Users\Public\Technical Stuff>youtube-dl.exe --version
2014.06.26
C:\Users\Public\Technical Stuff>youtube-dl.exe --update
youtube-dl is up-to-date (2014.06.26)

As suggested here, maybe you should check your proxy settings : https://stackoverflow.com/questions/5022945/urllib2-urlerror-urlopen-error-errno-11004-getaddrinfo-failed


cypress testnearest support missing

This issue is basically a clone of https://github.com/vim-test/vim-test/issues/560 but since that didn't seem to come to a resolution, I wanted to reopen it.
I'm running cypress tests with TestNearest. And as mentioned in the linked issue, every test in the file is being executed rather than the current cursor position.
Perhaps cypress CLI doesn't include this ability though? I'm relatively new to cypress so maybe it's not possible. A quick duckduckgo search led me to this https://stackoverflow.com/questions/55054337/cypress-run-only-one-test which suggests maybe the only way to do this is by editing the file to include .only on the spec.
Maybe TestNearest can somehow achieve its goal with cypress by leveraging that function and making a temporary edit to a test file? I might try to hack at it and see what I can get to work, but perhaps someone else out there has a better suggestion, or has more experience with vim scripts that they could easily implement this.
Thanks, all.

Reading through the Cypress CLI guide I couldn't see an argument or feature that would make test nearest possible

Closing this issue as it's a limitation of Cypress, feel free to reopen if the Cypress CLI add supports for test filtering


更新到2.2.1 定义自定义指令 在使用自定义指令后在谷歌浏览器下 出现警告

更新后 定义自定义指令 在使用自定义指令后在谷歌浏览器下 出现警告：
Property or method "v" is not defined on the instance but referenced during render. Make sure to declare reactive data properties in the data option.

Please show your code in http://jsfiddle.net

same problem

Hi, thanks for filling this issue. Please follow the Issue Reporting Guidelines and provide a live reproduction on jsfiddle, codepen etc. Thanks!

https://jsfiddle.net/varec3vx/#&togetherjs=A15swabImB
代码在这里 但是 这样写，放在HTML 中用谷歌浏览器打开 又没有警告 正常的。项目中按照模块加载 又会出错

Hi!
Please make sure to follow the Issue Reporting Guidelines before opening an issue.
Your issue is a usage/support question, and the issue tracker is reserved exclusively for bug reports and feature requests (as outlined in our Contributing Guide).
You should ask it on the forum , Stack Overflow or on gitter. Come back open a new issue if you find out there's a real issue
Thanks!

http://cdn.bootcss.com/jquery/3.1.1/jquery.min.js


allow for generating a osmose configuration from pre-defined function groups

Currently, a static zip file is provided by the configuration service with a valid osmose configuration.
We'd like to be able to generate a configuration by selecting specific predefined functional groups, using the existing static example as a standing point.

I've added a first pass at generating a template configuration for provided templates groups.
OSMOSE template configuration can now be generated using the following url syntax:
https://fbob.herokuapp.com/osmose_config.zip?groupName=[group1]&groupName=[group2]&groupName=[group3]&...
For example:
https://fbob.herokuapp.com/osmose_config.zip?groupName=Scomberomorus_cavalla&groupName=Lutjanus_campechanus&groupName=Epinephelus_morio
generates a template configuration for three groups with names Scomberomorus_cavalla, Lutjanus_campechanus and Epinephelus_morio.
Please note that this functionality uses identical default configuration for all groups. #2 would introduce a way to populate specific configuration variables using trait sources such as sealifebase and fishbase.

Has been implemented and reviewed. Closing issue.


Added DescriptionAttribute to C# Code Generator property

Added DescriptionAttribute to C# Code Generator property, when a description is present in JSON schema. This is in addition to XML documentation that is currently generated.
Example:
/// Material name
[Description("Material name")]
[JsonProperty("name", Required = Required.DisallowNull, NullValueHandling = NullValueHandling.Ignore)]
public string Name { get; set; }

Thanks for the PR.
Two changes I have to ask:

Please add the DocumentationAttribute also to the class
Do not update the version number, I'll do this for the release

Hi Rico,
Thanks for the quick reply. All done, please see the latest commit.

Also you need to convert the description with ConvertToStringLiteral, but ill do this

https://github.com/NJsonSchema/NJsonSchema/commit/fbb248c4e41f404075ff268ef0690bccfffc2836

Sorry, I have to undo the PR... the DisplayAttribute is not available in PCL libraries and thus will break some supported scenarios...

Please create an Issue and we can discuss how to do this, and why you need this change... Please reference this: https://github.com/NJsonSchema/NJsonSchema/commit/ba8b89e039d398319c334ef00f27552bec913687

Hi Rico,
Understood, will do! Thanks for the info.
Thank you,
......
Rick Zakharov
240-370-3469
On Sun, Nov 20, 2016 at 6:41 PM, Rico Suter<EMAIL_ADDRESS>wrote:

Please create an Issue and we can discuss how to do this, and why you need
this change... Please reference this: ba8b89e
https://github.com/NJsonSchema/NJsonSchema/commit/ba8b89e039d398319c334ef00f27552bec913687
—
You are receiving this because you authored the thread.
Reply to this email directly, view it on GitHub
https://github.com/NJsonSchema/NJsonSchema/pull/249#issuecomment-261815550,
or mute the thread
https://github.com/notifications/unsubscribe-auth/AL1_RDRPhvXPJFoNGipmfu-A1-9HkV2gks5rANq6gaJpZM4K3ZMP
.


(Power BI Workspace Collections) Entire page massively outdated

There are numerous things on this page that are massively outdated. Just to list a few

All Azure related images. The whole "preview UI" thing is no longer needed / does it even still exist
"PowerBI workspace collections" no longer exist, they are "office" groups within the active directory
Related to above, Data + Analytics also does not have this option. Adding groups is accessed through the AAD page or through All Services -> Other -> Groups
Going to Power BI Workspace Collections under All Services -> Intelligence + Analytics then trying to add a workspace collection shows a deprecation warning with redirect.
The link about POST workspaces under working with Workspaces directs to a removed docs page. It should direct to the proper PowerBI API: https://msdn.microsoft.com/en-us/library/mt147898.aspx

That's just listing a few issues. There is much more deprecation all across the page.

Document Details
⚠ Do not edit this section. It is required for docs.microsoft.com ➟ GitHub issue linking.

ID: f8de5452-d921-44a2-c2c6-9b21c426c04a
Version Independent ID: 7ba44d73-e58a-4380-4b94-01590580e246
Content: Get started with Microsoft Power BI Workspace Collections
Content Source: articles/power-bi-workspace-collections/get-started.md
Service: power-bi-embedded
GitHub Login: @guyinacube
Microsoft Alias: asaxton

@Favna Thanks for the feedback! I have assigned the issue to the content author to investigate further and update the document as appropriate.

@MicahMcKittrick-MSFT, please assign this issue to me.  Thank you.

@Favna Thank you for your feedback.  First, I want to apologize for the delayed response.  This information is out-dated. Power BI Workspace collections have been deprecated and should not be used to create new embedded type scenarios anymore. If you currently have a PBI Workspace collection setup, then please migrate over to Power BI Embedded in Azure. Please reference information about How to migrate Power BI Workspace Collection content to Power BI Embedded from  - https://docs.microsoft.com/en-us/power-bi/developer/migrate-from-powerbi-embedded.  I will redirect these topic articles to the new set of articles discussing migration.  Thank you for bringing this to our attention.

#please-close


integration tests: debug mode which doesn't delete tmp

Motivation:
Sometimes the contents of the temporary directories are important, so
let's have a flag to keep them.
Modifications:
introduce a -d flag which keeps the tmpdir
Result:
easier debugging

@swift-nio-bot test this please

@swift-nio-bot test this please


Can't input or close top Modal

Recent changes to Modal, possibly [fix] Update react-aria-modal to get some bug fixes and focus-management improvements., breaks Modal in the Account Dashboard. It works fine when there's only 1 Modal being rendered, however we have a user experience where there is a Modal being rendered on top of another Modal. It'd be ideal if we could get this specific scenario to work again in mr-ui since I imagine it'll be a long time from now till we have bandwidth to change the design and user experience.
Example below with creating a token and 2FA:

I'm unable to click into the inputs, type any characters, or close the modal by clicking the x. Only way out is by clicking off the top Modal and in the overlay.

Sounds to me like the place to look for the cause of this is in the way the modals are trapping focus.

@lshig Just released v4 of react-aria-modal, which might fix this nested-modals problem: https://github.com/davidtheclark/react-aria-modal/blob/master/CHANGELOG.md#400

Closing as stale


Transfer repository

Hey @seaneking, would you mind transferring this repository over to me? I maintain normalize.css and I would like to continue servicing this repo.

Oh! More importantly, I would need access to the npm package: https://www.npmjs.com/package/postcss-normalize

Done. Also added you as an owner to the NPM package.
Thanks for taking the reigns!


az storage remove cannot recognize --account-name when --auth-mode login appended

Describe the bug
A clear and concise description of what the bug is.
az storage remove -s xx -p xx --recursive --account-name xxx works
az storage remove -s xx -p xx --recursive --account-name xxx --auth-mode key works
az storage remove -s xx -p xx --recursive --account-name xxx --auth-mode login doesn't work, with the following message:
Missing credentials to access storage service. The following variations are accepted:
    (1) account name and key (--account-name and --account-key options or
        set AZURE_STORAGE_ACCOUNT and AZURE_STORAGE_KEY environment variables)
    (2) account name and SAS token (--sas-token option used with either the --account-name
        option or AZURE_STORAGE_ACCOUNT environment variable)
    (3) account name (--account-name option or AZURE_STORAGE_ACCOUNT environment variable;
        this will make calls to query for a storage account key using login credentials)
    (4) connection string (--connection-string option or
        set AZURE_STORAGE_CONNECTION_STRING environment variable); some shells will require
        quoting to preserve literal character interpretation.

To Reproduce
Steps to reproduce the behavior.
Expected behavior
A clear and concise description of what you expected to happen.
az storage remove -s xx -p xx --recursive --account-name xxx --auth-mode login
Environment summary
Install Method: MSI
CLI version: 2.0.71
OS version: Win 10 cmd.exe
Additional context
Add any other context about the problem here.

@zhusijia26 This error occurs because file share service don't support token_credential like blob service https://github.com/Azure/azure-storage-python/blob/54e60c8c029f41d2573233a70021c4abf77ce67c/azure-storage-file/azure/storage/file/fileservice.py#L169.

Blocked by service side. To not confuse customers, I plan to remove --auth-mode now for az storage remove and add it when feature is ready.


[WIP] Manager support vm destroy

Purpose or Intent
Manager to have supports_vm_destroy

@miq-bot add_labels wip

@miq-bot assign durandom

Here https://github.com/ManageIQ/manageiq/pull/10761 is another case

and https://github.com/ManageIQ/manageiq/pull/11752/files#r83206013 another case


Fix windows build and bump resolver version to the latest LTS-13.28 (ghc 8.6.5)

Attention: @stites
Description
Windows build
The stack.yaml file contained linux library paths for extra-libs. This was causing build errors in Windows. Hence, commented out the lines.
Bumped stack resolver version to LTS-13.28 (ghc 8.6.5)
To bring it to the latest (as of today) stable stack resolver.
By bringing this to the latest version, the build failed due to a non-exhaustive-pattern match (because ghc 8.6.5 checks more exhaustive).
This error was also fixed so that the package builds with the latest resolver.
Motivation and Context
See above.
How Has This Been Tested?
Built the same both on Windows and Linux.
Screenshots (if appropriate):
Types of changes

[x] Bug fix (non-breaking change which fixes an issue)
[ ] New feature (non-breaking change which adds functionality)
[ ] Breaking change (fix or feature that would cause existing functionality to change)

Checklist:

[ ] My code follows the code style of this project -- in essence, you've run the brittany formatter over your code.
[ ] My change requires a change to the documentation.
[ ] I have updated the documentation accordingly.
[x] I have read the CONTRIBUTING document.

Pending CI, this looks fine to me -- @xnomagichash, what is the status of this repo? Is someone at Sentenai going to have time to take over maintenance?

@stites:
The CI has failed, unfortunately :-( But looks like this is due to a bad .travis.yml file: and that possibly needs another PR. Travis builds with this line: stack... reinforce-prelude, and this package is not in the current code-base (it was not there even before this PR, so obviously the CI had failed even before this PR).
I shall also fix that problem in the travis file once this PR is merged - so that will be my next PR.

I shall also fix that problem in the travis file once this PR is merged - so that will be my next PR.

I just removed the offending line directly and re-triggered CI.

Okay, I've built this on my machine and it is working as expected. Retriggering the build does not actually update where it is merging into master, so travis.yml remains unchanged. I would be happy to merge this but it feels a bit odd to merge without someone at @Sentenai for the final go-ahead.
The updated .travis.yml also fails on master due to some hlint suggestions (see https://travis-ci.org/Sentenai/reinforce/builds/561082616#L5880 ) in retrospect weeder and hlint in CI is a bit overkill for this project. @arvindd I think a good followup PR would make the call on removing or appeasing these.

Ok @stites, will raise another followup PR to solve the Travis errors after this PR is merged.

@xnomagichash: I decided to go raise this PR as I noticed that the repo had been stuck with a very old ghc / resolver, and I wanted to further this development.
Kindly merge this repo, and also drop a line on the roadmap/possibility of a handover of maintenance to somebody (including me). I can try to at least keep this afloat by accepting PRs and also furthering development / creating roadmap, of course, with the help of @stites and others who have been overseeing this development before.
If you choose to handover to me, I shall continue the maintenance in arvindd/reinforce/master and not in this repo, or even possibly move this repo under the DataHaskell project, subject to acceptance of that project.

Okay, I think @xnomagichash might be a bit busy. Since I know that things are pinned correctly, I'm going to go ahead and merge this, but it would be good to get some feedback from someone at Sentenai.
Pinging some folks in case Brendan is tied up: @xilnocas, @meangrape, @brandly, @seagreen.

Sorry got a little busy here. We'll discuss about who should take over maintainership.


Update pytest-timeout usage

Description of Problem:
Our pytest.mark.timeouts are

too big by default (120 seconds) to identify slow tests
include the fixture setup time which means that if a fixture is very slow and one test fails due to a timeout, the next one is likely to fail as well

Overview of the Solution:

Have a low default timeout so we can identify slow tests outside of the machine learning / integration tests quickly.
only measure the pure test runtime and don't include the fixture setup time

Blockers (if relevant):

https://github.com/RasaHQ/rasa/issues/8118 needs to be done first

Definition of Done:

[ ] Set pytest.timeout to 10 for all tests except

Core featurizers / policies
NLU featurizers / components
integration tests

[ ] Make sure that every increased timeout in above exceptions (which are annotated using @pytest.mark.timeout) use func_only=True. This excludes the fixture time to be included in the timeout
[ ] optional: Ensure that no tests outside ML + integration can have a customized pytest.mark.timeout

the concrete numbers are discussable


Phase2 bughunt v3

[ ] Status Icon Disappearance after Restore Table Fix
[ ] SetSpannerConfig API response update to include IsConfigValid
[ ] /workspace broken path fixed and updated

Issue with the "Opening "/workspace" path directly shows a broken UI." resolved.


Verify Database Integrity

I rebuilt 100% of the database that is released w/ 1.0.0a4.  I quite frankly have NO clue regarding its integrity.

This belongs in nflgame.


[Extension] Docker: Change order of screenshots

Current Behavior
This screenshot is displayed first in the details view of Meshery in the Docker Extension Marketplace:

Desired Behavior
Let's change the order so that the more intriguing screenshot of MeshMap is shown.

Contributor Guides and Resources

🛠 Meshery Build & Release Strategy
📚 Instructions for contributing to documentation

Meshery documentation site and source

🎨 Wireframes and designs for Meshery UI in Figma
🙋🏾🙋🏼 Questions: Layer5 Discussion Forum and Layer5 Community Slack

Can I work on this @leecalcote

That’d be great, @harkiratsm 👍


Fix DML-containing FOR when the iterator is an object set with duplicates

DML-containing FOR loops get compiled into CTEs, and after the DML is
performed, the CTEs need to get joined back with the DML CTEs in order
to produce the output. Currently we do these joins on the 'identity'
of the iterator set; for non-object sets, we generate a transient
identity with uuid_generate_v4, and for object sets we ues the actual
object id.
That works ok if all the objects in the iterator set are unique, but
if they aren't we produce a lot of duplicate output rows.
To solve this, we need to use transient ids for object types too, but
overriding object identity with something transient causes problems:
if we need to actually join the object against some actual table, we
are in trouble, since we've overriden the identity.
Solve this by introducing a new 'iterator' aspect and distinguishing
between whether we want to join on an iterator aspect or a real identity
when making path bonds.
Fixes #6608

If this is tough to backport we can skip it, but otherwise we should


Unknown FFmpeg error

Unknown FFmpeg error
when i download with latest version

check if you have the last ffmpeg version installed please.
If you have the latest version or the error keeps happening even after updating please check that when it errors out there should be some red text before the 'Unknown FFmpeg error' in red background, could you copy and paste it?

Hello lukaarma,

check if you have the last ffmpeg version installed please.
updated
it works
thanks!
best regards


Adds Couchbase Server Community 6.5.1

No issue exists for this (though I can create one if necessary)
Microsoft Reviewers: Open in CodeFlow

@CalvinAllen No worries, they're not required :)
I myself occasionally reference an issue just to make organization easier, nothing more.

Looks like the pipeline broke again. Try retriggering the bot with an empty commit in a short while.


Compile of RabbitMQ 3.9.8 fails on kirkstone

When building with the kirkstone branch and Erlang 25.0, I see this:
|  ERLC   observer_cli.erl observer_cli_application.erl observer_cli_escriptize.erl observer_cli_ets.erl observer_cli_help.erl observer_cli_inet.erl observer_cli_lib.erl observer_cli_mnesia.erl observer_cli_plugin.erl observer_cli_port.erl observer_cli_process.erl observer_cli_store.erl observer_cli_system.erl
| warning: use Mix.Config is deprecated. Use the Config module instead
|   config/config.exs:10
|
|
| 12:51:51.249 [error] beam/beam_load.c(551): Error loading function 'Elixir.Hex.Version':'allow_pre_available?'/0: op put_tuple u x:
|   please re-compile this module with an Erlang/OTP 25 compiler
|
|
|
| 12:51:51.250 [error] Loading of /home/daniel/src/sw__yocto_holoplot/poky/build/tmp-glibc/work/corei7-64-holoplot-linux/rabbitmq-server/3.9.8-r1/rabbitmq-server-3.9.8/deps/.mix/archives/hex-0.21.3/hex-0.21.3/ebin/Elixir.Hex.Version.beam failed: :badfile
|
|
| 12:51:51.250 [notice] Application hex exited: exited in: Hex.Application.start(:normal, [])
|     ** (EXIT) an exception was raised:
|         ** (UndefinedFunctionError) function Hex.Version.start/0 is undefined (module Hex.Version is not available)
|             (hex 0.21.3) Hex.Version.start()
|             (hex 0.21.3) lib/hex/application.ex:12: Hex.Application.start/2
|             (kernel 8.4) application_master.erl:293: :application_master.start_it_old/4

Hello @zonque
As state here https://www.rabbitmq.com/which-erlang.html the rabbitmq version 3.9.8 does not support Erlang 25. So the version 3.9.8 needs the min 23.2 and max 24.2 Erlang version (set it as preferred version).
I'm planning to add rabbitmq 3.10.5 for master and kirkstone as well.

As state here https://www.rabbitmq.com/which-erlang.html the rabbitmq version 3.9.8 does not support Erlang 25. So the version 3.9.8 needs the min 23.2 and max 24.2 Erlang version (set it as preferred version).

I tried pinning the versions, but that failed too.

I'm planning to add rabbitmq 3.10.5 for master and kirkstone as well.

Nice. I'll wait for that then and give it a try :)

Hello,
Here we go:
https://github.com/meta-erlang/meta-erlang/pull/196
https://github.com/meta-erlang/meta-erlang/pull/197


Added descriptions for rating floors, damage cap and tripe stats

as discussed earlier, please check the formating, image alignments and general look and feel. Feel free to move everything into the content/file structure as you seem fit.
For now I added the triples stats as own page under bg basics and the images in an own folder in misc.
I also added it to the header.php for now. So this needs to be adjusted to if you want to move it somewhere else.

also squash & merge I guess, whenever you add it 😄


Add project version tracker CLI tool

Add a Go CLI to show and update project versions.
Sample automatic PR - https://github.com/abhay-krishna/eks-anywhere-build-tooling/pull/38.
By submitting this pull request, I confirm that you can use, modify, copy, and redistribute this contribution, under the terms of your choice.

/approve


chore(CI): archive the contract binaries to GitHub artifacts

So that a developer can download the contract binaries directly to a server and then run ckb-bitcoin-spv-service.

After discussion, will create a reproducible building workflow later.