{"id":856262,"date":"2026-05-29T18:34:42","date_gmt":"2026-05-29T18:34:42","guid":{"rendered":"https:\/\/elektrobox.ch\/?page_id=856262"},"modified":"2026-07-03T06:31:42","modified_gmt":"2026-07-03T06:31:42","slug":"pc_status_monitor","status":"publish","type":"page","link":"https:\/\/elektrobox.ch\/index.php\/pc_status_monitor\/","title":{"rendered":"PC Status Monitor"},"content":{"rendered":"\n<style data-wp-block-html=\"css\">\n\/* =========================================================\n   ElektroBox Project Page CSS\n   Shared layout for all project pages\n   Matches the ElektroClock restructured HTML form\n   Paste once into Appearance -> Customize -> Additional CSS\n   ========================================================= *\/\n\n.ebox-project-page,\n.ebox-project-page *,\n.ebox-project-page *::before,\n.ebox-project-page *::after {\n  box-sizing: border-box;\n}\n\n.ebox-project-page {\n  width: 100%;\n  max-width: 1080px;\n  margin: 0 auto;\n  padding: 0 20px;\n  font-family: inherit;\n  line-height: 1.7;\n  color: #1f2933;\n  overflow-x: hidden;\n}\n\n.ebox-project-page h1,\n.ebox-project-page h2,\n.ebox-project-page h3 {\n  color: #111827;\n  line-height: 1.25;\n  overflow-wrap: break-word;\n}\n\n.ebox-project-page h1 {\n  margin: 0 0 16px;\n  font-size: clamp(2.15rem, 4.5vw, 3.5rem);\n  letter-spacing: -0.035em;\n}\n\n.ebox-project-page h2 {\n  margin: 52px 0 16px;\n  padding-bottom: 8px;\n  border-bottom: 2px solid #e5e7eb;\n  font-size: clamp(1.45rem, 2.6vw, 2.05rem);\n}\n\n.ebox-project-page h3 {\n  margin: 28px 0 10px;\n  font-size: 1.2rem;\n}\n\n.ebox-project-page p {\n  margin: 0 0 18px;\n}\n\n.ebox-project-page ul,\n.ebox-project-page ol {\n  margin: 0 0 20px 22px;\n  padding: 0;\n}\n\n.ebox-project-page li {\n  margin: 6px 0;\n}\n\n.ebox-project-page code {\n  padding: 0.08em 0.28em;\n  border-radius: 6px;\n  background: #eef2f7;\n  color: #111827;\n  font-family: Consolas, Monaco, \"Courier New\", monospace;\n  font-size: 0.92em;\n}\n\n\/* Hero *\/\n\n.ebox-hero {\n  margin: 28px 0 34px;\n  padding: clamp(24px, 4vw, 44px);\n  border: 1px solid #e5e7eb;\n  border-radius: 22px;\n  background: linear-gradient(135deg, #f8fafc 0%, #ffffff 55%, #eef6ff 100%);\n  box-shadow: 0 10px 30px rgba(15, 23, 42, 0.08);\n}\n\n.ebox-hero-with-image {\n  display: grid;\n  grid-template-columns: minmax(0, 1.35fr) minmax(260px, 0.9fr);\n  align-items: center;\n  gap: 32px;\n}\n\n.ebox-hero-text {\n  min-width: 0;\n}\n\n.ebox-hero-label {\n  display: inline-block;\n  margin-bottom: 14px;\n  padding: 6px 14px;\n  border-radius: 999px;\n  background: #e0f2fe;\n  color: #075985;\n  font-size: 0.92rem;\n  font-weight: 800;\n}\n\n.ebox-hero-image {\n  min-width: 0;\n  width: 100%;\n}\n\n.ebox-hero-image img {\n  display: block;\n  width: 100%;\n  height: auto;\n  border-radius: 18px;\n  object-fit: cover;\n  box-shadow: 0 10px 28px rgba(15, 23, 42, 0.14);\n}\n\n\/* Video *\/\n\n.ebox-video-section {\n  margin: 42px 0 46px;\n}\n\n.ebox-video-card,\n.ebox-video-box {\n  margin: 20px 0 12px;\n  padding: clamp(12px, 2vw, 18px);\n  border: 1px solid #dce3ea;\n  border-radius: 22px;\n  background: #f8fafc;\n  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.06);\n}\n\n.ebox-video-frame,\n.ebox-video-wrapper {\n  position: relative;\n  width: 100%;\n  aspect-ratio: 16 \/ 9;\n  overflow: hidden;\n  border-radius: 18px;\n  background: #0f172a;\n}\n\n.ebox-video-frame iframe,\n.ebox-video-wrapper iframe {\n  position: absolute;\n  inset: 0;\n  display: block;\n  width: 100%;\n  height: 100%;\n  border: 0;\n}\n\n\/* Cards and grids *\/\n\n.ebox-card-grid,\n.ebox-summary-grid,\n.ebox-check-grid {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));\n  gap: 16px;\n  margin: 20px 0 28px;\n}\n\n.ebox-info-card,\n.ebox-check-card {\n  min-width: 0;\n  padding: 18px;\n  border: 1px solid #e5e7eb;\n  border-radius: 16px;\n  background: #ffffff;\n  box-shadow: 0 6px 18px rgba(15, 23, 42, 0.06);\n}\n\n.ebox-info-card strong,\n.ebox-check-card strong {\n  display: block;\n  margin-bottom: 6px;\n  color: #111827;\n}\n\n\/* Sections and images *\/\n\n.ebox-step {\n  margin: 24px 0;\n  padding: clamp(18px, 3vw, 26px);\n  border: 1px solid #e5e7eb;\n  border-radius: 18px;\n  background: #ffffff;\n  box-shadow: 0 8px 22px rgba(15, 23, 42, 0.05);\n}\n\n.ebox-step h2 {\n  margin-top: 0;\n}\n\n.ebox-section-grid {\n  display: grid;\n  grid-template-columns: minmax(0, 1.1fr) minmax(260px, 0.9fr);\n  gap: 28px;\n  align-items: center;\n  margin: 20px 0 30px;\n}\n\n.ebox-image-card,\n.ebox-svg-preview {\n  min-width: 0;\n  margin: 28px 0 34px;\n  padding: clamp(12px, 2vw, 20px);\n  border: 1px solid #dce3ea;\n  border-radius: 18px;\n  background: #f8fafc;\n  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.06);\n  overflow: hidden;\n  text-align: center;\n}\n\n.ebox-image-card img,\n.ebox-svg-preview img {\n  display: block;\n  width: 100%;\n  max-width: 100%;\n  height: auto;\n  max-height: 72vh;\n  margin: 0 auto;\n  border-radius: 14px;\n  object-fit: contain;\n}\n\n.ebox-image-card .ebox-img-tall {\n  width: auto;\n  max-height: 520px;\n}\n\n.ebox-caption,\n.ebox-svg-caption {\n  margin: 12px 0 0;\n  color: #475569;\n  font-size: 0.95rem;\n  text-align: center;\n}\n\n\/* Notes *\/\n\n.ebox-note,\n.ebox-warning {\n  margin: 22px 0;\n  padding: 18px 20px;\n  border-radius: 12px;\n}\n\n.ebox-note {\n  border-left: 5px solid #0ea5e9;\n  background: #f0f9ff;\n}\n\n.ebox-warning {\n  border-left: 5px solid #f97316;\n  background: #fff7ed;\n}\n\n\/* Flow *\/\n\n.ebox-flow {\n  display: grid;\n  gap: 10px;\n  margin: 20px 0 26px;\n}\n\n.ebox-flow-step {\n  padding: 14px 16px;\n  border-radius: 14px;\n  background: #111827;\n  color: #ffffff;\n  font-weight: 700;\n}\n\n\/* Collapsible details *\/\n\n.ebox-details {\n  margin: 24px 0 34px;\n  border: 1px solid #e5e7eb;\n  border-radius: 18px;\n  background: #ffffff;\n  box-shadow: 0 8px 24px rgba(15, 23, 42, 0.06);\n  overflow: hidden;\n}\n\n.ebox-details summary {\n  cursor: pointer;\n  padding: 16px 18px;\n  color: #111827;\n  font-weight: 800;\n  background: #f8fafc;\n  border-bottom: 1px solid #e5e7eb;\n}\n\n.ebox-details-content {\n  padding: 18px;\n}\n\n\/* Code *\/\n\n.ebox-code-block {\n  margin: 20px 0 26px;\n  border: 1px solid #d1d5db;\n  border-radius: 16px;\n  overflow: hidden;\n  background: #0b1020;\n  box-shadow: 0 10px 28px rgba(15, 23, 42, 0.16);\n}\n\n.ebox-code-header {\n  display: flex;\n  align-items: center;\n  justify-content: space-between;\n  gap: 12px;\n  padding: 12px 14px;\n  background: #111827;\n  color: #ffffff;\n}\n\n.ebox-code-title {\n  font-size: 0.95rem;\n  font-weight: 800;\n  word-break: break-word;\n}\n\n.ebox-copy-button {\n  appearance: none;\n  border: 0;\n  border-radius: 999px;\n  padding: 8px 13px;\n  background: #dbeafe;\n  color: #0f172a;\n  cursor: pointer;\n  font-weight: 800;\n  font-size: 0.85rem;\n  white-space: nowrap;\n}\n\n.ebox-copy-button:hover {\n  background: #bfdbfe;\n}\n\n.ebox-code-textarea {\n  display: block;\n  width: 100%;\n  min-height: 360px;\n  max-height: 620px;\n  padding: 18px;\n  border: 0;\n  outline: none;\n  resize: vertical;\n  background: #0b1020;\n  color: #e5e7eb;\n  font-family: Consolas, Monaco, \"Courier New\", monospace;\n  font-size: 13px;\n  line-height: 1.55;\n  white-space: pre;\n  overflow: auto;\n}\n\n.ebox-code-textarea.small {\n  min-height: 190px;\n}\n\n.ebox-code-textarea.medium {\n  min-height: 300px;\n}\n\n.ebox-code-textarea.large {\n  min-height: 520px;\n}\n\n.ebox-small-code-box {\n  margin: 18px 0 28px;\n}\n\n.ebox-small-code {\n  width: 100%;\n  min-height: 90px;\n  max-height: 500px;\n  height: 220px;\n  padding: 16px;\n  resize: vertical;\n  overflow: auto;\n  border: 1px solid #334155;\n  border-radius: 12px;\n  background-color: #111827;\n  color: #f1f5f9;\n  font-family: Consolas, Monaco, \"Courier New\", monospace;\n  font-size: 13px;\n  line-height: 1.45;\n  white-space: pre;\n  box-sizing: border-box;\n}\n\n\/* Tables, galleries, FAQ *\/\n\n.ebox-table {\n  width: 100%;\n  border-collapse: collapse;\n  margin: 18px 0 28px;\n}\n\n.ebox-table th,\n.ebox-table td {\n  border: 1px solid #d1d5db;\n  padding: 10px;\n  text-align: left;\n  vertical-align: top;\n}\n\n.ebox-table th {\n  background: #f2f2f2;\n}\n\n.ebox-gallery {\n  display: grid;\n  grid-template-columns: repeat(auto-fit, minmax(230px, 1fr));\n  gap: 18px;\n  margin: 22px 0 32px;\n}\n\n.ebox-faq-list {\n  display: grid;\n  gap: 14px;\n  margin: 20px 0 34px;\n}\n\n.ebox-faq-list details {\n  border: 1px solid #e5e7eb;\n  border-radius: 16px;\n  background: #ffffff;\n  box-shadow: 0 6px 18px rgba(15, 23, 42, 0.05);\n  overflow: hidden;\n}\n\n.ebox-faq-list summary {\n  cursor: pointer;\n  padding: 16px 18px;\n  color: #111827;\n  font-weight: 800;\n}\n\n.ebox-faq-content {\n  padding: 0 18px 18px;\n  color: #4b5563;\n}\n\n\/* Links and final box *\/\n\n.ebox-download-link,\n.ebox-schematic-link {\n  display: inline-flex;\n  align-items: center;\n  justify-content: center;\n  margin: 10px 0 18px;\n  padding: 10px 16px;\n  border-radius: 999px;\n  background: #dbe8ee;\n  color: #1f3a46;\n  font-size: 0.92rem;\n  font-weight: 800;\n  text-decoration: none;\n}\n\n.ebox-download-link:hover,\n.ebox-schematic-link:hover {\n  background: #c8dce5;\n  color: #132a34;\n}\n\n.ebox-final-box {\n  margin: 42px 0 24px;\n  padding: clamp(20px, 3vw, 28px);\n  border: 1px solid #e5e7eb;\n  border-radius: 20px;\n  background: #f8fafc;\n}\n\n\/* Optional project-specific accent hooks *\/\n\n.ebox-project-page--elektroclock .ebox-hero-label,\n.ebox-project-page--matrix .ebox-hero-label {\n  background: #e0f2fe;\n  color: #075985;\n}\n\n.ebox-project-page--lightbox .ebox-hero-label {\n  background: #fef3c7;\n  color: #92400e;\n}\n\n.ebox-project-page--rgb .ebox-hero-label {\n  background: #fae8ff;\n  color: #86198f;\n}\n\n.ebox-project-page--pcmon .ebox-hero-label {\n  background: #dcfce7;\n  color: #166534;\n}\n\n.ebox-project-page--ttm .ebox-hero-label {\n  background: #ffedd5;\n  color: #9a3412;\n}\n\n\/* Responsive *\/\n\n@media (max-width: 820px) {\n  .ebox-hero-with-image,\n  .ebox-section-grid {\n    grid-template-columns: 1fr;\n  }\n\n  .ebox-hero-image {\n    margin-top: 8px;\n  }\n}\n\n@media (max-width: 640px) {\n  .ebox-project-page {\n    padding: 0 16px;\n  }\n\n  .ebox-hero {\n    padding: 22px 18px;\n  }\n\n  .ebox-code-header {\n    flex-direction: column;\n    align-items: flex-start;\n  }\n\n  .ebox-copy-button {\n    width: 100%;\n  }\n\n  .ebox-code-textarea {\n    min-height: 320px;\n    font-size: 12.5px;\n  }\n\n  .ebox-image-card .ebox-img-tall {\n    width: 100%;\n    max-height: none;\n  }\n}\n<\/style>\n\n\n\n<div class=\"ebox-project-page ebox-project-page--pcmon\">\n\n  <section class=\"ebox-hero ebox-hero-with-image\">\n    <div class=\"ebox-hero-text\">\n      <span class=\"ebox-hero-label\">ESP32 Project<\/span>\n      <h1>PC Status Monitor<\/h1>\n      <p>\n        In this project, I build a DIY PC status monitor that displays live system values from a Windows\n        PC on an external display using an ESP32.\n      <\/p>\n      <p>\n        The monitor shows CPU usage, RAM usage, GPU usage, CPU temperature, GPU temperature, and live\n        CPU clock speed. The data is collected on the PC, sent over USB serial, and displayed on a\n        small touchscreen display inside a laser-cut enclosure.\n      <\/p>\n    <\/div>\n\n    <div class=\"ebox-hero-image\">\n      <img decoding=\"async\" src=\"https:\/\/elektrobox.ch\/wp-content\/uploads\/2026\/05\/IMG_2614-scaled.jpg\" alt=\"DIY PC Status Monitor with ESP32 display\">\n    <\/div>\n  <\/section>\n\n<div class=\"ebox-video-card\">\n  <div class=\"ebox-video-frame\">\n    <iframe src=\"https:\/\/www.youtube.com\/embed\/u5copkHgjsc\" title=\"PC Status Monitor project video\" allow=\"accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share\" allowfullscreen=\"\">\n    <\/iframe>\n  <\/div>\n<\/div>\n\n  <h2>1. Project Idea<\/h2>\n\n  <p>\n    The goal is to create a small external display that shows live hardware values from my PC. Instead\n    of opening monitoring software on the main screen, the most important values are always visible\n    directly on the desk.\n  <\/p>\n\n  <p>\n    For this build, I reused a leftover display and an ESP32 from my RGB controller project. This made\n    the electronics part easier and allowed me to reuse components that I already had available.\n  <\/p>\n\n  <div class=\"ebox-card-grid\">\n    <div class=\"ebox-info-card\"><strong>Main controller<\/strong>ESP32 connected to the display and to the PC over USB serial.<\/div>\n    <div class=\"ebox-info-card\"><strong>Display<\/strong>SPI TFT display controlled by the ESP32. The touchscreen is connected, but not used in this version.<\/div>\n    <div class=\"ebox-info-card\"><strong>PC software<\/strong>LibreHardwareMonitor and a sender script collect the system values and transmit them to the ESP32.<\/div>\n  <\/div>\n\n  <h2>2. How the System Works<\/h2>\n\n  <p>\n    The system is split into two parts. The Windows PC reads the live hardware data, while the ESP32\n    receives the values and updates the graphical dashboard on the display.\n  <\/p>\n\n  <div class=\"ebox-flow\">\n    <div class=\"ebox-flow-step\">Windows PC \u2192 LibreHardwareMonitor reads hardware sensors<\/div>\n    <div class=\"ebox-flow-step\">Sender script \u2192 selects the important values<\/div>\n    <div class=\"ebox-flow-step\">USB serial connection \u2192 transfers the data to the ESP32<\/div>\n    <div class=\"ebox-flow-step\">ESP32 \u2192 receives the values and updates the display<\/div>\n  <\/div>\n\n  <p>\n    In this version, the monitor displays CPU usage, RAM usage, GPU load, CPU temperature, GPU temperature,\n    and live CPU clock speed. The data is updated regularly, so the display works as a compact external\n    dashboard.\n  <\/p>\n\n  <h2>3. Required Parts<\/h2>\n\n  <ul>\n    <li>ESP32 development board<\/li>\n    <li>SPI TFT display<\/li>\n    <li>Dupont wires<\/li>\n    <li>USB cable for power and serial communication<\/li>\n    <li>Laser-cut enclosure<\/li>\n    <li>Double-sided tape for fixing the display and ESP32<\/li>\n  <\/ul>\n\n  <h2>4. Wiring and Display Setup<\/h2>\n\n  <p>\n    I connected the display to the ESP32 using Dupont wires. For the wiring concept, I reused the display\n    setup from my previous RGB controller project. This helped keep the build simple because the display\n    and ESP32 configuration were already tested.\n  <\/p>\n\n  <div class=\"ebox-warning\">\n    <strong>Important:<\/strong>\n    The display pin configuration must match the selected display setup in your ESP32 project. If the\n    display stays white, shows wrong colors, or appears mirrored, check the driver, SPI pins, and backlight.\n  <\/div>\n\n  <h2>5. Enclosure and SVG File<\/h2>\n\n  <p>\n    Because the housing is clearly visible on the desk, I decided to laser cut the enclosure. The case was\n    designed with a tight fit so the parts can be assembled cleanly and the display sits securely in the\n    front opening.\n  <\/p>\n\n  <p>\n    The display and ESP32 are fixed inside the case with double-sided tape. Cable management is kept simple,\n    and the final result is a compact desktop PC status monitor.\n  <\/p>\n\n  <div class=\"ebox-svg-preview\">\n    <img decoding=\"async\" src=\"https:\/\/elektrobox.ch\/wp-content\/uploads\/2026\/05\/box_with_96x62_cutout.svg\" alt=\"Laser-cut SVG enclosure layout for the PC Status Monitor\">\n    <p class=\"ebox-svg-caption\">Laser-cut enclosure SVG with a 96 mm \u00d7 62 mm display cutout.<\/p>\n  <\/div>\n\n  <h2>6. Windows Setup<\/h2>\n\n  <ol>\n    <li>Install and start LibreHardwareMonitor.<\/li>\n    <li>Enable the LibreHardwareMonitor web server or JSON endpoint.<\/li>\n    <li>Install Python and the required packages for serial communication and system monitoring.<\/li>\n    <li>Connect the ESP32 to the PC with a USB cable.<\/li>\n    <li>Check the correct COM port in the Arduino IDE or Windows Device Manager.<\/li>\n    <li>Start the sender workflow so the PC values are transmitted to the ESP32.<\/li>\n  <\/ol>\n\n  <h2>7. ESP32 Firmware Overview<\/h2>\n\n  <p>\n    The ESP32 firmware waits for live data from the PC over USB serial. When valid data is received, the\n    values are stored and the display dashboard is refreshed.\n  <\/p>\n\n  <details class=\"ebox-details\">\n    <summary>Example serial data format<\/summary>\n    <div class=\"ebox-details-content\">\n      <div class=\"ebox-code-block\">\n        <div class=\"ebox-code-header\">\n          <span class=\"ebox-code-title\">Example PC to ESP32 message<\/span>\n          <button class=\"ebox-copy-button\" onclick=\"eboxCopyCode('pcmon-message', this)\">Copy code<\/button>\n        <\/div>\n        <textarea id=\"pcmon-message\" class=\"ebox-code-textarea small\" readonly=\"\">S,34,58,42,61,55,4700<\/textarea>\n      <\/div>\n    <\/div>\n  <\/details>\n\n  <h2>8. PC Sender Workflow<\/h2>\n\n  <p>\n    The PC sender script collects live system values from the operating system and from LibreHardwareMonitor.\n    After the values are collected, they are converted into a compact data message and sent to the ESP32\n    through USB serial.\n  <\/p>\n\n  <h2>9. Starting and Stopping the Monitor<\/h2>\n\n  <p>\n    For daily use, the project can be started with a simple start workflow. This opens LibreHardwareMonitor\n    and then starts the PC sender script. Before using it for the first time, the COM port must be adjusted\n    to match the connected ESP32.\n  <\/p>\n\n\n  <h2>10. Final Code Files<\/h2>\n\n  <p>\n    The final project uses two software parts. The ESP32 sketch runs on the display controller and\n    receives the PC data over USB serial. The Python script is shown here as downloadable\/copyable code only.\n  <\/p>\n\n  <div class=\"ebox-note\">\n    <strong>Firewall-safe website note:<\/strong>\n    The code below is stored inside read-only HTML textareas and encoded as HTML character entities.\n    WordPress displays it as text only. It is not executed on your web server, and this format reduces\n    the chance that a server firewall or ModSecurity rule blocks the page save because of raw script-like\n    content in the HTML.\n  <\/div>\n\n  <details class=\"ebox-details\" open=\"\">\n    <summary>pc_status_monitor.ino<\/summary>\n    <div class=\"ebox-details-content\">\n      <p>\n        This Arduino sketch runs on the ESP32. It initializes the TFT display, receives serial data from\n        the Windows PC, parses the values, and updates the dashboard layout.\n      <\/p>\n\n      <div class=\"ebox-code-block\">\n        <div class=\"ebox-code-header\">\n          <span class=\"ebox-code-title\">pc_status_monitor.ino<\/span>\n          <button class=\"ebox-copy-button\" onclick=\"eboxCopyCode('pcmon-final-ino', this)\">Copy code<\/button>\n        <\/div>\n        <textarea id=\"pcmon-final-ino\" class=\"ebox-code-textarea large\" readonly=\"\">\/*\n  ESP32 PC Stats Dashboard &#8211; Clean GUI Layout\n  &#8211; ILI9341 display with TFT_eSPI\n  &#8211; XPT2046 touch controller on HSPI\n  &#8211; Receives Windows PC stats over USB serial\n\n  Serial format:\n  S,cpuPercent,ramPercent,gpuLoadPercent,cpuTemp,gpuTemp,cpuClockMHz\n*\/\n\n#include &lt;SPI.h&gt;\n#include &lt;TFT_eSPI.h&gt;\n#include &lt;XPT2046_Touchscreen.h&gt;\n\nTFT_eSPI tft = TFT_eSPI();\n\n#define TFT_BL 17\n\n#define TOUCH_CS   26\n#define TOUCH_IRQ  25\n\nSPIClass touchSPI(HSPI);\nXPT2046_Touchscreen ts(TOUCH_CS, TOUCH_IRQ);\n\n\/\/ &#8212;&#8212;&#8212;- GUI SETTINGS &#8212;&#8212;&#8212;-\n#define SCREEN_MARGIN 6\n#define CARD_GAP      6\n#define STATUS_H      16\n#define CARD_RADIUS   9\n\n#define COLOR_BG      TFT_BLACK\n#define COLOR_CARD    TFT_DARKGREY\n#define COLOR_BORDER  TFT_LIGHTGREY\n#define COLOR_TEXT    TFT_WHITE\n#define COLOR_MUTED   TFT_LIGHTGREY\n\n#define FORMAT_PERCENT 0\n#define FORMAT_TEMP_C  1\n#define FORMAT_MHZ     2\n\nstruct PcStats {\n  int cpu;\n  int ram;\n  int gpuLoad;\n  int cpuTemp;\n  int gpuTemp;\n  int cpuClock;\n};\n\nPcStats stats    = {-1, -1, -1, -1, -1, -1};\nPcStats oldStats = {-999, -999, -999, -999, -999, -999};\n\nString serialLine = &#8220;&#8221;;\n\nunsigned long lastPacketMs = 0;\nunsigned long lastStatusUpdateMs = 0;\n\nbool dataDirty = false;\nbool oldStaleState = false;\n\nstruct StatBox {\n  int x;\n  int y;\n  int w;\n  int h;\n  const char *label;\n  int barMax;\n  uint8_t format;\n  uint16_t color;\n};\n\nStatBox boxes[6];\n\nbool parseStatsLine(String line) {\n  line.trim();\n\n  if (!line.startsWith(&#8220;S,&#8221;)) {\n    return false;\n  }\n\n  char buffer[110];\n  line.toCharArray(buffer, sizeof(buffer));\n\n  int cpu, ram, gpuLoad, cpuTemp, gpuTemp, cpuClock;\n\n  int fields = sscanf(\n    buffer,\n    &#8220;S,%d,%d,%d,%d,%d,%d&#8221;,\n    &amp;cpu,\n    &amp;ram,\n    &amp;gpuLoad,\n    &amp;cpuTemp,\n    &amp;gpuTemp,\n    &amp;cpuClock\n  );\n\n  if (fields != 6) {\n    return false;\n  }\n\n  stats.cpu = cpu;\n  stats.ram = ram;\n  stats.gpuLoad = gpuLoad;\n  stats.cpuTemp = cpuTemp;\n  stats.gpuTemp = gpuTemp;\n  stats.cpuClock = cpuClock;\n\n  lastPacketMs = millis();\n  dataDirty = true;\n\n  return true;\n}\n\nvoid readSerialData() {\n  while (Serial.available()) {\n    char c = Serial.read();\n\n    if (c == &#8216;\\n&#8217;) {\n      parseStatsLine(serialLine);\n      serialLine = &#8220;&#8221;;\n    } else if (c != &#8216;\\r&#8217;) {\n      serialLine += c;\n\n      if (serialLine.length() &gt; 100) {\n        serialLine = &#8220;&#8221;;\n      }\n    }\n  }\n}\n\nvoid setupLayoutValues() {\n  int top = SCREEN_MARGIN;\n  int usableBottom = STATUS_H + SCREEN_MARGIN;\n\n  int boxW = (tft.width() &#8211; 2 * SCREEN_MARGIN &#8211; CARD_GAP) \/ 2;\n  int boxH = (tft.height() &#8211; top &#8211; usableBottom &#8211; 2 * CARD_GAP) \/ 3;\n\n  int x1 = SCREEN_MARGIN;\n  int x2 = SCREEN_MARGIN + boxW + CARD_GAP;\n\n  int y1 = top;\n  int y2 = top + boxH + CARD_GAP;\n  int y3 = top + 2 * (boxH + CARD_GAP);\n\n  \/\/ Row 1: CPU core information\n  boxes[0] = {x1, y1, boxW, boxH, &#8220;CPU&#8221;,      100,  FORMAT_PERCENT, TFT_GREEN};\n  boxes[1] = {x2, y1, boxW, boxH, &#8220;CPU TEMP&#8221;, 100,  FORMAT_TEMP_C,  TFT_ORANGE};\n\n  \/\/ Row 2: memory and CPU clock speed\n  boxes[2] = {x1, y2, boxW, boxH, &#8220;RAM&#8221;,      100,  FORMAT_PERCENT, TFT_CYAN};\n  boxes[3] = {x2, y2, boxW, boxH, &#8220;CPU CLK&#8221;,  6000, FORMAT_MHZ,     TFT_MAGENTA};\n\n  \/\/ Row 3: GPU usage and GPU temperature next to each other\n  boxes[4] = {x1, y3, boxW, boxH, &#8220;GPU&#8221;,      100,  FORMAT_PERCENT, TFT_BLUE};\n  boxes[5] = {x2, y3, boxW, boxH, &#8220;GPU TEMP&#8221;, 100,  FORMAT_TEMP_C,  TFT_RED};\n}\n\nvoid drawStaticBox(const StatBox &amp;box) {\n  tft.fillRoundRect(box.x, box.y, box.w, box.h, CARD_RADIUS, COLOR_CARD);\n  tft.drawRoundRect(box.x, box.y, box.w, box.h, CARD_RADIUS, COLOR_BORDER);\n\n  \/\/ Colored accent line\n  tft.fillRoundRect(box.x + 4, box.y + 4, 4, box.h &#8211; 8, 3, box.color);\n\n  \/\/ Label\n  tft.setTextDatum(TL_DATUM);\n  tft.setTextColor(COLOR_MUTED, COLOR_CARD);\n  tft.setTextSize(1);\n  tft.drawString(box.label, box.x + 16, box.y + 7, 2);\n\n  \/\/ Bar outline\n  int barX = box.x + 16;\n  int barY = box.y + box.h &#8211; 15;\n  int barW = box.w &#8211; 26;\n  int barH = 8;\n\n  tft.drawRect(barX, barY, barW, barH, COLOR_BORDER);\n}\n\nvoid drawStaticLayout() {\n  tft.fillScreen(COLOR_BG);\n\n  for (int i = 0; i &lt; 6; i++) {\n    drawStaticBox(boxes[i]);\n  }\n\n  \/\/ Reserved status line area\n  tft.fillRect(0, tft.height() &#8211; STATUS_H, tft.width(), STATUS_H, COLOR_BG);\n}\n\nvoid updateBar(const StatBox &amp;box, int value) {\n  int barX = box.x + 16;\n  int barY = box.y + box.h &#8211; 15;\n  int barW = box.w &#8211; 26;\n  int barH = 8;\n\n  tft.fillRect(barX + 1, barY + 1, barW &#8211; 2, barH &#8211; 2, COLOR_CARD);\n\n  if (value &lt; 0) {\n    return;\n  }\n\n  int clamped = constrain(value, 0, box.barMax);\n  int fillW = map(clamped, 0, box.barMax, 0, barW &#8211; 2);\n\n  tft.fillRect(barX + 1, barY + 1, fillW, barH &#8211; 2, box.color);\n}\n\nvoid makeValueText(const StatBox &amp;box, int value, char *buffer, size_t bufferSize) {\n  if (value &lt; 0) {\n    switch (box.format) {\n      case FORMAT_PERCENT:\n        snprintf(buffer, bufferSize, &#8220;&#8211; %%&#8221;);\n        break;\n      case FORMAT_TEMP_C:\n        snprintf(buffer, bufferSize, &#8220;&#8211; C&#8221;);\n        break;\n      case FORMAT_MHZ:\n        snprintf(buffer, bufferSize, &#8220;&#8211; MHz&#8221;);\n        break;\n      default:\n        snprintf(buffer, bufferSize, &#8220;&#8211;&#8220;);\n        break;\n    }\n    return;\n  }\n\n  switch (box.format) {\n    case FORMAT_PERCENT:\n      snprintf(buffer, bufferSize, &#8220;%d %%&#8221;, value);\n      break;\n    case FORMAT_TEMP_C:\n      snprintf(buffer, bufferSize, &#8220;%d C&#8221;, value);\n      break;\n    case FORMAT_MHZ:\n      snprintf(buffer, bufferSize, &#8220;%d MHz&#8221;, value);\n      break;\n    default:\n      snprintf(buffer, bufferSize, &#8220;%d&#8221;, value);\n      break;\n  }\n}\n\nvoid updateValue(const StatBox &amp;box, int value) {\n  char valueText[24];\n  makeValueText(box, value, valueText, sizeof(valueText));\n\n  int valueX = box.x + box.w \/ 2;\n  int valueY = box.y + box.h \/ 2 + 5;\n\n  \/\/ Clear value area only\n  tft.fillRect(box.x + 14, box.y + 24, box.w &#8211; 24, 25, COLOR_CARD);\n\n  tft.setTextDatum(MC_DATUM);\n  tft.setTextColor(COLOR_TEXT, COLOR_CARD);\n  tft.setTextSize(1);\n  tft.drawString(valueText, valueX, valueY, 4);\n}\n\nvoid updateStatBox(int index, int value, int oldValue) {\n  if (value == oldValue) {\n    return;\n  }\n\n  updateValue(boxes[index], value);\n  updateBar(boxes[index], value);\n}\n\nvoid updateDashboardValues() {\n  tft.startWrite();\n\n  updateStatBox(0, stats.cpu,      oldStats.cpu);\n  updateStatBox(1, stats.cpuTemp,  oldStats.cpuTemp);\n  updateStatBox(2, stats.ram,      oldStats.ram);\n  updateStatBox(3, stats.cpuClock, oldStats.cpuClock);\n  updateStatBox(4, stats.gpuLoad,  oldStats.gpuLoad);\n  updateStatBox(5, stats.gpuTemp,  oldStats.gpuTemp);\n\n  tft.endWrite();\n\n  oldStats = stats;\n}\n\nvoid updateStatusLine() {\n  bool dataStale = (lastPacketMs == 0 || millis() &#8211; lastPacketMs &gt; 3000);\n\n  if (dataStale == oldStaleState &amp;&amp; millis() &#8211; lastStatusUpdateMs &lt; 500) {\n    return;\n  }\n\n  oldStaleState = dataStale;\n  lastStatusUpdateMs = millis();\n\n  int statusY = tft.height() &#8211; STATUS_H;\n\n  tft.fillRect(0, statusY, tft.width(), STATUS_H, COLOR_BG);\n\n  tft.setTextDatum(MC_DATUM);\n  tft.setTextSize(1);\n\n  if (dataStale) {\n    tft.setTextColor(TFT_RED, COLOR_BG);\n\n    if (lastPacketMs == 0) {\n      tft.drawString(&#8220;Waiting for PC data&#8230;&#8221;, tft.width() \/ 2, statusY + STATUS_H \/ 2, 2);\n    } else {\n      tft.drawString(&#8220;PC data timeout&#8221;, tft.width() \/ 2, statusY + STATUS_H \/ 2, 2);\n    }\n  } else {\n    tft.setTextColor(TFT_GREEN, COLOR_BG);\n    tft.drawString(&#8220;LIVE&#8221;, tft.width() \/ 2, statusY + STATUS_H \/ 2, 2);\n  }\n}\n\nvoid setup() {\n  Serial.begin(115200);\n  delay(500);\n\n  pinMode(TFT_BL, OUTPUT);\n  digitalWrite(TFT_BL, HIGH);\n\n  tft.init();\n  tft.setRotation(1);\n\n  setupLayoutValues();\n  drawStaticLayout();\n\n  touchSPI.begin(14, 12, 13, TOUCH_CS);\n  ts.begin(touchSPI);\n  ts.setRotation(0);\n\n  updateDashboardValues();\n  updateStatusLine();\n\n  Serial.println(&#8220;ESP32 PC Stats Dashboard ready&#8221;);\n}\n\nvoid loop() {\n  readSerialData();\n\n  if (dataDirty) {\n    updateDashboardValues();\n    updateStatusLine();\n    dataDirty = false;\n  }\n\n  if (millis() &#8211; lastStatusUpdateMs &gt; 500) {\n    updateStatusLine();\n  }\n}\n<\/textarea>\n      <\/div>\n    <\/div>\n  <\/details>\n\n  <details class=\"ebox-details\">\n    <summary>pc_sender_skript.py<\/summary>\n    <div class=\"ebox-details-content\">\n      <p>\n        This Python sender script runs on the Windows PC. It reads CPU and RAM values with psutil,\n        reads CPU\/GPU temperature and GPU load from the LibreHardwareMonitor JSON endpoint, and sends\n        the values to the ESP32 over USB serial.\n      <\/p>\n\n      <div class=\"ebox-note\">\n        <strong>Serial format:<\/strong>\n        S,CPU,RAM,GPU_LOAD,CPU_TEMP,GPU_TEMP,CPU_CLOCK_MHZ\n      <\/div>\n\n      <div class=\"ebox-code-block\">\n        <div class=\"ebox-code-header\">\n          <span class=\"ebox-code-title\">pc_sender_skript.py<\/span>\n          <button class=\"ebox-copy-button\" onclick=\"eboxCopyCode('pcmon-final-python', this)\">Copy code<\/button>\n        <\/div>\n        <textarea id=\"pcmon-final-python\" class=\"ebox-code-textarea large\" readonly=\"\">&#105;&#109;&#112;&#111;&#114;&#116;&#32;&#97;&#114;&#103;&#112;&#97;&#114;&#115;&#101;\n&#105;&#109;&#112;&#111;&#114;&#116;&#32;&#106;&#115;&#111;&#110;\n&#105;&#109;&#112;&#111;&#114;&#116;&#32;&#114;&#101;\n&#105;&#109;&#112;&#111;&#114;&#116;&#32;&#116;&#105;&#109;&#101;\n&#105;&#109;&#112;&#111;&#114;&#116;&#32;&#117;&#114;&#108;&#108;&#105;&#98;&#46;&#101;&#114;&#114;&#111;&#114;\n&#105;&#109;&#112;&#111;&#114;&#116;&#32;&#117;&#114;&#108;&#108;&#105;&#98;&#46;&#114;&#101;&#113;&#117;&#101;&#115;&#116;\n\n&#105;&#109;&#112;&#111;&#114;&#116;&#32;&#112;&#115;&#117;&#116;&#105;&#108;\n&#105;&#109;&#112;&#111;&#114;&#116;&#32;&#115;&#101;&#114;&#105;&#97;&#108;\n\n\n&#99;&#108;&#97;&#115;&#115;&#32;&#76;&#105;&#98;&#114;&#101;&#72;&#97;&#114;&#100;&#119;&#97;&#114;&#101;&#77;&#111;&#110;&#105;&#116;&#111;&#114;&#74;&#115;&#111;&#110;&#82;&#101;&#97;&#100;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#100;&#101;&#102;&#32;&#95;&#95;&#105;&#110;&#105;&#116;&#95;&#95;&#40;&#115;&#101;&#108;&#102;&#44;&#32;&#117;&#114;&#108;&#41;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#101;&#108;&#102;&#46;&#117;&#114;&#108;&#32;&#61;&#32;&#117;&#114;&#108;\n\n&#32;&#32;&#32;&#32;&#100;&#101;&#102;&#32;&#95;&#108;&#111;&#97;&#100;&#95;&#106;&#115;&#111;&#110;&#40;&#115;&#101;&#108;&#102;&#41;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#116;&#114;&#121;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#119;&#105;&#116;&#104;&#32;&#117;&#114;&#108;&#108;&#105;&#98;&#46;&#114;&#101;&#113;&#117;&#101;&#115;&#116;&#46;&#117;&#114;&#108;&#111;&#112;&#101;&#110;&#40;&#115;&#101;&#108;&#102;&#46;&#117;&#114;&#108;&#44;&#32;&#116;&#105;&#109;&#101;&#111;&#117;&#116;&#61;&#50;&#41;&#32;&#97;&#115;&#32;&#114;&#101;&#115;&#112;&#111;&#110;&#115;&#101;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#114;&#101;&#116;&#117;&#114;&#110;&#32;&#106;&#115;&#111;&#110;&#46;&#108;&#111;&#97;&#100;&#115;&#40;&#114;&#101;&#115;&#112;&#111;&#110;&#115;&#101;&#46;&#114;&#101;&#97;&#100;&#40;&#41;&#46;&#100;&#101;&#99;&#111;&#100;&#101;&#40;&#34;&#117;&#116;&#102;&#45;&#56;&#34;&#44;&#32;&#101;&#114;&#114;&#111;&#114;&#115;&#61;&#34;&#114;&#101;&#112;&#108;&#97;&#99;&#101;&#34;&#41;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#101;&#120;&#99;&#101;&#112;&#116;&#32;&#117;&#114;&#108;&#108;&#105;&#98;&#46;&#101;&#114;&#114;&#111;&#114;&#46;&#85;&#82;&#76;&#69;&#114;&#114;&#111;&#114;&#32;&#97;&#115;&#32;&#101;&#120;&#99;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#112;&#114;&#105;&#110;&#116;&#40;&#102;&#34;&#91;&#87;&#65;&#82;&#78;&#93;&#32;&#67;&#111;&#117;&#108;&#100;&#32;&#110;&#111;&#116;&#32;&#114;&#101;&#97;&#100;&#32;&#76;&#105;&#98;&#114;&#101;&#72;&#97;&#114;&#100;&#119;&#97;&#114;&#101;&#77;&#111;&#110;&#105;&#116;&#111;&#114;&#32;&#74;&#83;&#79;&#78;&#58;&#32;&#123;&#101;&#120;&#99;&#125;&#34;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#114;&#101;&#116;&#117;&#114;&#110;&#32;&#78;&#111;&#110;&#101;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#101;&#120;&#99;&#101;&#112;&#116;&#32;&#69;&#120;&#99;&#101;&#112;&#116;&#105;&#111;&#110;&#32;&#97;&#115;&#32;&#101;&#120;&#99;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#112;&#114;&#105;&#110;&#116;&#40;&#102;&#34;&#91;&#87;&#65;&#82;&#78;&#93;&#32;&#74;&#83;&#79;&#78;&#32;&#114;&#101;&#97;&#100;&#32;&#101;&#114;&#114;&#111;&#114;&#58;&#32;&#123;&#101;&#120;&#99;&#125;&#34;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#114;&#101;&#116;&#117;&#114;&#110;&#32;&#78;&#111;&#110;&#101;\n\n&#32;&#32;&#32;&#32;&#100;&#101;&#102;&#32;&#95;&#119;&#97;&#108;&#107;&#40;&#115;&#101;&#108;&#102;&#44;&#32;&#110;&#111;&#100;&#101;&#44;&#32;&#112;&#97;&#116;&#104;&#61;&#34;&#34;&#41;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#116;&#101;&#120;&#116;&#32;&#61;&#32;&#115;&#116;&#114;&#40;&#110;&#111;&#100;&#101;&#46;&#103;&#101;&#116;&#40;&#34;&#84;&#101;&#120;&#116;&#34;&#44;&#32;&#34;&#34;&#41;&#41;&#46;&#115;&#116;&#114;&#105;&#112;&#40;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#118;&#97;&#108;&#117;&#101;&#32;&#61;&#32;&#115;&#116;&#114;&#40;&#110;&#111;&#100;&#101;&#46;&#103;&#101;&#116;&#40;&#34;&#86;&#97;&#108;&#117;&#101;&#34;&#44;&#32;&#34;&#34;&#41;&#41;&#46;&#115;&#116;&#114;&#105;&#112;&#40;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#99;&#117;&#114;&#114;&#101;&#110;&#116;&#95;&#112;&#97;&#116;&#104;&#32;&#61;&#32;&#102;&#34;&#123;&#112;&#97;&#116;&#104;&#125;&#32;&#47;&#32;&#123;&#116;&#101;&#120;&#116;&#125;&#34;&#32;&#105;&#102;&#32;&#116;&#101;&#120;&#116;&#32;&#101;&#108;&#115;&#101;&#32;&#112;&#97;&#116;&#104;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#118;&#97;&#108;&#117;&#101;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#121;&#105;&#101;&#108;&#100;&#32;&#99;&#117;&#114;&#114;&#101;&#110;&#116;&#95;&#112;&#97;&#116;&#104;&#44;&#32;&#116;&#101;&#120;&#116;&#44;&#32;&#118;&#97;&#108;&#117;&#101;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#102;&#111;&#114;&#32;&#99;&#104;&#105;&#108;&#100;&#32;&#105;&#110;&#32;&#110;&#111;&#100;&#101;&#46;&#103;&#101;&#116;&#40;&#34;&#67;&#104;&#105;&#108;&#100;&#114;&#101;&#110;&#34;&#44;&#32;&#91;&#93;&#41;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#121;&#105;&#101;&#108;&#100;&#32;&#102;&#114;&#111;&#109;&#32;&#115;&#101;&#108;&#102;&#46;&#95;&#119;&#97;&#108;&#107;&#40;&#99;&#104;&#105;&#108;&#100;&#44;&#32;&#99;&#117;&#114;&#114;&#101;&#110;&#116;&#95;&#112;&#97;&#116;&#104;&#41;\n\n&#32;&#32;&#32;&#32;&#100;&#101;&#102;&#32;&#95;&#112;&#97;&#114;&#115;&#101;&#95;&#110;&#117;&#109;&#98;&#101;&#114;&#40;&#115;&#101;&#108;&#102;&#44;&#32;&#118;&#97;&#108;&#117;&#101;&#95;&#116;&#101;&#120;&#116;&#41;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#118;&#97;&#108;&#117;&#101;&#95;&#116;&#101;&#120;&#116;&#32;&#61;&#32;&#118;&#97;&#108;&#117;&#101;&#95;&#116;&#101;&#120;&#116;&#46;&#114;&#101;&#112;&#108;&#97;&#99;&#101;&#40;&#34;&#44;&#34;&#44;&#32;&#34;&#46;&#34;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#109;&#97;&#116;&#99;&#104;&#32;&#61;&#32;&#114;&#101;&#46;&#115;&#101;&#97;&#114;&#99;&#104;&#40;&#114;&#34;&#45;&#63;&#92;&#100;&#43;&#40;&#92;&#46;&#92;&#100;&#43;&#41;&#63;&#34;&#44;&#32;&#118;&#97;&#108;&#117;&#101;&#95;&#116;&#101;&#120;&#116;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#110;&#111;&#116;&#32;&#109;&#97;&#116;&#99;&#104;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#114;&#101;&#116;&#117;&#114;&#110;&#32;&#78;&#111;&#110;&#101;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#114;&#101;&#116;&#117;&#114;&#110;&#32;&#102;&#108;&#111;&#97;&#116;&#40;&#109;&#97;&#116;&#99;&#104;&#46;&#103;&#114;&#111;&#117;&#112;&#40;&#48;&#41;&#41;\n\n&#32;&#32;&#32;&#32;&#100;&#101;&#102;&#32;&#114;&#101;&#97;&#100;&#40;&#115;&#101;&#108;&#102;&#41;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#114;&#101;&#115;&#117;&#108;&#116;&#32;&#61;&#32;&#123;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#99;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#34;&#58;&#32;&#45;&#49;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#103;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#34;&#58;&#32;&#45;&#49;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#103;&#112;&#117;&#95;&#108;&#111;&#97;&#100;&#34;&#58;&#32;&#45;&#49;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#125;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#100;&#97;&#116;&#97;&#32;&#61;&#32;&#115;&#101;&#108;&#102;&#46;&#95;&#108;&#111;&#97;&#100;&#95;&#106;&#115;&#111;&#110;&#40;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#100;&#97;&#116;&#97;&#32;&#105;&#115;&#32;&#78;&#111;&#110;&#101;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#114;&#101;&#116;&#117;&#114;&#110;&#32;&#114;&#101;&#115;&#117;&#108;&#116;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#99;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#95;&#99;&#97;&#110;&#100;&#105;&#100;&#97;&#116;&#101;&#115;&#32;&#61;&#32;&#91;&#93;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#103;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#95;&#99;&#97;&#110;&#100;&#105;&#100;&#97;&#116;&#101;&#115;&#32;&#61;&#32;&#91;&#93;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#103;&#112;&#117;&#95;&#108;&#111;&#97;&#100;&#95;&#99;&#97;&#110;&#100;&#105;&#100;&#97;&#116;&#101;&#115;&#32;&#61;&#32;&#91;&#93;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#99;&#112;&#117;&#95;&#116;&#111;&#107;&#101;&#110;&#115;&#32;&#61;&#32;&#91;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#99;&#112;&#117;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#114;&#121;&#122;&#101;&#110;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#105;&#110;&#116;&#101;&#108;&#32;&#99;&#111;&#114;&#101;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#99;&#111;&#114;&#101;&#32;&#105;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#99;&#111;&#114;&#101;&#32;&#117;&#108;&#116;&#114;&#97;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#112;&#114;&#111;&#99;&#101;&#115;&#115;&#111;&#114;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#93;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#103;&#112;&#117;&#95;&#116;&#111;&#107;&#101;&#110;&#115;&#32;&#61;&#32;&#91;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#103;&#112;&#117;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#110;&#118;&#105;&#100;&#105;&#97;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#103;&#101;&#102;&#111;&#114;&#99;&#101;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#114;&#116;&#120;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#103;&#116;&#120;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#114;&#97;&#100;&#101;&#111;&#110;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#114;&#120;&#32;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#97;&#114;&#99;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#93;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#109;&#111;&#116;&#104;&#101;&#114;&#98;&#111;&#97;&#114;&#100;&#95;&#116;&#111;&#107;&#101;&#110;&#115;&#32;&#61;&#32;&#91;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#109;&#97;&#105;&#110;&#98;&#111;&#97;&#114;&#100;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#109;&#111;&#116;&#104;&#101;&#114;&#98;&#111;&#97;&#114;&#100;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#110;&#117;&#118;&#111;&#116;&#111;&#110;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#105;&#116;&#101;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#97;&#115;&#117;&#115;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#112;&#114;&#105;&#109;&#101;&#32;&#98;&#53;&#53;&#48;&#45;&#112;&#108;&#117;&#115;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#93;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#102;&#111;&#114;&#32;&#112;&#97;&#116;&#104;&#44;&#32;&#116;&#101;&#120;&#116;&#44;&#32;&#118;&#97;&#108;&#117;&#101;&#95;&#116;&#101;&#120;&#116;&#32;&#105;&#110;&#32;&#115;&#101;&#108;&#102;&#46;&#95;&#119;&#97;&#108;&#107;&#40;&#100;&#97;&#116;&#97;&#41;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#112;&#97;&#116;&#104;&#95;&#108;&#111;&#119;&#101;&#114;&#32;&#61;&#32;&#112;&#97;&#116;&#104;&#46;&#108;&#111;&#119;&#101;&#114;&#40;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#32;&#61;&#32;&#116;&#101;&#120;&#116;&#46;&#108;&#111;&#119;&#101;&#114;&#40;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#118;&#97;&#108;&#117;&#101;&#95;&#108;&#111;&#119;&#101;&#114;&#32;&#61;&#32;&#118;&#97;&#108;&#117;&#101;&#95;&#116;&#101;&#120;&#116;&#46;&#108;&#111;&#119;&#101;&#114;&#40;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#118;&#97;&#108;&#117;&#101;&#32;&#61;&#32;&#115;&#101;&#108;&#102;&#46;&#95;&#112;&#97;&#114;&#115;&#101;&#95;&#110;&#117;&#109;&#98;&#101;&#114;&#40;&#118;&#97;&#108;&#117;&#101;&#95;&#116;&#101;&#120;&#116;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#118;&#97;&#108;&#117;&#101;&#32;&#105;&#115;&#32;&#78;&#111;&#110;&#101;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#99;&#111;&#110;&#116;&#105;&#110;&#117;&#101;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#115;&#95;&#116;&#101;&#109;&#112;&#101;&#114;&#97;&#116;&#117;&#114;&#101;&#32;&#61;&#32;&#34;&#176;&#99;&#34;&#32;&#105;&#110;&#32;&#118;&#97;&#108;&#117;&#101;&#95;&#108;&#111;&#119;&#101;&#114;&#32;&#111;&#114;&#32;&#34;&#32;&#99;&#34;&#32;&#105;&#110;&#32;&#118;&#97;&#108;&#117;&#101;&#95;&#108;&#111;&#119;&#101;&#114;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#115;&#95;&#112;&#101;&#114;&#99;&#101;&#110;&#116;&#32;&#61;&#32;&#34;&#37;&#34;&#32;&#105;&#110;&#32;&#118;&#97;&#108;&#117;&#101;&#95;&#108;&#111;&#119;&#101;&#114;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#115;&#95;&#99;&#112;&#117;&#95;&#112;&#97;&#116;&#104;&#32;&#61;&#32;&#97;&#110;&#121;&#40;&#116;&#111;&#107;&#101;&#110;&#32;&#105;&#110;&#32;&#112;&#97;&#116;&#104;&#95;&#108;&#111;&#119;&#101;&#114;&#32;&#102;&#111;&#114;&#32;&#116;&#111;&#107;&#101;&#110;&#32;&#105;&#110;&#32;&#99;&#112;&#117;&#95;&#116;&#111;&#107;&#101;&#110;&#115;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#115;&#95;&#103;&#112;&#117;&#95;&#112;&#97;&#116;&#104;&#32;&#61;&#32;&#97;&#110;&#121;&#40;&#116;&#111;&#107;&#101;&#110;&#32;&#105;&#110;&#32;&#112;&#97;&#116;&#104;&#95;&#108;&#111;&#119;&#101;&#114;&#32;&#102;&#111;&#114;&#32;&#116;&#111;&#107;&#101;&#110;&#32;&#105;&#110;&#32;&#103;&#112;&#117;&#95;&#116;&#111;&#107;&#101;&#110;&#115;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#115;&#95;&#109;&#111;&#116;&#104;&#101;&#114;&#98;&#111;&#97;&#114;&#100;&#95;&#112;&#97;&#116;&#104;&#32;&#61;&#32;&#97;&#110;&#121;&#40;&#116;&#111;&#107;&#101;&#110;&#32;&#105;&#110;&#32;&#112;&#97;&#116;&#104;&#95;&#108;&#111;&#119;&#101;&#114;&#32;&#102;&#111;&#114;&#32;&#116;&#111;&#107;&#101;&#110;&#32;&#105;&#110;&#32;&#109;&#111;&#116;&#104;&#101;&#114;&#98;&#111;&#97;&#114;&#100;&#95;&#116;&#111;&#107;&#101;&#110;&#115;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#35;&#32;&#67;&#80;&#85;&#32;&#116;&#101;&#109;&#112;&#101;&#114;&#97;&#116;&#117;&#114;&#101;&#58;&#32;&#112;&#114;&#101;&#102;&#101;&#114;&#32;&#67;&#80;&#85;&#32;&#104;&#97;&#114;&#100;&#119;&#97;&#114;&#101;&#32;&#110;&#111;&#100;&#101;&#44;&#32;&#110;&#111;&#116;&#32;&#109;&#111;&#116;&#104;&#101;&#114;&#98;&#111;&#97;&#114;&#100;&#32;&#115;&#101;&#110;&#115;&#111;&#114;&#32;&#99;&#104;&#105;&#112;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#105;&#115;&#95;&#116;&#101;&#109;&#112;&#101;&#114;&#97;&#116;&#117;&#114;&#101;&#32;&#97;&#110;&#100;&#32;&#105;&#115;&#95;&#99;&#112;&#117;&#95;&#112;&#97;&#116;&#104;&#32;&#97;&#110;&#100;&#32;&#110;&#111;&#116;&#32;&#105;&#115;&#95;&#109;&#111;&#116;&#104;&#101;&#114;&#98;&#111;&#97;&#114;&#100;&#95;&#112;&#97;&#116;&#104;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#61;&#32;&#48;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#34;&#112;&#97;&#99;&#107;&#97;&#103;&#101;&#34;&#32;&#105;&#110;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#43;&#61;&#32;&#53;&#48;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#34;&#116;&#99;&#116;&#108;&#34;&#32;&#105;&#110;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#32;&#111;&#114;&#32;&#34;&#116;&#100;&#105;&#101;&#34;&#32;&#105;&#110;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#43;&#61;&#32;&#53;&#48;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#34;&#99;&#111;&#114;&#101;&#32;&#109;&#97;&#120;&#34;&#32;&#105;&#110;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#43;&#61;&#32;&#52;&#48;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#34;&#99;&#112;&#117;&#34;&#32;&#105;&#110;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#43;&#61;&#32;&#51;&#48;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#34;&#99;&#111;&#114;&#101;&#34;&#32;&#105;&#110;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#43;&#61;&#32;&#50;&#48;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#99;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#95;&#99;&#97;&#110;&#100;&#105;&#100;&#97;&#116;&#101;&#115;&#46;&#97;&#112;&#112;&#101;&#110;&#100;&#40;&#40;&#115;&#99;&#111;&#114;&#101;&#44;&#32;&#118;&#97;&#108;&#117;&#101;&#44;&#32;&#112;&#97;&#116;&#104;&#41;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#35;&#32;&#71;&#80;&#85;&#32;&#116;&#101;&#109;&#112;&#101;&#114;&#97;&#116;&#117;&#114;&#101;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#105;&#115;&#95;&#116;&#101;&#109;&#112;&#101;&#114;&#97;&#116;&#117;&#114;&#101;&#32;&#97;&#110;&#100;&#32;&#105;&#115;&#95;&#103;&#112;&#117;&#95;&#112;&#97;&#116;&#104;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#61;&#32;&#48;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#34;&#103;&#112;&#117;&#32;&#99;&#111;&#114;&#101;&#34;&#32;&#105;&#110;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#43;&#61;&#32;&#53;&#48;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#34;&#104;&#111;&#116;&#32;&#115;&#112;&#111;&#116;&#34;&#32;&#105;&#110;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#43;&#61;&#32;&#52;&#48;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#34;&#103;&#112;&#117;&#34;&#32;&#105;&#110;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#43;&#61;&#32;&#51;&#48;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#34;&#99;&#111;&#114;&#101;&#34;&#32;&#105;&#110;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#43;&#61;&#32;&#50;&#48;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#103;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#95;&#99;&#97;&#110;&#100;&#105;&#100;&#97;&#116;&#101;&#115;&#46;&#97;&#112;&#112;&#101;&#110;&#100;&#40;&#40;&#115;&#99;&#111;&#114;&#101;&#44;&#32;&#118;&#97;&#108;&#117;&#101;&#44;&#32;&#112;&#97;&#116;&#104;&#41;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#35;&#32;&#71;&#80;&#85;&#32;&#108;&#111;&#97;&#100;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#105;&#115;&#95;&#112;&#101;&#114;&#99;&#101;&#110;&#116;&#32;&#97;&#110;&#100;&#32;&#105;&#115;&#95;&#103;&#112;&#117;&#95;&#112;&#97;&#116;&#104;&#32;&#97;&#110;&#100;&#32;&#34;&#108;&#111;&#97;&#100;&#34;&#32;&#105;&#110;&#32;&#112;&#97;&#116;&#104;&#95;&#108;&#111;&#119;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#61;&#32;&#48;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#34;&#103;&#112;&#117;&#32;&#99;&#111;&#114;&#101;&#34;&#32;&#105;&#110;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#43;&#61;&#32;&#53;&#48;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#34;&#103;&#112;&#117;&#34;&#32;&#105;&#110;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#43;&#61;&#32;&#52;&#48;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#34;&#51;&#100;&#34;&#32;&#105;&#110;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#43;&#61;&#32;&#51;&#48;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#34;&#100;&#51;&#100;&#34;&#32;&#105;&#110;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#43;&#61;&#32;&#51;&#48;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#34;&#99;&#111;&#114;&#101;&#34;&#32;&#105;&#110;&#32;&#116;&#101;&#120;&#116;&#95;&#108;&#111;&#119;&#101;&#114;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#99;&#111;&#114;&#101;&#32;&#43;&#61;&#32;&#50;&#48;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#103;&#112;&#117;&#95;&#108;&#111;&#97;&#100;&#95;&#99;&#97;&#110;&#100;&#105;&#100;&#97;&#116;&#101;&#115;&#46;&#97;&#112;&#112;&#101;&#110;&#100;&#40;&#40;&#115;&#99;&#111;&#114;&#101;&#44;&#32;&#118;&#97;&#108;&#117;&#101;&#44;&#32;&#112;&#97;&#116;&#104;&#41;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#99;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#95;&#99;&#97;&#110;&#100;&#105;&#100;&#97;&#116;&#101;&#115;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#99;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#95;&#99;&#97;&#110;&#100;&#105;&#100;&#97;&#116;&#101;&#115;&#46;&#115;&#111;&#114;&#116;&#40;&#107;&#101;&#121;&#61;&#108;&#97;&#109;&#98;&#100;&#97;&#32;&#105;&#116;&#101;&#109;&#58;&#32;&#40;&#105;&#116;&#101;&#109;&#91;&#48;&#93;&#44;&#32;&#105;&#116;&#101;&#109;&#91;&#49;&#93;&#41;&#44;&#32;&#114;&#101;&#118;&#101;&#114;&#115;&#101;&#61;&#84;&#114;&#117;&#101;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#114;&#101;&#115;&#117;&#108;&#116;&#91;&#34;&#99;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#34;&#93;&#32;&#61;&#32;&#114;&#111;&#117;&#110;&#100;&#40;&#99;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#95;&#99;&#97;&#110;&#100;&#105;&#100;&#97;&#116;&#101;&#115;&#91;&#48;&#93;&#91;&#49;&#93;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#103;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#95;&#99;&#97;&#110;&#100;&#105;&#100;&#97;&#116;&#101;&#115;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#103;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#95;&#99;&#97;&#110;&#100;&#105;&#100;&#97;&#116;&#101;&#115;&#46;&#115;&#111;&#114;&#116;&#40;&#107;&#101;&#121;&#61;&#108;&#97;&#109;&#98;&#100;&#97;&#32;&#105;&#116;&#101;&#109;&#58;&#32;&#40;&#105;&#116;&#101;&#109;&#91;&#48;&#93;&#44;&#32;&#105;&#116;&#101;&#109;&#91;&#49;&#93;&#41;&#44;&#32;&#114;&#101;&#118;&#101;&#114;&#115;&#101;&#61;&#84;&#114;&#117;&#101;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#114;&#101;&#115;&#117;&#108;&#116;&#91;&#34;&#103;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#34;&#93;&#32;&#61;&#32;&#114;&#111;&#117;&#110;&#100;&#40;&#103;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#95;&#99;&#97;&#110;&#100;&#105;&#100;&#97;&#116;&#101;&#115;&#91;&#48;&#93;&#91;&#49;&#93;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#103;&#112;&#117;&#95;&#108;&#111;&#97;&#100;&#95;&#99;&#97;&#110;&#100;&#105;&#100;&#97;&#116;&#101;&#115;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#103;&#112;&#117;&#95;&#108;&#111;&#97;&#100;&#95;&#99;&#97;&#110;&#100;&#105;&#100;&#97;&#116;&#101;&#115;&#46;&#115;&#111;&#114;&#116;&#40;&#107;&#101;&#121;&#61;&#108;&#97;&#109;&#98;&#100;&#97;&#32;&#105;&#116;&#101;&#109;&#58;&#32;&#40;&#105;&#116;&#101;&#109;&#91;&#48;&#93;&#44;&#32;&#105;&#116;&#101;&#109;&#91;&#49;&#93;&#41;&#44;&#32;&#114;&#101;&#118;&#101;&#114;&#115;&#101;&#61;&#84;&#114;&#117;&#101;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#114;&#101;&#115;&#117;&#108;&#116;&#91;&#34;&#103;&#112;&#117;&#95;&#108;&#111;&#97;&#100;&#34;&#93;&#32;&#61;&#32;&#114;&#111;&#117;&#110;&#100;&#40;&#103;&#112;&#117;&#95;&#108;&#111;&#97;&#100;&#95;&#99;&#97;&#110;&#100;&#105;&#100;&#97;&#116;&#101;&#115;&#91;&#48;&#93;&#91;&#49;&#93;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#114;&#101;&#116;&#117;&#114;&#110;&#32;&#114;&#101;&#115;&#117;&#108;&#116;\n\n\n&#100;&#101;&#102;&#32;&#99;&#108;&#97;&#109;&#112;&#95;&#112;&#101;&#114;&#99;&#101;&#110;&#116;&#40;&#118;&#97;&#108;&#117;&#101;&#41;&#58;\n&#32;&#32;&#32;&#32;&#114;&#101;&#116;&#117;&#114;&#110;&#32;&#109;&#97;&#120;&#40;&#48;&#44;&#32;&#109;&#105;&#110;&#40;&#49;&#48;&#48;&#44;&#32;&#105;&#110;&#116;&#40;&#114;&#111;&#117;&#110;&#100;&#40;&#118;&#97;&#108;&#117;&#101;&#41;&#41;&#41;&#41;\n\n\n&#100;&#101;&#102;&#32;&#114;&#101;&#97;&#100;&#95;&#99;&#112;&#117;&#95;&#99;&#108;&#111;&#99;&#107;&#95;&#109;&#104;&#122;&#40;&#41;&#58;\n&#32;&#32;&#32;&#32;&#34;&#34;&#34;&#82;&#101;&#116;&#117;&#114;&#110;&#32;&#99;&#117;&#114;&#114;&#101;&#110;&#116;&#32;&#67;&#80;&#85;&#32;&#99;&#108;&#111;&#99;&#107;&#32;&#115;&#112;&#101;&#101;&#100;&#32;&#105;&#110;&#32;&#77;&#72;&#122;&#44;&#32;&#111;&#114;&#32;&#45;&#49;&#32;&#105;&#102;&#32;&#117;&#110;&#97;&#118;&#97;&#105;&#108;&#97;&#98;&#108;&#101;&#46;&#34;&#34;&#34;\n&#32;&#32;&#32;&#32;&#116;&#114;&#121;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#102;&#114;&#101;&#113;&#32;&#61;&#32;&#112;&#115;&#117;&#116;&#105;&#108;&#46;&#99;&#112;&#117;&#95;&#102;&#114;&#101;&#113;&#40;&#41;\n&#32;&#32;&#32;&#32;&#101;&#120;&#99;&#101;&#112;&#116;&#32;&#69;&#120;&#99;&#101;&#112;&#116;&#105;&#111;&#110;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#114;&#101;&#116;&#117;&#114;&#110;&#32;&#45;&#49;\n\n&#32;&#32;&#32;&#32;&#105;&#102;&#32;&#102;&#114;&#101;&#113;&#32;&#105;&#115;&#32;&#78;&#111;&#110;&#101;&#32;&#111;&#114;&#32;&#102;&#114;&#101;&#113;&#46;&#99;&#117;&#114;&#114;&#101;&#110;&#116;&#32;&#105;&#115;&#32;&#78;&#111;&#110;&#101;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#114;&#101;&#116;&#117;&#114;&#110;&#32;&#45;&#49;\n\n&#32;&#32;&#32;&#32;&#114;&#101;&#116;&#117;&#114;&#110;&#32;&#109;&#97;&#120;&#40;&#48;&#44;&#32;&#105;&#110;&#116;&#40;&#114;&#111;&#117;&#110;&#100;&#40;&#102;&#114;&#101;&#113;&#46;&#99;&#117;&#114;&#114;&#101;&#110;&#116;&#41;&#41;&#41;\n\n\n&#100;&#101;&#102;&#32;&#109;&#97;&#105;&#110;&#40;&#41;&#58;\n&#32;&#32;&#32;&#32;&#112;&#97;&#114;&#115;&#101;&#114;&#32;&#61;&#32;&#97;&#114;&#103;&#112;&#97;&#114;&#115;&#101;&#46;&#65;&#114;&#103;&#117;&#109;&#101;&#110;&#116;&#80;&#97;&#114;&#115;&#101;&#114;&#40;&#100;&#101;&#115;&#99;&#114;&#105;&#112;&#116;&#105;&#111;&#110;&#61;&#34;&#83;&#101;&#110;&#100;&#32;&#87;&#105;&#110;&#100;&#111;&#119;&#115;&#32;&#80;&#67;&#32;&#115;&#116;&#97;&#116;&#115;&#32;&#116;&#111;&#32;&#69;&#83;&#80;&#51;&#50;&#32;&#111;&#118;&#101;&#114;&#32;&#115;&#101;&#114;&#105;&#97;&#108;&#46;&#34;&#41;\n\n&#32;&#32;&#32;&#32;&#112;&#97;&#114;&#115;&#101;&#114;&#46;&#97;&#100;&#100;&#95;&#97;&#114;&#103;&#117;&#109;&#101;&#110;&#116;&#40;&#34;&#112;&#111;&#114;&#116;&#34;&#44;&#32;&#104;&#101;&#108;&#112;&#61;&#34;&#69;&#83;&#80;&#51;&#50;&#32;&#67;&#79;&#77;&#32;&#112;&#111;&#114;&#116;&#44;&#32;&#102;&#111;&#114;&#32;&#101;&#120;&#97;&#109;&#112;&#108;&#101;&#32;&#67;&#79;&#77;&#53;&#34;&#41;\n&#32;&#32;&#32;&#32;&#112;&#97;&#114;&#115;&#101;&#114;&#46;&#97;&#100;&#100;&#95;&#97;&#114;&#103;&#117;&#109;&#101;&#110;&#116;&#40;&#34;&#45;&#45;&#98;&#97;&#117;&#100;&#34;&#44;&#32;&#116;&#121;&#112;&#101;&#61;&#105;&#110;&#116;&#44;&#32;&#100;&#101;&#102;&#97;&#117;&#108;&#116;&#61;&#49;&#49;&#53;&#50;&#48;&#48;&#44;&#32;&#104;&#101;&#108;&#112;&#61;&#34;&#83;&#101;&#114;&#105;&#97;&#108;&#32;&#98;&#97;&#117;&#100;&#32;&#114;&#97;&#116;&#101;&#34;&#41;\n&#32;&#32;&#32;&#32;&#112;&#97;&#114;&#115;&#101;&#114;&#46;&#97;&#100;&#100;&#95;&#97;&#114;&#103;&#117;&#109;&#101;&#110;&#116;&#40;&#34;&#45;&#45;&#105;&#110;&#116;&#101;&#114;&#118;&#97;&#108;&#34;&#44;&#32;&#116;&#121;&#112;&#101;&#61;&#102;&#108;&#111;&#97;&#116;&#44;&#32;&#100;&#101;&#102;&#97;&#117;&#108;&#116;&#61;&#49;&#46;&#48;&#44;&#32;&#104;&#101;&#108;&#112;&#61;&#34;&#85;&#112;&#100;&#97;&#116;&#101;&#32;&#105;&#110;&#116;&#101;&#114;&#118;&#97;&#108;&#32;&#105;&#110;&#32;&#115;&#101;&#99;&#111;&#110;&#100;&#115;&#34;&#41;\n&#32;&#32;&#32;&#32;&#112;&#97;&#114;&#115;&#101;&#114;&#46;&#97;&#100;&#100;&#95;&#97;&#114;&#103;&#117;&#109;&#101;&#110;&#116;&#40;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#34;&#45;&#45;&#108;&#104;&#109;&#45;&#117;&#114;&#108;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#100;&#101;&#102;&#97;&#117;&#108;&#116;&#61;&#34;&#104;&#116;&#116;&#112;&#58;&#47;&#47;&#108;&#111;&#99;&#97;&#108;&#104;&#111;&#115;&#116;&#58;&#56;&#48;&#56;&#53;&#47;&#100;&#97;&#116;&#97;&#46;&#106;&#115;&#111;&#110;&#34;&#44;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#104;&#101;&#108;&#112;&#61;&#34;&#76;&#105;&#98;&#114;&#101;&#72;&#97;&#114;&#100;&#119;&#97;&#114;&#101;&#77;&#111;&#110;&#105;&#116;&#111;&#114;&#32;&#74;&#83;&#79;&#78;&#32;&#101;&#110;&#100;&#112;&#111;&#105;&#110;&#116;&#34;&#44;\n&#32;&#32;&#32;&#32;&#41;\n\n&#32;&#32;&#32;&#32;&#97;&#114;&#103;&#115;&#32;&#61;&#32;&#112;&#97;&#114;&#115;&#101;&#114;&#46;&#112;&#97;&#114;&#115;&#101;&#95;&#97;&#114;&#103;&#115;&#40;&#41;\n\n&#32;&#32;&#32;&#32;&#104;&#97;&#114;&#100;&#119;&#97;&#114;&#101;&#32;&#61;&#32;&#76;&#105;&#98;&#114;&#101;&#72;&#97;&#114;&#100;&#119;&#97;&#114;&#101;&#77;&#111;&#110;&#105;&#116;&#111;&#114;&#74;&#115;&#111;&#110;&#82;&#101;&#97;&#100;&#101;&#114;&#40;&#97;&#114;&#103;&#115;&#46;&#108;&#104;&#109;&#95;&#117;&#114;&#108;&#41;\n\n&#32;&#32;&#32;&#32;&#112;&#114;&#105;&#110;&#116;&#40;&#102;&#34;&#91;&#79;&#75;&#93;&#32;&#79;&#112;&#101;&#110;&#105;&#110;&#103;&#32;&#115;&#101;&#114;&#105;&#97;&#108;&#32;&#112;&#111;&#114;&#116;&#32;&#123;&#97;&#114;&#103;&#115;&#46;&#112;&#111;&#114;&#116;&#125;&#32;&#97;&#116;&#32;&#123;&#97;&#114;&#103;&#115;&#46;&#98;&#97;&#117;&#100;&#125;&#32;&#98;&#97;&#117;&#100;&#46;&#46;&#46;&#34;&#41;\n&#32;&#32;&#32;&#32;&#115;&#101;&#114;&#32;&#61;&#32;&#115;&#101;&#114;&#105;&#97;&#108;&#46;&#83;&#101;&#114;&#105;&#97;&#108;&#40;&#97;&#114;&#103;&#115;&#46;&#112;&#111;&#114;&#116;&#44;&#32;&#97;&#114;&#103;&#115;&#46;&#98;&#97;&#117;&#100;&#44;&#32;&#116;&#105;&#109;&#101;&#111;&#117;&#116;&#61;&#49;&#41;\n\n&#32;&#32;&#32;&#32;&#116;&#105;&#109;&#101;&#46;&#115;&#108;&#101;&#101;&#112;&#40;&#50;&#41;\n\n&#32;&#32;&#32;&#32;&#112;&#115;&#117;&#116;&#105;&#108;&#46;&#99;&#112;&#117;&#95;&#112;&#101;&#114;&#99;&#101;&#110;&#116;&#40;&#105;&#110;&#116;&#101;&#114;&#118;&#97;&#108;&#61;&#78;&#111;&#110;&#101;&#41;\n\n&#32;&#32;&#32;&#32;&#112;&#114;&#105;&#110;&#116;&#40;&#34;&#91;&#79;&#75;&#93;&#32;&#83;&#101;&#110;&#100;&#105;&#110;&#103;&#32;&#80;&#67;&#32;&#115;&#116;&#97;&#116;&#115;&#32;&#116;&#111;&#32;&#69;&#83;&#80;&#51;&#50;&#46;&#34;&#41;\n&#32;&#32;&#32;&#32;&#112;&#114;&#105;&#110;&#116;&#40;&#34;&#91;&#73;&#78;&#70;&#79;&#93;&#32;&#70;&#111;&#114;&#109;&#97;&#116;&#58;&#32;&#83;&#44;&#67;&#80;&#85;&#44;&#82;&#65;&#77;&#44;&#71;&#80;&#85;&#95;&#76;&#79;&#65;&#68;&#44;&#67;&#80;&#85;&#95;&#84;&#69;&#77;&#80;&#44;&#71;&#80;&#85;&#95;&#84;&#69;&#77;&#80;&#44;&#67;&#80;&#85;&#95;&#67;&#76;&#79;&#67;&#75;&#95;&#77;&#72;&#90;&#34;&#41;\n&#32;&#32;&#32;&#32;&#112;&#114;&#105;&#110;&#116;&#40;&#34;&#91;&#73;&#78;&#70;&#79;&#93;&#32;&#80;&#114;&#101;&#115;&#115;&#32;&#67;&#84;&#82;&#76;&#43;&#67;&#32;&#116;&#111;&#32;&#115;&#116;&#111;&#112;&#46;&#92;&#110;&#34;&#41;\n\n&#32;&#32;&#32;&#32;&#116;&#114;&#121;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#119;&#104;&#105;&#108;&#101;&#32;&#84;&#114;&#117;&#101;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#99;&#112;&#117;&#95;&#112;&#101;&#114;&#99;&#101;&#110;&#116;&#32;&#61;&#32;&#99;&#108;&#97;&#109;&#112;&#95;&#112;&#101;&#114;&#99;&#101;&#110;&#116;&#40;&#112;&#115;&#117;&#116;&#105;&#108;&#46;&#99;&#112;&#117;&#95;&#112;&#101;&#114;&#99;&#101;&#110;&#116;&#40;&#105;&#110;&#116;&#101;&#114;&#118;&#97;&#108;&#61;&#48;&#46;&#50;&#41;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#114;&#97;&#109;&#95;&#112;&#101;&#114;&#99;&#101;&#110;&#116;&#32;&#61;&#32;&#99;&#108;&#97;&#109;&#112;&#95;&#112;&#101;&#114;&#99;&#101;&#110;&#116;&#40;&#112;&#115;&#117;&#116;&#105;&#108;&#46;&#118;&#105;&#114;&#116;&#117;&#97;&#108;&#95;&#109;&#101;&#109;&#111;&#114;&#121;&#40;&#41;&#46;&#112;&#101;&#114;&#99;&#101;&#110;&#116;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#99;&#112;&#117;&#95;&#99;&#108;&#111;&#99;&#107;&#95;&#109;&#104;&#122;&#32;&#61;&#32;&#114;&#101;&#97;&#100;&#95;&#99;&#112;&#117;&#95;&#99;&#108;&#111;&#99;&#107;&#95;&#109;&#104;&#122;&#40;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#104;&#119;&#32;&#61;&#32;&#104;&#97;&#114;&#100;&#119;&#97;&#114;&#101;&#46;&#114;&#101;&#97;&#100;&#40;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#103;&#112;&#117;&#95;&#108;&#111;&#97;&#100;&#32;&#61;&#32;&#105;&#110;&#116;&#40;&#104;&#119;&#91;&#34;&#103;&#112;&#117;&#95;&#108;&#111;&#97;&#100;&#34;&#93;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#99;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#32;&#61;&#32;&#105;&#110;&#116;&#40;&#104;&#119;&#91;&#34;&#99;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#34;&#93;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#103;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#32;&#61;&#32;&#105;&#110;&#116;&#40;&#104;&#119;&#91;&#34;&#103;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#34;&#93;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#108;&#105;&#110;&#101;&#32;&#61;&#32;&#40;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#102;&#34;&#83;&#44;&#34;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#102;&#34;&#123;&#99;&#112;&#117;&#95;&#112;&#101;&#114;&#99;&#101;&#110;&#116;&#125;&#44;&#34;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#102;&#34;&#123;&#114;&#97;&#109;&#95;&#112;&#101;&#114;&#99;&#101;&#110;&#116;&#125;&#44;&#34;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#102;&#34;&#123;&#103;&#112;&#117;&#95;&#108;&#111;&#97;&#100;&#125;&#44;&#34;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#102;&#34;&#123;&#99;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#125;&#44;&#34;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#102;&#34;&#123;&#103;&#112;&#117;&#95;&#116;&#101;&#109;&#112;&#125;&#44;&#34;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#102;&#34;&#123;&#99;&#112;&#117;&#95;&#99;&#108;&#111;&#99;&#107;&#95;&#109;&#104;&#122;&#125;&#92;&#110;&#34;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#101;&#114;&#46;&#119;&#114;&#105;&#116;&#101;&#40;&#108;&#105;&#110;&#101;&#46;&#101;&#110;&#99;&#111;&#100;&#101;&#40;&#34;&#97;&#115;&#99;&#105;&#105;&#34;&#41;&#41;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#101;&#114;&#46;&#102;&#108;&#117;&#115;&#104;&#40;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#112;&#114;&#105;&#110;&#116;&#40;&#108;&#105;&#110;&#101;&#46;&#115;&#116;&#114;&#105;&#112;&#40;&#41;&#41;\n\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#116;&#105;&#109;&#101;&#46;&#115;&#108;&#101;&#101;&#112;&#40;&#97;&#114;&#103;&#115;&#46;&#105;&#110;&#116;&#101;&#114;&#118;&#97;&#108;&#41;\n\n&#32;&#32;&#32;&#32;&#101;&#120;&#99;&#101;&#112;&#116;&#32;&#75;&#101;&#121;&#98;&#111;&#97;&#114;&#100;&#73;&#110;&#116;&#101;&#114;&#114;&#117;&#112;&#116;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#112;&#114;&#105;&#110;&#116;&#40;&#34;&#92;&#110;&#91;&#79;&#75;&#93;&#32;&#83;&#116;&#111;&#112;&#112;&#101;&#100;&#46;&#34;&#41;\n\n&#32;&#32;&#32;&#32;&#102;&#105;&#110;&#97;&#108;&#108;&#121;&#58;\n&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#32;&#115;&#101;&#114;&#46;&#99;&#108;&#111;&#115;&#101;&#40;&#41;\n\n\n&#105;&#102;&#32;&#95;&#95;&#110;&#97;&#109;&#101;&#95;&#95;&#32;&#61;&#61;&#32;&#34;&#95;&#95;&#109;&#97;&#105;&#110;&#95;&#95;&#34;&#58;\n&#32;&#32;&#32;&#32;&#109;&#97;&#105;&#110;&#40;&#41;\n<\/textarea>\n      <\/div>\n    <\/div>\n  <\/details>\n\n  <h2>11. Common Problems<\/h2>\n\n  <div class=\"ebox-faq-list\">\n    <details>\n      <summary>The display stays white<\/summary>\n      <div class=\"ebox-faq-content\">\n        <p>Check the display pin setup, display driver, power, backlight connection, and SPI pin assignment.<\/p>\n      <\/div>\n    <\/details>\n\n    <details>\n      <summary>The PC cannot connect to the ESP32<\/summary>\n      <div class=\"ebox-faq-content\">\n        <p>Close the Arduino Serial Monitor, check the COM port, and reconnect the ESP32 if the port changed.<\/p>\n      <\/div>\n    <\/details>\n\n    <details>\n      <summary>Temperatures or GPU values are missing<\/summary>\n      <div class=\"ebox-faq-content\">\n        <p>Make sure LibreHardwareMonitor is running and the required sensors are visible.<\/p>\n      <\/div>\n    <\/details>\n\n    <details>\n      <summary>CPU clock speed does not look correct<\/summary>\n      <div class=\"ebox-faq-content\">\n        <p>Some systems report nominal speed instead of live boost speed. Use the values from LibreHardwareMonitor when possible.<\/p>\n      <\/div>\n    <\/details>\n  <\/div>\n\n  <div class=\"ebox-final-box\">\n    <h2>12. Final Result<\/h2>\n    <p>\n      The final result is a compact DIY PC status monitor with a laser-cut enclosure, an ESP32, and an\n      external display. It shows live system values directly on the desk and is useful while gaming,\n      editing, rendering, or testing hardware.\n    <\/p>\n  <\/div>\n\n<\/div>\n\n<script>\n  function eboxCopyCode(id, button) {\n    const textarea = document.getElementById(id);\n    if (!textarea) return;\n\n    textarea.focus();\n    textarea.select();\n    textarea.setSelectionRange(0, 999999);\n\n    const oldText = button.textContent;\n\n    function showCopied() {\n      button.textContent = 'Copied!';\n      setTimeout(function () {\n        button.textContent = oldText;\n      }, 1400);\n    }\n\n    if (navigator.clipboard && window.isSecureContext) {\n      navigator.clipboard.writeText(textarea.value).then(showCopied).catch(function () {\n        document.execCommand('copy');\n        showCopied();\n      });\n    } else {\n      document.execCommand('copy');\n      showCopied();\n    }\n  }\n<\/script>\n","protected":false},"excerpt":{"rendered":"<p>ESP32 Project PC Status Monitor In this project, I build a DIY PC status monitor that displays live system values from a Windows PC on an external display using an ESP32. The monitor shows CPU usage, RAM usage, GPU usage, CPU temperature, GPU temperature, and live CPU clock speed. The data is collected on the [&hellip;]<\/p>\n","protected":false},"author":1,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-856262","page","type-page","status-publish","hentry"],"blocksy_meta":{"styles_descriptor":{"styles":{"desktop":"","tablet":"","mobile":""},"google_fonts":[],"version":7}},"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v28.1 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>PC Status Monitor - ElektroBox<\/title>\n<meta name=\"description\" content=\"DIY PC Status Monitor to display live CPU usage, CPU temperature, RAM usage, GPU usage, and GPU temperature.\" \/>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/elektrobox.ch\/index.php\/pc_status_monitor\/\" \/>\n<meta property=\"og:locale\" content=\"en_US\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"PC Status Monitor - ElektroBox\" \/>\n<meta property=\"og:description\" content=\"DIY PC Status Monitor to display live CPU usage, CPU temperature, RAM usage, GPU usage, and GPU temperature.\" \/>\n<meta property=\"og:url\" content=\"https:\/\/elektrobox.ch\/index.php\/pc_status_monitor\/\" \/>\n<meta property=\"og:site_name\" content=\"ElektroBox\" \/>\n<meta property=\"article:modified_time\" content=\"2026-07-03T06:31:42+00:00\" \/>\n<meta property=\"og:image\" content=\"https:\/\/elektrobox.ch\/wp-content\/uploads\/2026\/05\/IMG_2614-scaled.jpg\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:label1\" content=\"Est. reading time\" \/>\n\t<meta name=\"twitter:data1\" content=\"5 minutes\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/elektrobox.ch\\\/index.php\\\/pc_status_monitor\\\/\",\"url\":\"https:\\\/\\\/elektrobox.ch\\\/index.php\\\/pc_status_monitor\\\/\",\"name\":\"PC Status Monitor - ElektroBox\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/elektrobox.ch\\\/#website\"},\"primaryImageOfPage\":{\"@id\":\"https:\\\/\\\/elektrobox.ch\\\/index.php\\\/pc_status_monitor\\\/#primaryimage\"},\"image\":{\"@id\":\"https:\\\/\\\/elektrobox.ch\\\/index.php\\\/pc_status_monitor\\\/#primaryimage\"},\"thumbnailUrl\":\"https:\\\/\\\/elektrobox.ch\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/IMG_2614-scaled.jpg\",\"datePublished\":\"2026-05-29T18:34:42+00:00\",\"dateModified\":\"2026-07-03T06:31:42+00:00\",\"description\":\"DIY PC Status Monitor to display live CPU usage, CPU temperature, RAM usage, GPU usage, and GPU temperature.\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/elektrobox.ch\\\/index.php\\\/pc_status_monitor\\\/#breadcrumb\"},\"inLanguage\":\"en-US\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/elektrobox.ch\\\/index.php\\\/pc_status_monitor\\\/\"]}]},{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/elektrobox.ch\\\/index.php\\\/pc_status_monitor\\\/#primaryimage\",\"url\":\"https:\\\/\\\/elektrobox.ch\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/IMG_2614-scaled.jpg\",\"contentUrl\":\"https:\\\/\\\/elektrobox.ch\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/IMG_2614-scaled.jpg\",\"width\":2560,\"height\":1920},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/elektrobox.ch\\\/index.php\\\/pc_status_monitor\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Home\",\"item\":\"https:\\\/\\\/elektrobox.ch\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"PC Status Monitor\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/elektrobox.ch\\\/#website\",\"url\":\"https:\\\/\\\/elektrobox.ch\\\/\",\"name\":\"ElektroBox\",\"description\":\"\",\"publisher\":{\"@id\":\"https:\\\/\\\/elektrobox.ch\\\/#\\\/schema\\\/person\\\/878bd55e17d9d0b1a53523fa5e90f6b2\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/elektrobox.ch\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"en-US\"},{\"@type\":[\"Person\",\"Organization\"],\"@id\":\"https:\\\/\\\/elektrobox.ch\\\/#\\\/schema\\\/person\\\/878bd55e17d9d0b1a53523fa5e90f6b2\",\"name\":\"Jacob Jarosz\",\"image\":{\"@type\":\"ImageObject\",\"inLanguage\":\"en-US\",\"@id\":\"https:\\\/\\\/elektrobox.ch\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Logo_Color-Kopie-scaled.png\",\"url\":\"https:\\\/\\\/elektrobox.ch\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Logo_Color-Kopie-scaled.png\",\"contentUrl\":\"https:\\\/\\\/elektrobox.ch\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Logo_Color-Kopie-scaled.png\",\"width\":2560,\"height\":2560,\"caption\":\"Jacob Jarosz\"},\"logo\":{\"@id\":\"https:\\\/\\\/elektrobox.ch\\\/wp-content\\\/uploads\\\/2026\\\/05\\\/Logo_Color-Kopie-scaled.png\"},\"sameAs\":[\"http:\\\/\\\/elektrobox.ch\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"PC Status Monitor - ElektroBox","description":"DIY PC Status Monitor to display live CPU usage, CPU temperature, RAM usage, GPU usage, and GPU temperature.","robots":{"index":"index","follow":"follow","max-snippet":"max-snippet:-1","max-image-preview":"max-image-preview:large","max-video-preview":"max-video-preview:-1"},"canonical":"https:\/\/elektrobox.ch\/index.php\/pc_status_monitor\/","og_locale":"en_US","og_type":"article","og_title":"PC Status Monitor - ElektroBox","og_description":"DIY PC Status Monitor to display live CPU usage, CPU temperature, RAM usage, GPU usage, and GPU temperature.","og_url":"https:\/\/elektrobox.ch\/index.php\/pc_status_monitor\/","og_site_name":"ElektroBox","article_modified_time":"2026-07-03T06:31:42+00:00","og_image":[{"url":"https:\/\/elektrobox.ch\/wp-content\/uploads\/2026\/05\/IMG_2614-scaled.jpg","type":"","width":"","height":""}],"twitter_card":"summary_large_image","twitter_misc":{"Est. reading time":"5 minutes"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/elektrobox.ch\/index.php\/pc_status_monitor\/","url":"https:\/\/elektrobox.ch\/index.php\/pc_status_monitor\/","name":"PC Status Monitor - ElektroBox","isPartOf":{"@id":"https:\/\/elektrobox.ch\/#website"},"primaryImageOfPage":{"@id":"https:\/\/elektrobox.ch\/index.php\/pc_status_monitor\/#primaryimage"},"image":{"@id":"https:\/\/elektrobox.ch\/index.php\/pc_status_monitor\/#primaryimage"},"thumbnailUrl":"https:\/\/elektrobox.ch\/wp-content\/uploads\/2026\/05\/IMG_2614-scaled.jpg","datePublished":"2026-05-29T18:34:42+00:00","dateModified":"2026-07-03T06:31:42+00:00","description":"DIY PC Status Monitor to display live CPU usage, CPU temperature, RAM usage, GPU usage, and GPU temperature.","breadcrumb":{"@id":"https:\/\/elektrobox.ch\/index.php\/pc_status_monitor\/#breadcrumb"},"inLanguage":"en-US","potentialAction":[{"@type":"ReadAction","target":["https:\/\/elektrobox.ch\/index.php\/pc_status_monitor\/"]}]},{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/elektrobox.ch\/index.php\/pc_status_monitor\/#primaryimage","url":"https:\/\/elektrobox.ch\/wp-content\/uploads\/2026\/05\/IMG_2614-scaled.jpg","contentUrl":"https:\/\/elektrobox.ch\/wp-content\/uploads\/2026\/05\/IMG_2614-scaled.jpg","width":2560,"height":1920},{"@type":"BreadcrumbList","@id":"https:\/\/elektrobox.ch\/index.php\/pc_status_monitor\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Home","item":"https:\/\/elektrobox.ch\/"},{"@type":"ListItem","position":2,"name":"PC Status Monitor"}]},{"@type":"WebSite","@id":"https:\/\/elektrobox.ch\/#website","url":"https:\/\/elektrobox.ch\/","name":"ElektroBox","description":"","publisher":{"@id":"https:\/\/elektrobox.ch\/#\/schema\/person\/878bd55e17d9d0b1a53523fa5e90f6b2"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/elektrobox.ch\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"en-US"},{"@type":["Person","Organization"],"@id":"https:\/\/elektrobox.ch\/#\/schema\/person\/878bd55e17d9d0b1a53523fa5e90f6b2","name":"Jacob Jarosz","image":{"@type":"ImageObject","inLanguage":"en-US","@id":"https:\/\/elektrobox.ch\/wp-content\/uploads\/2026\/05\/Logo_Color-Kopie-scaled.png","url":"https:\/\/elektrobox.ch\/wp-content\/uploads\/2026\/05\/Logo_Color-Kopie-scaled.png","contentUrl":"https:\/\/elektrobox.ch\/wp-content\/uploads\/2026\/05\/Logo_Color-Kopie-scaled.png","width":2560,"height":2560,"caption":"Jacob Jarosz"},"logo":{"@id":"https:\/\/elektrobox.ch\/wp-content\/uploads\/2026\/05\/Logo_Color-Kopie-scaled.png"},"sameAs":["http:\/\/elektrobox.ch"]}]}},"_links":{"self":[{"href":"https:\/\/elektrobox.ch\/index.php\/wp-json\/wp\/v2\/pages\/856262","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/elektrobox.ch\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/elektrobox.ch\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/elektrobox.ch\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/elektrobox.ch\/index.php\/wp-json\/wp\/v2\/comments?post=856262"}],"version-history":[{"count":14,"href":"https:\/\/elektrobox.ch\/index.php\/wp-json\/wp\/v2\/pages\/856262\/revisions"}],"predecessor-version":[{"id":856456,"href":"https:\/\/elektrobox.ch\/index.php\/wp-json\/wp\/v2\/pages\/856262\/revisions\/856456"}],"wp:attachment":[{"href":"https:\/\/elektrobox.ch\/index.php\/wp-json\/wp\/v2\/media?parent=856262"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}