Harden Your OS: A Practitioner's Guide to Securing Your Machine Like a Security Analyst


"Security is not a product, it is a process." — Bruce Schneier. But that process has to start somewhere, and for most people it starts with the machine under their fingertips.

Every configuration decision you skip is a decision an attacker makes for you. The good news: most of the highest-impact hardening steps take under ten minutes each. The bad news: most users skip all of them.

This article treats you like the professional you are (or aspire to be). We map each control to the security frameworks that mandate it — NIST CSF 2.0, CIS Benchmarks, ISO 27001, and DISA STIGs — so you understand not just the what but the why and the compliance context.


Table of Contents

  1. Why It Matters
  2. Know Your Threat Model
  3. Accounts & Privilege Management
  4. Patching & Updates
  5. Full Disk Encryption
  6. Firewall & Network Hygiene
  7. Authentication: Passwords, MFA & Biometrics
  8. Browser Hardening
  9. Audit Logging & Endpoint Visibility
  10. Framework Alignment
  11. Master Hardening Checklist

Why It Matters

Operating systems ship with a philosophy of maximum compatibility, minimum friction. That is a legitimate design choice for a vendor targeting 1.5 billion endpoints. It is a terrible default for anyone who stores sensitive data, works remotely, or holds any elevated access in an organization.

The default install of Windows 11, macOS Sonoma, or even Ubuntu Desktop enables remote management services, broad application permissions, no disk encryption, minimal audit logging, and browser configurations that cheerfully accept third-party cookies and arbitrary extensions. These are not bugs — they are defaults optimized for setup ease, not security posture.

Risk LevelExposureConsequence
🔴 CriticalNo disk encryptionPhysical access = instant data breach
🟠 HighAdmin account as daily driverMalware inherits full system privileges
🟡 MediumDelayed patchingKnown CVEs stay open for months
🟢 FoundationalNo audit loggingNo forensic trail when things go wrong
Hardening is not about paranoia. It is about **reducing your attack surface** to what you actually need, enforcing least privilege, and ensuring you have visibility into what is happening on your own machine.

Know Your Threat Model

Before touching a single setting, identify who you are defending against. This determines how aggressive your hardening needs to be.

User ProfilePrimary ThreatsHardening Priority
Home user / hybrid workerPhishing, credential theft, ransomware, opportunistic malwareMedium — all baseline controls
IT / Security professionalAll of the above + targeted attacks, lateral movement, supply chainHigh — full hardening + audit trail
Remote Public Sector / Critical OrganizationsRegulatory compliance, data classification violations, insider riskHigh — FISMA / DISA STIG alignment required
Developer / power userCompromised dev tools, secrets exposure, unsafe dependenciesMedium-High — encryption + network + secrets hygiene

Framework Note: This article maps controls to NIST CSF 2.0 Govern, Identify, Protect, and Detect functions, as well as CIS Controls v8 and ISO/IEC 27001:2022 Annex A. Framework references appear as labels beside each section heading.


Accounts & Privilege Management

Frameworks: NIST CSF 2.0 PR.AA · CIS Control 5 · ISO 27001 A.5.15 · DISA STIG V-220726

This is the highest-leverage hardening step you can take. The principle is simple: never run your daily activities as an administrator. When ransomware executes under an admin account, it inherits your full system privileges. When it runs under a standard user account, its blast radius shrinks dramatically.

Create a Standard User Account for Daily Use

Windows:
Settings → Accounts → Family & other users → Add account → set account type to Standard User. Keep your admin account separate, reserved for installs and system changes only.

macOS:
System Settings → Users & Groups → Add Account → Standard. Log in as standard daily; the OS will prompt for admin credentials when elevation is genuinely needed.

Linux:
Your daily user account should not be in the privileged group by default — that is %wheel on Arch/RHEL/Fedora-based systems, %sudo on Debian/Ubuntu-based systems, or a similar group depending on your distribution or BSD variant. If you are unsure which group controls sudo access on your system, check your distro's documentation. Create a separate privileged account and switch to it using su, dzdo, or a similar tool only when you genuinely need elevated access.

# Create a separate sysadmin account for privilege use (wheel example — Arch/RHEL/Fedora)
useradd -m -G wheel sysadmin

# Restrict sudo access via visudo — limit to specific commands if possible
visudo /etc/sudoers

Disable or Secure the Built-in Administrator / Root Account

Windows:
Open Computer Management → Local Users and Groups → Users → right-click "Administrator" → Properties → check Account is disabled.

macOS:
The root account is disabled by default. Verify it stays that way:

sudo dsenableroot -d

Linux:
Lock the root password entirely — access root functionality only via sudo:

sudo passwd -l root

Guest Accounts: Disable Entirely

Guest accounts provide unauthenticated local access and should be disabled on every platform.

:: Windows
net user Guest /active:no

On macOS: System Settings → Users & Groups → toggle off Guest User.

⚠️ UAC Is Not a Security Boundary
Windows User Account Control prompts are a friction mechanism, not a real barrier. A motivated attacker with code execution under your admin account can trivially bypass UAC. Running as a standard user is the real control.


Patching & Updates

Frameworks: NIST CSF 2.0 PR.MA · CIS Control 7 · ISO 27001 A.8.8

The Verizon Data Breach Investigations Report consistently shows that the majority of exploited vulnerabilities had patches available for months — sometimes years — before the breach. Patch management is not glamorous. It is also the single most effective control in existence.

Operating System Updates

Windows:
Settings → Windows Update → Advanced Options → enable "Receive updates for other Microsoft products." Set Active Hours to prevent disruptive restarts. Do not defer Feature Updates more than 30 days.

macOS:
System Settings → General → Software Update → enable "Install Security Responses and System Files" for rapid security patches between major releases.

Linux:
Run your system update at minimum once a week. The command depends on which Linux distribution you are using — find yours below:

# Arch-based (Arch, Manjaro, EndeavourOS)
sudo pacman -Syu

# Debian/Ubuntu-based (Ubuntu, Linux Mint, Pop!_OS)
sudo apt update && sudo apt upgrade

# Fedora / RHEL-based (Fedora, AlmaLinux, Rocky Linux)
sudo dnf update

# openSUSE
sudo zypper update

If you are not sure which type of Linux you have, open a terminal and run cat /etc/os-release — it will tell you the name and version of your distribution. For higher-risk systems, automate security-package updates using a systemd.timer unit.

Third-Party Applications — The Blind Spot

The OS update channel handles OS components only. Every browser, PDF reader, media player, and productivity suite updates independently. This is where most users carry massive unpatched surface area.

# Windows — check and upgrade all packages via winget
winget upgrade --all

# Or using Chocolatey
choco upgrade all -y

Linux — AUR packages (Arch-based only):

# Update all packages including AUR
paru -Syu
# or with yay
yay -Syu

Unlike packages from official repositories, AUR packages are contributed and maintained by the community — they go through no official vetting process. Before confirming any AUR upgrade, take a moment to check the package page for recent user comments and review the PKGBUILD file for any unexpected changes. Blindly upgrading AUR packages, especially after a major kernel or system update, can cause things to break in ways that are not always easy to fix.

Flatpak — Easy to Miss, Easy to Forget

If you use Linux and have installed any apps from Flathub — GNOME Software, KDE Discover, or similar app stores often use Flatpak under the hood — those apps do not update when you run your regular package manager command. They live in their own separate container and need their own update command:

# Update all Flatpak apps (covers both system-wide and user installs)
flatpak update

Think of it like this: updating your system without running this is like updating Windows but never updating the apps you downloaded from the Microsoft Store. Make it part of your weekly routine.

AppImages — The Apps That Never Update Themselves

AppImages are a type of Linux application packaged as a single downloadable file — you just download it, make it executable, and run it. No installation required. That convenience comes with a tradeoff: there is no automatic update system. Each AppImage only updates itself if the developer specifically built that feature in, and many do not bother.

In practice, this means you can easily end up running an AppImage that is months or years out of date without realizing it.

What to do:

  • If the AppImage supports it, use appimageupdatetool to check for and apply updates automatically.
  • If it does not, periodically visit the app's official website or GitHub releases page and download the latest version to replace the old one.
  • Every few months, check what AppImages you actually have sitting on your system — it is easy to forget about them:
# Find all AppImages stored on your system (adjust folders as needed)
find ~/Applications ~/.local/bin -name "*.AppImage" 2>/dev/null

Any AppImage you no longer use should be deleted. Old, unused software is just unpatched attack surface collecting dust.


Full Disk Encryption

Frameworks: NIST CSF 2.0 PR.DS · CIS Control 3.11 · ISO 27001 A.8.24 · DISA STIG V-220712 · SOC 2 CC6.7

A laptop without disk encryption is a file cabinet with the key taped to the side. If someone gets physical access to your device — theft, border crossing, lost bag — all data is trivially accessible by booting from a USB drive. Encryption at rest closes this attack vector entirely.

PlatformNative ToolWhere to EnableNotes
Windows 10/11 ProBitLockerControl Panel → BitLocker Drive Encryption → Turn OnMust enable manually
Windows 11 HomeDevice EncryptionSettings → Privacy & Security → Device EncryptionRequires Microsoft account
macOSFileVault 2System Settings → Privacy & Security → FileVaultOn by default on Apple Silicon
LinuxLUKS (dm-crypt)Must be configured at install timeCannot easily add post-install

Back Up Your Recovery Key — No Exceptions
BitLocker and FileVault generate a recovery key at encryption time. If you lose this key and cannot authenticate normally, your data is permanently inaccessible — "likely" not recoverable by Microsoft or Apple. Store it in your password manager or a physically secured offline location.

BitLocker's strongest configuration uses TPM + PIN, not TPM alone. TPM-only can be defeated by DMA or cold-boot attacks on certain hardware. Add a startup PIN:

manage-bde -protectors -add C: -TPMAndPIN

Firewall & Network Hygiene

Frameworks: NIST CSF 2.0 PR.IR · CIS Control 12 · ISO 27001 A.8.20

The host-based firewall is your last line of defense when the network perimeter has been bypassed — which, in 2026, is essentially always. Remote work, public Wi-Fi, and VPN split-tunneling all mean traffic hits your machine without passing through a corporate firewall. Your local firewall must be configured and active.

Verify and Configure Your Firewall

Windows Defender Firewall:
Control Panel → Windows Defender Firewall → verify all three profiles (Domain, Private, Public) show On. Block all inbound connections on the Public profile.

macOS:
System Settings → Network → Firewall → turn On. Enable "Block all incoming connections" on untrusted networks and enable Stealth Mode to prevent ICMP probing.

Linux (ufw):

sudo ufw enable
sudo ufw default deny incoming
sudo ufw default allow outgoing
# Whitelist only what you actually need
sudo ufw allow 22/tcp comment 'SSH'
sudo ufw status verbose

Audit What Is Listening

Every listening service is an attack surface. Know what is open on your machine:

# Windows
Get-NetTCPConnection -State Listen | Select-Object LocalPort, OwningProcess
# Linux
ss -tlnp

# macOS
lsof -i -nP | grep LISTEN

Disable services you do not recognize or use. Common culprits on Windows: Remote Desktop (3389), Remote Registry, Telnet, IIS. On macOS: Screen Sharing, Remote Login, Remote Management.

Public Wi-Fi Protocol

  • Never use public Wi-Fi without a trusted VPN active. Your unencrypted traffic is visible to anyone on the same segment.
  • On Windows, always set the network profile to Public when connecting to any non-home, non-work network — this automatically restricts file sharing and network discovery.
  • Disable Wi-Fi and Bluetooth when not in use. Both are active attack surfaces even when you are not connected.

Authentication: Passwords, MFA & Biometrics

Frameworks: NIST CSF 2.0 PR.AA-01 · CIS Control 5.2 · ISO 27001 A.5.17

Password Policy

NIST SP 800-63B has moved decisively away from arbitrary complexity rules and forced rotation. The current standard: long passphrases, no mandatory rotation unless compromised, breach corpus checking.

  • Use a passphrase of 4+ random words for OS login — minimum 14 characters. Length beats complexity every time.
  • Use a password manager (Bitwarden, KeePassXC) for all other credentials. Every account gets a unique, randomly generated password. No exceptions.
  • Enable screen lock after 5 minutes of inactivity. This is a CIS Benchmark Level 1 requirement across all platforms.

Multi-Factor Authentication

Enable MFA on every account that supports it. Priority order:

Microsoft account / Azure AD:
Settings → Accounts → Sign-in options → add an authenticator app or security key.

Apple ID:
Settings → [your name] → Sign-In & Security → Two-Factor Authentication. Use a trusted device, not SMS.

⚠️ Avoid SMS-Based MFA Where Possible
SIM-swapping attacks make SMS a weak second factor. Prefer a TOTP app (Aegis on Android, Raivo on iOS) or a hardware key (YubiKey). SMS MFA is better than nothing — but it is not the finish line.

Biometrics (Windows Hello / Touch ID / Linux fprintd)

Biometric authentication is both more convenient and more secure than passwords for device unlock. The biometric template never leaves your device's secure enclave. Enable it where available.

  • Windows: Settings → Accounts → Sign-in options → Windows Hello Fingerprint / Face
  • macOS: System Settings → Touch ID & Password
  • Linux: Fingerprint login is possible on many laptops via fprintd and PAM, but comes with important caveats — read below.
**Linux Fingerprint Authentication — Proceed with Caution**

On Linux, fingerprint support is handled by fprintd, a background service that talks to your fingerprint reader hardware. When it works, it integrates with PAM the same way TOTP does — you can use your fingerprint to unlock your desktop session or authenticate sudo.

# Install fprintd (Arch-based)
sudo pacman -S fprintd

# Debian/Ubuntu-based
sudo apt install fprintd libpam-fprintd

# Fedora/RHEL-based
sudo dnf install fprintd
# Enroll your fingerprint
fprintd-enroll

# Verify it was registered correctly
fprintd-verify

Once enrolled, run sudo pam-auth-update (Debian/Ubuntu) or manually add auth sufficient pam_fprintd.so to your relevant PAM files on Arch/Fedora to activate it.

⚠️ Caution — Read Before Enabling
Linux fingerprint support is genuinely inconsistent. Whether it works at all depends entirely on your specific hardware — many fingerprint readers, particularly those built into budget laptops or older ThinkPads, have little or no Linux driver support. Even when it does work, there are real limitations to be aware of:

  • Not all display managers support it. GDM (GNOME) handles it well. SDDM (KDE), LightDM, and others may require additional configuration or may not support it at all.
  • sudo in the terminal may not prompt for fingerprint depending on your terminal emulator and PAM configuration — you may still fall back to a password there.
  • Fingerprint alone is not MFA. It replaces your password as a single factor, it does not add a second one. For true MFA on Linux, combine it with TOTP or a hardware key as described above.
  • Check your hardware first. Before spending time on configuration, verify your reader is supported by checking the fprint supported devices list or searching your laptop model + "fprintd Linux" online.
If your hardware is well-supported and your desktop environment handles it cleanly, it is a worthwhile convenience. If you hit friction early in setup, skip it and invest that time in TOTP instead — the security gain is equivalent and TOTP works on everything.

MFA on Linux — The Gap Most Guides Skip

Linux does not have a built-in MFA prompt the way Windows Hello or Apple ID does. But that does not mean you are stuck with just a password. Linux uses a system called PAM (Pluggable Authentication Modules) — think of it as a flexible layer that controls how login and authentication work across the whole system. PAM can be configured to require a second factor on top of your password, and it works across terminal logins, graphical desktop logins, and even sudo.

There are three practical options depending on how technical you want to get:


Option 1: TOTP (Time-Based One-Time Password) — Recommended for Most Users

This is the same type of code your banking app or Google account uses — a 6-digit number that changes every 30 seconds. You generate it from an app on your phone like Aegis (Android) or Raivo (iOS).

# Step 1: Install the PAM module (Arch-based)
sudo pacman -S libpam-google-authenticator

# Debian/Ubuntu-based
sudo apt install libpam-google-authenticator

# Fedora/RHEL-based
sudo dnf install google-authenticator-libpam
# Step 2: Set it up for your user account
google-authenticator

Run that second command and follow the prompts — it will show you a QR code to scan with your authenticator app and give you a set of emergency backup codes. Save those backup codes somewhere safe. They are your way back in if you lose your phone.

# Step 3: Tell PAM to require the second factor for sudo
# Edit /etc/pam.d/sudo and add this line near the top:
auth required pam_google_authenticator.so

After this, every time you run sudo, you will be asked for your password and then your TOTP code. To also require it at the graphical login screen, edit /etc/pam.d/login or your display manager's PAM file (e.g. /etc/pam.d/gdm-password for GNOME).

⚠️ Before you edit any PAM file, open a second terminal window and keep it open. If you misconfigure PAM and lock yourself out, that second session is your recovery path. Test that sudo still works before closing anything.


Option 2: SSH Key Authentication — If You Ever Log In Remotely

If you ever SSH into your own machine — or any other Linux machine — password-based SSH is a liability. SSH keys are a far stronger alternative and are effectively a form of MFA: something you have (the private key) plus something you know (the key passphrase).

# Generate a strong SSH key pair on your local machine
ssh-keygen -t ed25519 -C "your_email@example.com"

# Copy your public key to the remote machine
ssh-copy-id username@your-server-ip

Once your key is working, disable password-based SSH login entirely:

# Edit /etc/ssh/sshd_config and set:
PasswordAuthentication no
PubkeyAuthentication yes

# Restart the SSH service
sudo systemctl restart sshd

Now the only way to log in remotely is with your key file. No key, no access — even with the correct password.


Option 3: Hardware Security Key (YubiKey / FIDO2) — For Power Users

If you already own a hardware security key — a YubiKey, OnlyKey, or any FIDO2-compatible device — you can configure PAM to require it for login or sudo. This is the strongest second factor available: it is a physical device that cannot be phished or SIM-swapped.

# Install the FIDO2 PAM module (Arch-based)
sudo pacman -S pam-u2f

# Debian/Ubuntu-based
sudo apt install libpam-u2f
# Register your hardware key to your user account
mkdir -p ~/.config/Yubico
pamu2fcfg > ~/.config/Yubico/u2f_keys

Plug in your key when prompted and touch the button to register it. Then add it to your PAM configuration the same way as the TOTP option above, replacing pamgoogleauthenticator.so with pam_u2f.so.

💡 Which option should you pick? If you are a regular Linux desktop user, Option 1 (TOTP) gives you the best security improvement for the effort. If you SSH into machines, Option 2 is non-negotiable. If you already have a YubiKey, Option 3 and it will cover both.


Browser Hardening

Frameworks: NIST CSF 2.0 PR.PS · CIS Control 9 · ISO 27001 A.8.9

Your browser is the most complex and most frequently targeted application on your system. It processes untrusted code from thousands of origins every day. Default configurations optimize for compatibility — not for security.

Key Settings to Change

SettingLocationRecommended State
Third-party cookiesSettings → PrivacyBlock all third-party
DNS-over-HTTPSSettings → Privacy → SecurityEnable — Cloudflare 1.1.1.1 or NextDNS
HTTPS-only modeSettings → Privacy → SecurityEnable
Extensions / Add-onsExtensions managerRemove all unused; audit all permissions
Password save in browserSettings → AutofillDisable — use a dedicated password manager
Sync passphraseSettings → SyncEnable encryption passphrase for synced data

Essential Extensions

  • uBlock Origin — The gold standard ad and tracker blocker. Use medium mode for maximum protection. Directly blocks malvertising, a major malware delivery vector.
  • Privacy Badger (EFF) — Learns and blocks invisible trackers that slip through standard block lists.
  • Bitwarden — Browser-integrated password manager. Far safer than browser built-in storage, which is attackable by malware running at user level.

💡 Tip: Use Separate Browser Profiles for Work and Personal
Segregate contexts using separate browser profiles — or a separate browser entirely. This prevents cookie-based cross-context tracking and limits the blast radius of a compromised session.


Audit Logging & Endpoint Visibility

Frameworks: NIST CSF 2.0 DE.AE · CIS Control 8 · ISO 27001 A.8.15 · DISA STIG V-220748

You cannot detect what you do not log. Most default OS configurations log very little. The NIST Detect function requires sufficient visibility to identify anomalous events — which means configuring audit policies before you need them, not after an incident.

Windows Audit Policy

:: Enable critical audit categories (run as Administrator)
auditpol /set /subcategory:"Logon" /success:enable /failure:enable
auditpol /set /subcategory:"Account Lockout" /failure:enable
auditpol /set /subcategory:"Process Creation" /success:enable
auditpol /set /subcategory:"Removable Storage" /success:enable /failure:enable
auditpol /set /subcategory:"Audit Policy Change" /success:enable /failure:enable

:: View current policy
auditpol /get /category:*

Key Event IDs to monitor:

Event IDMeaningPriority
4625Failed logon attemptHigh
4720New account createdHigh
4648Explicit credential use (runas)High
4732Account added to privileged groupCritical
7045New service installedMedium

macOS Unified Log

# Stream authentication-related events in real time
log stream --predicate 'eventMessage contains "authentication"' --style compact

Consider installing Objective-See's free tools — BlockBlock, LuLu, and KnockKnock — for persistent threat monitoring on macOS.

Linux — auditd

# Install and enable auditd (Arch)
sudo pacman -S audit
sudo systemctl enable --now auditd

# Add rules to /etc/audit/rules.d/hardening.rules
-w /etc/passwd -p wa -k identity
-w /etc/sudoers -p wa -k privilege_escalation
-a always,exit -F arch=b64 -S execve -k process_execution
-w /var/log/auth.log -p wa -k log_tampering

# Load the rules
sudo augenrules --load

Logs are only useful if you review them. Set a recurring weekly calendar reminder to check failed logon attempts, new account creations, privilege escalations, and new software installs.


Framework Alignment

Understanding where your hardening actions sit in the governance landscape makes you a more effective practitioner and gives you the vocabulary to justify controls to leadership, auditors, or clients.

Control AreaNIST CSF 2.0CIS v8ISO 27001:2022
Account & Privilege MgmtPR.AA-01, GV.OC-05CIS 5, 6A.5.15, A.5.18
Patch ManagementPR.MA-01CIS 7A.8.8
Data Encryption at RestPR.DS-01CIS 3.11A.8.24
Firewall / Network ControlsPR.IR-01CIS 12, 13A.8.20, A.8.21
Authentication / MFAPR.AA-03CIS 5.2, 6.5A.5.17
Audit LoggingDE.AE-01, DE.CM-01CIS 8A.8.15, A.8.16
For government and regulated environments — judiciary, federal, healthcare — the **DISA STIG** for your specific OS version is the authoritative technical standard. STIGs are freely available at [public.cyber.mil/stigs](https://public.cyber.mil/stigs) and provide exact configuration values for every setting covered in this article.

Master Hardening Checklist

Work through this top-to-bottom on any machine you own or administer. Items are ordered by risk-reduction impact.

🔴 Tier 1 — Critical (Do These First)

  • [ ] Enable full disk encryption (BitLocker / FileVault / LUKS) and store the recovery key securely
  • [ ] Create a standard user account for daily use; disable or lock the admin/root account
  • [ ] Enable MFA on your Microsoft, Apple, or Google account that controls OS access
  • [ ] Enable automatic OS updates; verify third-party applications are current
  • [ ] Verify the host-based firewall is active on all network profiles, especially Public

🟠 Tier 2 — High (Complete Within the Week)

  • [ ] Audit listening services; disable everything not in active use (RDP, Telnet, Remote Registry, IIS, etc.)
  • [ ] Install uBlock Origin; enable HTTPS-only mode and DNS-over-HTTPS in your browser
  • [ ] Set screen lock to 5 minutes or fewer on all user accounts
  • [ ] Audit browser extensions; remove any you did not consciously install or no longer use
  • [ ] Deploy a password manager; migrate top accounts to unique, generated passwords

🟡 Tier 3 — Medium (Ongoing Governance)

  • [ ] Configure audit logging for logon events, account changes, process creation, and removable storage
  • [ ] Review Event Logs / auth.log weekly for failed logons, new accounts, and privilege escalation
  • [ ] Check for unnecessary software monthly; uninstall anything not actively used
  • [ ] Verify and test backup integrity quarterly; encrypt all backups at rest
  • [ ] Review user accounts on shared machines; remove stale accounts immediately
  • [ ] Check DISA STIG updates for your OS version semi-annually and apply relevant changes

Closing Thoughts

Security hardening is not a one-time project. It is a continuous governance discipline. Your threat landscape evolves, new CVEs emerge, and your usage patterns change. The goal is not perfection — it is a posture that meaningfully raises the cost of compromise above the value of what you are protecting.

Start with Tier 1. Everything else follows. But start today, because your default configuration has already been running longer than it should.

If you work in a regulated environment — government, healthcare, finance, legal — map these controls explicitly to your compliance framework. Document what you have done, when you did it, and why. That documentation is not just paperwork. In a governance context, it is evidence of due care.


© 2026 Hani Esmael / EFHorizons / EsmaelNexusX. All rights reserved.