{"id":23033,"date":"2026-04-22T17:08:16","date_gmt":"2026-04-22T17:08:16","guid":{"rendered":"https:\/\/esi.uclm.es\/?page_id=23033"},"modified":"2026-04-24T15:29:18","modified_gmt":"2026-04-24T15:29:18","slug":"mapa-interactivo-de-aulas-y-laboratorios","status":"publish","type":"page","link":"https:\/\/esi.uclm.es\/index.php\/mapa-interactivo-de-aulas-y-laboratorios\/","title":{"rendered":"Mapa interactivo de aulas y laboratorios"},"content":{"rendered":"\n<!doctype html>\n<html lang=\"es\">\n<head>\n<meta charset=\"utf-8\">\n<title>Mapa Interactivo \u00b7 ESI UCLM<\/title>\n<meta name=\"viewport\" content=\"width=device-width, initial-scale=1\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.googleapis.com\">\n<link rel=\"preconnect\" href=\"https:\/\/fonts.gstatic.com\" crossorigin>\n<link href=\"https:\/\/fonts.googleapis.com\/css2?family=Inter:wght@400;500;600;700&#038;family=JetBrains+Mono:wght@400;500;600&#038;display=swap\" rel=\"stylesheet\">\n<\/head>\n<body>\n\n<!-- ================================================================== -->\n<!--  MAPA INTERACTIVO ESI \u00b7 Bloque pegable en WordPress                -->\n<!--  Sube los 4 planos a Medios y sustituye las 4 URLs de MAP_URLS.    -->\n<!-- ================================================================== -->\n<div id=\"esi-map-app\" class=\"esi-app\" aria-label=\"Mapa interactivo de la ESI\">\n\n<style>\n\/* ======= Scoped styles (prefix .esi-app) ======= *\/\n.esi-app, .esi-app *{box-sizing:border-box}\n.esi-app{\n  --esi-blue:#0057a8;\n  --esi-blue-2:#0073d1;\n  --esi-blue-3:#3b9be5;\n  --esi-blue-soft:#e8f2fb;\n  --esi-blue-softer:#f4f9fd;\n  --esi-border:#d6e2ed;\n  --esi-border-strong:#b6cbe0;\n  --esi-ink-0:#0c2340;\n  --esi-ink-1:#2a4a6b;\n  --esi-ink-2:#5a7591;\n  --esi-ink-3:#8aa3bc;\n  --esi-bg:#ffffff;\n  --esi-bg-2:#f8fbfe;\n  --esi-accent:#00a5ff;\n  --esi-shadow:0 1px 2px rgba(12,35,64,.06), 0 8px 28px rgba(12,35,64,.08);\n  --esi-glow:0 0 0 3px rgba(0,115,209,.18);\n  font-family:'Inter',system-ui,-apple-system,Segoe UI,Roboto,sans-serif;\n  color:var(--esi-ink-0);\n  background:var(--esi-bg);\n  border:1px solid var(--esi-border);\n  border-radius:14px;\n  overflow:visible;\n  box-shadow:var(--esi-shadow);\n  display:grid;\n  grid-template-columns: 340px 1fr;\n  grid-template-rows: auto 1fr auto;\n  min-height:640px;\n  max-width:100%;\n  position:relative;\n}\n\n\/* ======= Header ======= *\/\n.esi-app .esi-head{\n  grid-column:1 \/ -1;\n  display:flex;align-items:center;justify-content:space-between;gap:12px;\n  padding:14px 20px;\n  border-bottom:1px solid var(--esi-border);\n  background:linear-gradient(180deg, #fff, var(--esi-bg-2));\n}\n.esi-app .esi-brand{display:flex;align-items:center;gap:12px;min-width:0}\n.esi-app .esi-mark{\n  width:36px;height:36px;border-radius:8px;flex-shrink:0;\n  background:linear-gradient(135deg, var(--esi-blue), var(--esi-blue-3));\n  display:grid;place-items:center;color:#fff;\n  box-shadow:0 4px 12px rgba(0,87,168,.35);\n}\n.esi-app .esi-mark svg{width:20px;height:20px}\n.esi-app .esi-title{min-width:0}\n.esi-app .esi-title h2{\n  margin:0;font-size:15px;font-weight:600;color:var(--esi-ink-0);\n  letter-spacing:.01em;white-space:nowrap;overflow:hidden;text-overflow:ellipsis;\n}\n.esi-app .esi-title p{\n  margin:2px 0 0;font-size:11px;color:var(--esi-ink-2);\n  letter-spacing:.08em;text-transform:uppercase;\n}\n.esi-app .esi-count{\n  font-family:'JetBrains Mono',monospace;font-size:11px;color:var(--esi-blue);\n  padding:6px 12px;border:1px solid var(--esi-border);border-radius:999px;\n  background:var(--esi-blue-softer);letter-spacing:.04em;white-space:nowrap;\n}\n\n.esi-app .esi-menu-btn{\n  display:none;align-items:center;gap:6px;\n  border:1px solid var(--esi-border);background:#fff;border-radius:8px;\n  padding:8px 12px;font-size:12px;color:var(--esi-ink-1);cursor:pointer;\n  font-family:inherit;\n}\n.esi-app .esi-menu-btn svg{width:16px;height:16px}\n\n\/* ======= Sidebar ======= *\/\n.esi-app .esi-side{\n  grid-column:1;grid-row:2 \/ 4;\n  display:flex;flex-direction:column;\n  border-right:1px solid var(--esi-border);\n  background:var(--esi-bg);\n  min-height:0;\n}\n\n.esi-app .esi-search-wrap{padding:14px 16px 10px}\n.esi-app .esi-search{\n  position:relative;display:flex;align-items:center;\n  border:1px solid var(--esi-border-strong);background:#fff;\n  border-radius:10px;transition:.15s;\n}\n.esi-app .esi-search:focus-within{\n  border-color:var(--esi-blue-2);box-shadow:var(--esi-glow);\n}\n.esi-app .esi-search svg{width:16px;height:16px;margin:0 10px;color:var(--esi-ink-2);flex-shrink:0}\n.esi-app .esi-search input{\n  flex:1;border:0;background:transparent;outline:none;\n  padding:11px 12px 11px 0;font:inherit;font-size:14px;color:var(--esi-ink-0);\n}\n.esi-app .esi-search input::placeholder{color:var(--esi-ink-3)}\n.esi-app .esi-search-clear{\n  border:0;background:transparent;color:var(--esi-ink-3);cursor:pointer;\n  padding:6px 10px;font-size:16px;line-height:1;display:none;\n}\n.esi-app .esi-search-clear.show{display:block}\n\n.esi-app .esi-filters{\n  display:flex;flex-wrap:wrap;gap:6px;\n  padding:4px 16px 12px;\n  border-bottom:1px solid var(--esi-border);\n}\n.esi-app .esi-chip{\n  font:inherit;font-size:12px;font-weight:500;\n  padding:6px 12px;border:1px solid var(--esi-border);\n  color:var(--esi-ink-1);background:#fff;cursor:pointer;\n  border-radius:999px;transition:.15s;\n}\n.esi-app .esi-chip:hover{border-color:var(--esi-blue-3);color:var(--esi-blue)}\n.esi-app .esi-chip.on{\n  background:var(--esi-blue);border-color:var(--esi-blue);color:#fff;\n  box-shadow:0 2px 6px rgba(0,87,168,.25);\n}\n\n.esi-app .esi-list{\n  flex:1;overflow-y:auto;min-height:0;\n  padding:4px 0 12px;\n}\n.esi-app .esi-list::-webkit-scrollbar{width:8px}\n.esi-app .esi-list::-webkit-scrollbar-thumb{background:#cfdce9;border-radius:4px}\n.esi-app .esi-list::-webkit-scrollbar-thumb:hover{background:var(--esi-blue-3)}\n\n.esi-app .esi-group{\n  padding:14px 16px 6px;\n  font-size:10px;font-weight:600;letter-spacing:.14em;\n  color:var(--esi-ink-2);text-transform:uppercase;\n  display:flex;align-items:center;gap:10px;\n}\n.esi-app .esi-group::after{\n  content:\"\";flex:1;height:1px;background:var(--esi-border);\n}\n\n.esi-app .esi-room{\n  display:grid;grid-template-columns:32px 1fr auto;gap:12px;align-items:center;\n  padding:9px 16px;cursor:pointer;\n  border-left:3px solid transparent;\n  transition:background .12s, border-color .12s;\n}\n.esi-app .esi-room:hover{background:var(--esi-blue-softer)}\n.esi-app .esi-room.active{\n  background:var(--esi-blue-soft);\n  border-left-color:var(--esi-blue);\n}\n.esi-app .esi-room-ico{\n  width:32px;height:32px;border-radius:8px;flex-shrink:0;\n  display:grid;place-items:center;\n  font-family:'JetBrains Mono',monospace;font-size:10px;font-weight:600;\n  background:var(--esi-blue-softer);color:var(--esi-blue);\n  border:1px solid var(--esi-border);\n}\n.esi-app .esi-room.active .esi-room-ico{\n  background:var(--esi-blue);color:#fff;border-color:var(--esi-blue);\n  box-shadow:0 2px 8px rgba(0,87,168,.3);\n}\n.esi-app .esi-room-meta{min-width:0}\n.esi-app .esi-room-code{\n  font-size:13px;font-weight:600;color:var(--esi-ink-0);\n  display:flex;align-items:baseline;gap:6px;min-width:0;\n}\n.esi-app .esi-room-code-text{\n  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;\n}\n.esi-app .esi-room-name{\n  font-size:11px;color:var(--esi-ink-2);margin-top:1px;\n  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;\n}\n.esi-app .esi-room-location{\n  font-size:10px;color:var(--esi-ink-2);margin-top:2px;\n  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;\n}\n.esi-app .esi-room-floor{\n  font-family:'JetBrains Mono',monospace;font-size:10px;\n  color:var(--esi-ink-2);padding:2px 8px;background:var(--esi-bg-2);\n  border:1px solid var(--esi-border);border-radius:4px;\n}\n.esi-app .esi-occup-link{\n  font-size:11px;font-weight:500;\n  color:var(--esi-blue);text-decoration:none;\n  white-space:nowrap;flex-shrink:0;\n  opacity:.75;transition:opacity .15s, color .15s;\n}\n.esi-app .esi-occup-link:hover{opacity:1;text-decoration:underline;color:var(--esi-blue-2)}\n.esi-app .esi-room.active .esi-occup-link{color:var(--esi-blue);opacity:1}\n\n.esi-app .esi-empty{padding:40px 16px;text-align:center;color:var(--esi-ink-3);font-size:12px}\n\n\/* ===== Sensor pills (lista) ===== *\/\n.esi-app .esi-pills{display:flex;gap:5px;margin-top:5px;flex-wrap:wrap}\n.esi-app .esi-pill{\n  display:inline-flex;align-items:center;gap:4px;\n  font-family:'JetBrains Mono',monospace;font-size:11px;font-weight:600;\n  padding:2px 7px 2px 5px;border-radius:10px;line-height:1.4;\n  background:var(--esi-blue-softer);color:var(--esi-blue);\n  border:1px solid var(--esi-border);\n}\n.esi-app .esi-pill svg{width:12px;height:12px;flex-shrink:0}\n.esi-app .esi-pill.p-t{background:#fff3e8;color:#b85c00;border-color:#f2d7bf}\n.esi-app .esi-pill.p-h{background:#e6f4ff;color:#0066aa;border-color:#bfdcef}\n.esi-app .esi-pill.p-c{background:#eef1f5;color:#3a4a5c;border-color:#d8dee6}\n.esi-app .esi-pill.p-c.ok{background:#e7f7ec;color:#1a7a3a;border-color:#bfe3cb}\n.esi-app .esi-pill.p-c.warn{background:#fff6d9;color:#8a6500;border-color:#ecdc9b}\n.esi-app .esi-pill.p-c.bad{background:#fde3e3;color:#a82222;border-color:#f0b9b9}\n\n\/* ===== Sensores en panel info ===== *\/\n.esi-app .esi-sensors-head{\n  margin-top:10px;padding-top:10px;border-top:1px dashed var(--esi-border);\n  display:flex;justify-content:space-between;align-items:center;\n  font-size:11px;font-weight:600;color:var(--esi-ink-1);letter-spacing:.04em;\n}\n.esi-app .esi-live{\n  display:inline-flex;align-items:center;gap:6px;\n  font-family:'JetBrains Mono',monospace;font-size:10px;font-weight:400;\n  color:var(--esi-ink-2);letter-spacing:.02em;\n}\n.esi-app .esi-live .dot{\n  width:6px;height:6px;border-radius:50%;background:#22a36a;\n  box-shadow:0 0 0 0 rgba(34,163,106,.5);\n  animation:esi-livedot 1.6s ease-out infinite;\n}\n@keyframes esi-livedot{\n  0%{box-shadow:0 0 0 0 rgba(34,163,106,.55)}\n  70%{box-shadow:0 0 0 6px rgba(34,163,106,0)}\n  100%{box-shadow:0 0 0 0 rgba(34,163,106,0)}\n}\n.esi-app .esi-sensors{\n  display:grid;grid-template-columns:repeat(auto-fit,minmax(78px,1fr));\n  gap:6px;margin-top:8px;\n}\n.esi-app .esi-sc{\n  display:flex;flex-direction:column;align-items:flex-start;gap:2px;\n  padding:8px 10px;border-radius:8px;\n  background:var(--esi-blue-softer);\n  border:1px solid var(--esi-border);\n}\n.esi-app .esi-sc .sc-ic{display:inline-flex;align-items:center;line-height:1;color:var(--esi-ink-2)}\n.esi-app .esi-sc .sc-ic svg{width:14px;height:14px}\n.esi-app .esi-sc.sc-t{background:#fff3e8;border-color:#f2d7bf}\n.esi-app .esi-sc.sc-t .sc-ic{color:#b85c00}\n.esi-app .esi-sc.sc-h{background:#e6f4ff;border-color:#bfdcef}\n.esi-app .esi-sc.sc-h .sc-ic{color:#0066aa}\n.esi-app .esi-sc .sc-v{font-size:13px;font-weight:600;color:var(--esi-ink-0);line-height:1.2}\n.esi-app .esi-sc .sc-v small{font-size:9px;font-weight:500;color:var(--esi-ink-2)}\n.esi-app .esi-sc .sc-l{font-size:9px;color:var(--esi-ink-2);text-transform:uppercase;letter-spacing:.06em}\n.esi-app .esi-sc.ok{background:#e7f7ec;border-color:#bfe3cb}\n.esi-app .esi-sc.warn{background:#fff6d9;border-color:#ecdc9b}\n.esi-app .esi-sc.bad{background:#fde3e3;border-color:#f0b9b9}\n\n\/* ======= Main ======= *\/\n\/* ======= Main ======= *\/\n.esi-app .esi-main{\n  grid-column:2;grid-row:2 \/ 4;\n  display:flex;flex-direction:column;min-height:0;min-width:0;\n  background:var(--esi-bg-2);\n  position:sticky;top:12px;align-self:start;\n  height:calc(100vh - 24px);\n  max-height:calc(100vh - 24px);\n  overflow:hidden;\n}\n.esi-app.esi-follow-scroll .esi-main{\n  position:relative;top:auto;z-index:10;\n  will-change:transform;\n}\n.esi-app .esi-maphead{\n  padding:12px 18px;display:flex;align-items:center;justify-content:space-between;gap:12px;\n  border-bottom:1px solid var(--esi-border);background:#fff;\n  flex-wrap:wrap;\n}\n.esi-app .esi-maptitle{\n  font-size:12px;color:var(--esi-ink-2);letter-spacing:.02em;\n  white-space:nowrap;overflow:hidden;text-overflow:ellipsis;min-width:0;\n}\n.esi-app .esi-maptitle strong{color:var(--esi-ink-0);font-weight:600}\n\n.esi-app .esi-tabs{\n  display:flex;gap:2px;background:var(--esi-bg-2);\n  border:1px solid var(--esi-border);border-radius:8px;padding:3px;\n  flex-wrap:wrap;\n}\n.esi-app .esi-tab{\n  font:inherit;font-size:11px;font-weight:500;\n  padding:6px 10px;background:transparent;color:var(--esi-ink-1);border:0;cursor:pointer;\n  border-radius:6px;transition:.12s;white-space:nowrap;\n}\n.esi-app .esi-tab:hover{color:var(--esi-blue)}\n.esi-app .esi-tab.on{background:var(--esi-blue);color:#fff;box-shadow:0 1px 3px rgba(0,87,168,.3)}\n\n.esi-app .esi-stage{\n  flex:1 1 auto;position:relative;overflow:hidden;\n  display:flex;justify-content:center;align-items:center;\n  padding:16px;\n  min-height:0;\n}\n\n.esi-app .esi-frame{\n  position:relative;\n  max-width:100%;max-height:100%;\n  aspect-ratio: var(--ratio, 1536\/1073);\n  width:auto;height:100%;\n  border:1px solid var(--esi-border);\n  background:#fff;\n  border-radius:10px;\n  overflow:hidden;\n  box-shadow:0 1px 3px rgba(12,35,64,.05), 0 10px 30px rgba(12,35,64,.06);\n}\n.esi-app .esi-inner{position:absolute;inset:0;overflow:hidden}\n\n.esi-app .esi-img{\n  position:absolute;inset:0;width:100%;height:100%;object-fit:contain;\n  transition:opacity .3s;\n}\n\n.esi-app .esi-idle{\n  position:absolute;inset:0;display:grid;place-items:center;text-align:center;\n  pointer-events:none;color:var(--esi-ink-2);padding:24px;\n}\n.esi-app .esi-idle-ico{\n  width:84px;height:84px;border-radius:50%;margin:0 auto 14px;\n  background:var(--esi-blue-soft);color:var(--esi-blue);\n  display:grid;place-items:center;position:relative;\n}\n.esi-app .esi-idle-ico::before{\n  content:\"\";position:absolute;inset:-8px;border:2px solid var(--esi-blue-3);\n  border-radius:50%;opacity:.4;animation:esi-ring 2.4s ease-out infinite;\n}\n@keyframes esi-ring{0%{transform:scale(.85);opacity:.5}100%{transform:scale(1.25);opacity:0}}\n.esi-app .esi-idle-ico svg{width:32px;height:32px}\n.esi-app .esi-idle h3{margin:0 0 4px;font-size:16px;font-weight:600;color:var(--esi-ink-0)}\n.esi-app .esi-idle p{margin:0;font-size:12px;color:var(--esi-ink-2)}\n\n\/* ======= Marker ======= *\/\n.esi-app .esi-marker{\n  position:absolute;transform:translate(-50%,-50%);pointer-events:none;z-index:5;\n  width:0;height:0;\n}\n.esi-app .esi-marker .pulse{\n  position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);\n  width:20px;height:20px;border-radius:50%;\n  border:2px solid var(--esi-blue-2);opacity:0;\n  animation:esi-pulse 1.8s ease-out infinite;\n}\n.esi-app .esi-marker .pulse.d2{animation-delay:.6s}\n.esi-app .esi-marker .pulse.d3{animation-delay:1.2s}\n@keyframes esi-pulse{\n  0%{opacity:.8;width:20px;height:20px;border-width:2px}\n  100%{opacity:0;width:100px;height:100px;border-width:1px}\n}\n.esi-app .esi-marker .core{\n  position:absolute;left:50%;top:50%;transform:translate(-50%,-50%);\n  width:16px;height:16px;border-radius:50%;\n  background:radial-gradient(circle, #fff 0%, var(--esi-blue-2) 50%, var(--esi-blue) 100%);\n  border:2px solid #fff;\n  box-shadow:0 0 0 2px var(--esi-blue-2), 0 2px 10px rgba(0,87,168,.45), 0 0 20px rgba(0,115,209,.6);\n  animation:esi-core 1.2s ease-in-out infinite;\n}\n@keyframes esi-core{\n  0%,100%{transform:translate(-50%,-50%) scale(1)}\n  50%{transform:translate(-50%,-50%) scale(1.18)}\n}\n.esi-app .esi-marker .label{\n  position:absolute;left:22px;top:-38px;\n  padding:7px 12px;\n  font-size:12px;font-weight:500;\n  color:#fff;background:var(--esi-blue);\n  white-space:nowrap;border-radius:6px;\n  box-shadow:0 4px 14px rgba(0,87,168,.35);\n}\n.esi-app .esi-marker .label::before{\n  content:\"\";position:absolute;left:-6px;bottom:8px;\n  border:5px solid transparent;border-right-color:var(--esi-blue);\n}\n.esi-app .esi-marker .label strong{display:block;font-weight:600}\n.esi-app .esi-marker .label span{display:block;font-size:10px;opacity:.85;font-weight:400;margin-top:1px}\n\/* when there isn't room to the right, flip label *\/\n.esi-app .esi-marker.flip-x .label{left:auto;right:22px}\n.esi-app .esi-marker.flip-x .label::before{left:auto;right:-6px;border-right-color:transparent;border-left-color:var(--esi-blue)}\n.esi-app .esi-marker.flip-y .label{top:auto;bottom:-38px}\n\n\/* ======= Info panel (debajo del mapa, no encima) ======= *\/\n.esi-app .esi-info{\n  margin:12px;\n  padding:12px 14px;background:#fff;\n  border:1px solid var(--esi-border);border-radius:10px;\n  box-shadow:0 1px 3px rgba(12,35,64,.05);\n  font-size:12px;color:var(--esi-ink-1);\n  display:none;\n}\n.esi-app .esi-info.show{display:block;animation:esi-fade .25s ease}\n@keyframes esi-fade{from{opacity:0;transform:translateY(4px)}to{opacity:1;transform:translateY(0)}}\n.esi-app .esi-info .sub{\n  font-size:10px;letter-spacing:.14em;text-transform:uppercase;\n  color:var(--esi-blue);font-weight:600;margin-bottom:4px;\n}\n.esi-app .esi-info h4{\n  margin:0 0 8px;font-size:15px;font-weight:600;color:var(--esi-ink-0);\n}\n.esi-app .esi-info .row{display:flex;justify-content:space-between;gap:16px;padding:3px 0;flex-wrap:wrap}\n.esi-app .esi-info .k{color:var(--esi-ink-2);font-size:11px}\n.esi-app .esi-info .v{color:var(--esi-ink-0);font-weight:500;text-align:right}\n\n\/* ======= Footer ======= *\/\n.esi-app .esi-foot{\n  grid-column:1 \/ -1;\n  padding:10px 18px;border-top:1px solid var(--esi-border);\n  background:var(--esi-bg);\n  display:flex;justify-content:space-between;align-items:center;gap:10px;\n  font-size:11px;color:var(--esi-ink-2);\n}\n.esi-app .esi-foot a{color:var(--esi-blue);text-decoration:none}\n.esi-app .esi-foot a:hover{text-decoration:underline}\n\n\/* ======= Responsive ======= *\/\n@media (max-width: 820px){\n  .esi-app{\n    grid-template-columns:1fr;\n    grid-template-rows:auto auto auto auto;\n    min-height:unset;\n    width:100vw;\n    max-width:100vw;\n    margin-left:calc(50% - 50vw);\n    margin-right:calc(50% - 50vw);\n    border-left:0;border-right:0;border-radius:0;\n    overflow:hidden;\n  }\n  .esi-app .esi-main,\n  .esi-app.esi-follow-scroll .esi-main{\n    position:static;max-height:none;overflow:visible;\n    transform:none!important;will-change:auto;\n  }\n  .esi-app .esi-menu-btn{display:inline-flex}\n  .esi-app .esi-side{\n    grid-column:1;grid-row:2;\n    border-right:0;border-bottom:1px solid var(--esi-border);\n    max-height:60vh;\n    transition:max-height .3s ease;\n    overflow:hidden;\n  }\n  .esi-app .esi-side.collapsed{max-height:0;border-bottom-width:0}\n  .esi-app .esi-main{grid-column:1;grid-row:3;background:#fff}\n  .esi-app .esi-stage{\n    padding:10px;\n    min-height:0;\n    display:block;\n  }\n  \/* Frame sizes itself to the image on mobile: full width, height = width\/ratio *\/\n  .esi-app .esi-frame{\n    width:100%;\n    height:auto;\n    aspect-ratio: var(--ratio, 1536 \/ 1073);\n    max-height:none;\n  }\n  .esi-app .esi-maphead{padding:10px 12px;gap:8px;flex-direction:column;align-items:stretch}\n  .esi-app .esi-maptitle{white-space:normal;text-align:left}\n  .esi-app .esi-tabs{width:100%;overflow-x:auto;flex-wrap:nowrap;-webkit-overflow-scrolling:touch}\n  .esi-app .esi-tab{flex:1 0 auto}\n  .esi-app .esi-head{padding:12px 14px;flex-wrap:wrap;gap:10px}\n  .esi-app .esi-title h2{font-size:14px;white-space:normal;line-height:1.25}\n  .esi-app .esi-count{display:none}\n  .esi-app .esi-info{\n    margin:10px 0 0;\n  }\n  .esi-app .esi-info:not(.show){display:none}\n  .esi-app .esi-marker .label{font-size:11px;padding:5px 9px}\n  .esi-app .esi-foot{grid-row:4}\n}\n@media (max-width: 480px){\n  .esi-app{border-radius:0}\n  .esi-app .esi-room{padding:10px 12px}\n  .esi-app .esi-search-wrap,\n  .esi-app .esi-filters{padding-left:12px;padding-right:12px}\n  .esi-app .esi-stage{padding:8px}\n  .esi-app .esi-foot{padding:10px 12px;font-size:10px;flex-direction:column;align-items:flex-start;gap:4px}\n  .esi-app .esi-title p{display:none}\n  .esi-app .esi-marker .label{font-size:10px;padding:4px 7px}\n  .esi-app .esi-marker .label span{font-size:9px}\n}\n<\/style>\n\n  <!-- Header -->\n  <div class=\"esi-head\">\n    <div class=\"esi-brand\">\n      <div class=\"esi-mark\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linejoin=\"round\" stroke-linecap=\"round\">\n          <path d=\"M12 2 L22 7 L12 12 L2 7 Z\"\/>\n          <path d=\"M2 12 L12 17 L22 12\"\/>\n          <path d=\"M2 17 L12 22 L22 17\"\/>\n        <\/svg>\n      <\/div>\n      <div class=\"esi-title\">\n        <h2>Mapa interactivo de aulas y laboratorios<\/h2>\n        <p>Escuela Superior de Inform\u00e1tica \u00b7 UCLM<\/p>\n      <\/div>\n    <\/div>\n    <div style=\"display:flex;gap:8px;align-items:center\">\n      <span class=\"esi-count\" id=\"esi-count\">\u2014<\/span>\n      <button class=\"esi-menu-btn\" id=\"esi-menu-btn\" aria-controls=\"esi-side\" aria-expanded=\"true\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><path d=\"M3 6h18M3 12h18M3 18h18\"\/><\/svg>\n        <span id=\"esi-menu-label\">Ocultar lista de aulas<\/span>\n      <\/button>\n    <\/div>\n  <\/div>\n\n  <!-- Sidebar -->\n  <div class=\"esi-side\" id=\"esi-side\">\n    <div class=\"esi-search-wrap\">\n      <label class=\"esi-search\">\n        <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\"><circle cx=\"11\" cy=\"11\" r=\"7\"\/><path d=\"m21 21-4.3-4.3\"\/><\/svg>\n        <input id=\"esi-q\" type=\"text\" placeholder=\"Buscar aula, laboratorio o nombre\u2026\" autocomplete=\"off\" spellcheck=\"false\" aria-label=\"Buscar\">\n        <button class=\"esi-search-clear\" id=\"esi-q-clear\" type=\"button\" aria-label=\"Limpiar\">\u00d7<\/button>\n      <\/label>\n    <\/div>\n    <div class=\"esi-filters\" id=\"esi-filters\"><\/div>\n    <div class=\"esi-list\" id=\"esi-list\" role=\"list\"><\/div>\n  <\/div>\n\n  <!-- Main -->\n  <div class=\"esi-main\">\n    <div class=\"esi-maphead\">\n      <div class=\"esi-maptitle\" id=\"esi-maptitle\">Selecciona un aula o laboratorio<\/div>\n      <div class=\"esi-tabs\" id=\"esi-tabs\" role=\"tablist\"><\/div>\n    <\/div>\n    <div class=\"esi-stage\">\n      <div class=\"esi-frame\" id=\"esi-frame\" style=\"--ratio: 1536\/1073\">\n        <div class=\"esi-inner\" id=\"esi-inner\">\n          <div class=\"esi-idle\" id=\"esi-idle\">\n            <div>\n              <div class=\"esi-idle-ico\">\n                <svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"1.8\" stroke-linecap=\"round\" stroke-linejoin=\"round\">\n                  <path d=\"M12 21s-7-6.5-7-12a7 7 0 1 1 14 0c0 5.5-7 12-7 12Z\"\/>\n                  <circle cx=\"12\" cy=\"9\" r=\"2.5\"\/>\n                <\/svg>\n              <\/div>\n              <h3>Elige un aula o laboratorio<\/h3>\n              <p>Se mostrar\u00e1 la planta y se marcar\u00e1 su ubicaci\u00f3n.<\/p>\n            <\/div>\n          <\/div>\n          <img class=\"esi-img\" id=\"esi-img\" alt=\"\" style=\"display:none\">\n          <div id=\"esi-marker-layer\"><\/div>\n        <\/div>\n      <\/div>\n      <div class=\"esi-info\" id=\"esi-info\"><\/div>\n    <\/div>\n  <\/div>\n\n  <!-- Footer -->\n  <div class=\"esi-foot\">\n    <span>Escuela Superior de Inform\u00e1tica \u00b7 Universidad de Castilla-La Mancha<\/span>\n    <a href=\"https:\/\/esi.uclm.es\/index.php\/infraestructuras\/infraestructura\/\" target=\"_blank\" rel=\"noopener\">Ver infraestructuras \u2197<\/a>\n  <\/div>\n\n<\/div><!-- \/#esi-map-app -->\n\n<script>\n(function(){\n  var esiScheduleFollow = function(){};\n\n  \/* Rehabilita sticky\/seguimiento del .esi-main subiendo ancestros con overflow clipping *\/\n  function esiUnclipAncestors(){\n    try{\n      var el = document.querySelector('.esi-app');\n      if(!el) return;\n      var p = el.parentElement;\n      while(p && p !== document.body && p !== document.documentElement){\n        var cs = getComputedStyle(p);\n        if(\/hidden|clip|auto|scroll|overlay\/.test(cs.overflow + cs.overflowX + cs.overflowY)){\n          p.style.setProperty('overflow', 'visible', 'important');\n        }\n        p = p.parentElement;\n      }\n    }catch(e){}\n  }\n  if(document.readyState === 'loading'){\n    document.addEventListener('DOMContentLoaded', esiUnclipAncestors);\n  } else { esiUnclipAncestors(); }\n\n  function esiBindScrollFollower(){\n    try{\n      var app = document.querySelector('.esi-app');\n      var main = app && app.querySelector('.esi-main');\n      if(!app || !main) return;\n\n      var mq = window.matchMedia('(min-width: 821px)');\n      var topGap = 12;\n      var ticking = false;\n\n      function docTop(el){\n        var r = el.getBoundingClientRect();\n        return window.pageYOffset + r.top;\n      }\n\n      function documentBottom(){\n        return Math.max(\n          document.body.scrollHeight,\n          document.documentElement.scrollHeight,\n          document.body.offsetHeight,\n          document.documentElement.offsetHeight\n        );\n      }\n\n      function limitBottom(){\n        var limit = app.closest('article, main, .entry-content, .page-content, .wp-block-post-content, .site-main, .content-area') || app.parentElement;\n        if(!limit || limit === document.body || limit === document.documentElement) return documentBottom();\n        var r = limit.getBoundingClientRect();\n        return window.pageYOffset + r.top + Math.max(limit.scrollHeight, r.height);\n      }\n\n      function resetFollow(){\n        app.classList.remove('esi-follow-scroll');\n        main.style.transform = '';\n      }\n\n      function updateFollow(){\n        ticking = false;\n        if(!mq.matches){\n          resetFollow();\n          return;\n        }\n\n        app.classList.add('esi-follow-scroll');\n        var appTop = docTop(app);\n        var ownBottom = appTop + app.offsetHeight;\n        var bottom = Math.max(ownBottom, limitBottom());\n        if(bottom <= ownBottom + 1) bottom = documentBottom();\n        var maxOffset = Math.max(0, bottom - appTop - main.offsetHeight - topGap);\n        var desired = window.pageYOffset + topGap - appTop;\n        var y = Math.max(0, Math.min(desired, maxOffset));\n        main.style.transform = y > 0.5 ? 'translate3d(0,' + Math.round(y) + 'px,0)' : '';\n      }\n\n      function requestFollow(){\n        if(ticking) return;\n        ticking = true;\n        requestAnimationFrame(updateFollow);\n      }\n\n      esiScheduleFollow = requestFollow;\n      window.addEventListener('scroll', requestFollow, {passive:true});\n      window.addEventListener('resize', requestFollow);\n      window.addEventListener('load', requestFollow);\n      if(window.ResizeObserver){\n        app._esiFollowResizeObserver = new ResizeObserver(requestFollow);\n        var ro = app._esiFollowResizeObserver;\n        ro.observe(app);\n        ro.observe(main);\n      }\n      requestFollow();\n    }catch(e){}\n  }\n  esiBindScrollFollower();\n\n  \/* ============================================================== *\/\n  \/*  URLs de los planos \u2014 SUSTITUIR tras subir a Medios de WordPress *\/\n  \/* ============================================================== *\/\n  var MAP_URLS = {\n    esi_baja:         'https:\/\/esi.uclm.es\/mapas\/esi_baja.png',\n    esi_primera:      'https:\/\/esi.uclm.es\/mapas\/esi_primera.png',\n    esi_segunda:      'https:\/\/esi.uclm.es\/mapas\/esi_segunda.png',\n    politecnico_baja: 'https:\/\/esi.uclm.es\/mapas\/politecnico_baja.png',\n  };\n\n  \/* ============================================================== *\/\n  \/*  Sensores (Smart ESI) \u2014 se leen siempre desde federico.esi      *\/\n  \/* ============================================================== *\/\n  var SENSORS_JSON_URL = 'https:\/\/federico.esi.uclm.es\/www\/jalbusac\/smartesi\/sensores.json';\n  var SENSORS_REFRESH_MS = 60000; \/\/ 60s\n  \/\/ Mapea entity_id -> aula (coincide con ROOM.code sin prefijo 'Aula ' \/ 'Lab. ')\n  var ENTITY_TO_AULA = {\n    'sensor.temperatura_shelly1':'F0.1',  'sensor.humedad_shelly1':'F0.1',\n    'sensor.temperatura_shelly4':'F0.2',  'sensor.humedad_shelly4':'F0.2',\n    'sensor.temperatura_shelly5':'F1.1',  'sensor.humedad_shelly5':'F1.1',\n    'air_quality.co2_3':'A1.1',\n    'air_quality.co2_1':'A1.2',\n    'air_quality.co2_2':'A2.1',\n    'air_quality.co2_4':'A2.2',\n    'sensor.temperatura_shelly14':'LD1',  'sensor.humedad_shelly14':'LD1',\n    'sensor.temperatura_shelly13':'LD2',  'sensor.humedad_shelly13':'LD2',\n    'sensor.temperatura_shelly2':'LD3',   'sensor.humedad_shelly2':'LD3',\n    'sensor.temperatura_shelly3':'LD4',   'sensor.humedad_shelly3':'LD4'\n  };\n\n  \/* Datos de las zonas \u2014 coordenadas en % sobre cada imagen (0..100) *\/\n  var ROOMS = [\n    \/\/ POLIT\u00c9CNICO \u00b7 Planta Baja\n    { id:'p-0-07', code:'Aula 0.07',    name:'Claude Shannon',   type:'aula', building:'politecnico', floor:0, map:'politecnico_baja', x:37.5, y:48 },\n    { id:'p-0-05', code:'Aula 0.05+6',  name:'Edsger W. Dijkstra', type:'aula', building:'politecnico', floor:0, map:'politecnico_baja', x:44.5, y:57 },\n    { id:'p-0-02', code:'Aula 0.02+3',  name:'Charles Babbage',  type:'aula', building:'politecnico', floor:0, map:'politecnico_baja', x:38.5, y:63 },\n    { id:'p-0-04', code:'Aula 0.04',    name:'Hedy Lamarr',      type:'aula', building:'politecnico', floor:0, map:'politecnico_baja', x:49,   y:66 },\n\n    \/\/ FERM\u00cdN CABALLERO \u00b7 Planta Baja\n    { id:'fc-0-f01',    code:'Aula F0.1',       name:'Marvin Minsky', type:'aula', building:'fermin', floor:0, map:'esi_baja', x:82,   y:27 },\n    { id:'fc-0-f02',    code:'Aula F0.2',       name:'Steve Jobs',    type:'aula', building:'fermin', floor:0, map:'esi_baja', x:39,   y:72 },\n    { id:'fc-0-grados', code:'Sal\u00f3n de Grados', name:'Ada Lovelace',  type:'sala', building:'fermin', floor:0, map:'esi_baja', x:46,   y:34 },\n    { id:'fc-0-actos',  code:'Sal\u00f3n de Actos',  name:'Alan Turing',   type:'sala', building:'fermin', floor:0, map:'esi_baja', x:47,   y:58 },\n    { id:'fc-0-anita',  code:'Sala Anita Borg', name:'Sala de reuniones', type:'sala', building:'fermin', floor:0, map:'esi_baja', x:89.5, y:48 },\n\n    \/\/ FERM\u00cdN CABALLERO \u00b7 1\u00aa Planta\n    { id:'fc-1-f11', code:'Aula F1.1', name:'\u00c1ngela Ruiz Robles', type:'aula',        building:'fermin', floor:1, map:'esi_primera', x:45, y:32 },\n    { id:'fc-1-a11', code:'Aula A1.1', name:'John von Neumann',   type:'aula',        building:'fermin', floor:1, module:'B', map:'esi_primera', x:11, y:67 },\n    { id:'fc-1-a12', code:'Aula A1.2', name:'Tim Berners-Lee',    type:'aula',        building:'fermin', floor:1, module:'B', map:'esi_primera', x:9,  y:42 },\n    { id:'fc-1-ld1', code:'Lab. LD1',  name:'Ignacio Cirac',      type:'laboratorio', building:'fermin', floor:1, map:'esi_primera', x:37, y:44 },\n    { id:'fc-1-ld2', code:'Lab. LD2',  name:'Dennis Ritchie',     type:'laboratorio', building:'fermin', floor:1, map:'esi_primera', x:75, y:31 },\n    { id:'fc-1-ld3', code:'Lab. LD3',  name:'Bill Gates',         type:'laboratorio', building:'fermin', floor:1, map:'esi_primera', x:82, y:47 },\n\n    \/\/ FERM\u00cdN CABALLERO \u00b7 2\u00aa Planta\n    { id:'fc-2-ld4', code:'Lab. LD4',  name:'John Carmack',       type:'laboratorio', building:'fermin', floor:2, map:'esi_segunda', x:48, y:36 },\n    { id:'fc-2-a21', code:'Aula A2.1', name:'George Boole',       type:'aula',        building:'fermin', floor:2, module:'B', map:'esi_segunda', x:10, y:65 },\n    { id:'fc-2-a22', code:'Aula A2.2', name:'Grace Murray Hopper', type:'aula',       building:'fermin', floor:2, module:'B', map:'esi_segunda', x:12, y:41 },\n  ];\n\n  var MAPS = {\n    politecnico_baja: { label:'Edificio Polit\u00e9cnico \u00b7 Planta Baja',   short:'Polit\u00e9cnico \u00b7 P0', w:1536, h:1478 },\n    esi_baja:         { label:'Edif. Ferm\u00edn Caballero \u00b7 Planta Baja', short:'F. Caballero \u00b7 P0', w:1536, h:1073 },\n    esi_primera:      { label:'Edif. Ferm\u00edn Caballero \u00b7 1\u00aa Planta',   short:'F. Caballero \u00b7 P1', w:1536, h:1073 },\n    esi_segunda:      { label:'Edif. Ferm\u00edn Caballero \u00b7 2\u00aa Planta',   short:'F. Caballero \u00b7 P2', w:1536, h:1073 },\n  };\n\n  var BUILDINGS = { politecnico:'Edificio Polit\u00e9cnico', fermin:'Edif. Ferm\u00edn Caballero' };\n  var FLOORS = { 0:'Planta Baja', 1:'1\u00aa Planta', 2:'2\u00aa Planta' };\n  var TYPES = { aula:'Aula', laboratorio:'Laboratorio', sala:'Sala' };\n  var CATEGORIES = [\n    { id:'all',         label:'Todo' },\n    { id:'aula',        label:'Aulas' },\n    { id:'laboratorio', label:'Laboratorios' },\n    { id:'sala',        label:'Salas' },\n  ];\n  var TAB_ORDER = ['esi_baja','esi_primera','esi_segunda','politecnico_baja'];\n\n  var root = document.getElementById('esi-map-app');\n  var $ = function(s){ return root.querySelector(s); };\n  var $$ = function(s){ return Array.prototype.slice.call(root.querySelectorAll(s)); };\n\n  var state = { query:'', filter:'all', selectedId:null, mapKey:null, sensorsByAula:{}, sensorsUpdatedAt:null };\n\n  \/\/ Clave \"aula\" extraida del ROOM.code: 'Aula F0.1' -> 'F0.1', 'Lab. LD1' -> 'LD1'\n  function aulaKey(room){\n    var c = room.code || '';\n    return c.replace(\/^Aula\\s+\/i,'').replace(\/^Lab\\.?\\s+\/i,'').trim();\n  }\n\n  \/\/ ---- Sensores: fetch + agregaci\u00f3n por aula ----\n  function fetchSensors(){\n    \/\/ cache-buster para evitar caches intermedias\n    var url = SENSORS_JSON_URL + (SENSORS_JSON_URL.indexOf('?')>=0?'&':'?') + '_t=' + Date.now();\n    fetch(url, { cache:'no-store' })\n      .then(function(r){ if(!r.ok) throw new Error('HTTP '+r.status); return r.json(); })\n      .then(function(data){\n        var by = {};\n        (data.sensors||[]).forEach(function(s){\n          var aula = ENTITY_TO_AULA[s.entity_id];\n          if (!aula) return;\n          var slot = by[aula] || (by[aula] = { temperature:null, humidity:null, co2:null, light:null, motion:null, updated:null, raw:[] });\n          slot.raw.push(s);\n          var a = s.attributes || {};\n          var st = (typeof s.state === 'number') ? s.state : parseFloat(s.state);\n          if (s.domain === 'air_quality'){\n            if (!isNaN(a.CO2))         slot.co2 = a.CO2;\n            if (!isNaN(a.Temperature)) slot.temperature = a.Temperature;\n            if (!isNaN(a.Humidity))    slot.humidity = a.Humidity;\n            if (!isNaN(a.Light))       slot.light = a.Light;\n            if (typeof a.Motion !== 'undefined') slot.motion = a.Motion;\n          } else if (s.domain === 'sensor'){\n            if (a.device_class === 'temperature' && !isNaN(st)) slot.temperature = st;\n            else if (a.device_class === 'humidity' && !isNaN(st)) slot.humidity = st;\n          }\n          if (s.last_updated && (!slot.updated || s.last_updated > slot.updated)) slot.updated = s.last_updated;\n        });\n        state.sensorsByAula = by;\n        state.sensorsUpdatedAt = new Date();\n        renderList();\n        \/\/ si hay un aula seleccionada, refrescar su panel\n        if (state.selectedId) drawMarker();\n      })\n      .catch(function(err){\n        \/\/ silencioso; la UI sigue funcionando sin sensores\n        if (window.console && console.warn) console.warn('Sensores no disponibles:', err.message);\n      });\n  }\n\n  \/\/ ---- Build filters ----\n  var filtersEl = $('#esi-filters');\n  CATEGORIES.forEach(function(c){\n    var b = document.createElement('button');\n    b.className = 'esi-chip' + (c.id==='all'?' on':'');\n    b.textContent = c.label;\n    b.setAttribute('data-cat', c.id);\n    b.type = 'button';\n    b.addEventListener('click', function(){\n      state.filter = c.id;\n      $$('.esi-chip').forEach(function(x){ x.classList.toggle('on', x.getAttribute('data-cat')===c.id); });\n      renderList();\n    });\n    filtersEl.appendChild(b);\n  });\n\n  \/\/ ---- Build tabs ----\n  var tabsEl = $('#esi-tabs');\n  TAB_ORDER.forEach(function(k){\n    var t = document.createElement('button');\n    t.className = 'esi-tab';\n    t.type = 'button';\n    t.textContent = MAPS[k].short;\n    t.setAttribute('data-key', k);\n    t.addEventListener('click', function(){ setMap(k, false); });\n    tabsEl.appendChild(t);\n  });\n\n  \/\/ ---- Search ----\n  var qInput = $('#esi-q');\n  var qClear = $('#esi-q-clear');\n  qInput.addEventListener('input', function(e){\n    state.query = e.target.value.trim().toLowerCase();\n    qClear.classList.toggle('show', !!state.query);\n    renderList();\n  });\n  qClear.addEventListener('click', function(){\n    qInput.value = ''; state.query = ''; qClear.classList.remove('show');\n    renderList(); qInput.focus();\n  });\n\n  \/\/ ---- Mobile toggle ----\n  var menuBtn = $('#esi-menu-btn');\n  var menuLabel = $('#esi-menu-label');\n  var sideEl = $('#esi-side');\n  menuBtn.addEventListener('click', function(){\n    var collapsed = sideEl.classList.toggle('collapsed');\n    menuBtn.setAttribute('aria-expanded', String(!collapsed));\n    menuLabel.textContent = collapsed ? 'Mostrar lista de aulas' : 'Ocultar lista de aulas';\n  });\n\n  \/\/ ---- List render ----\n  function matches(r){\n    if (state.filter !== 'all' && r.type !== state.filter) return false;\n    if (!state.query) return true;\n    var hay = [r.code, r.name, TYPES[r.type], BUILDINGS[r.building], FLOORS[r.floor], moduleLabel(r)]\n      .join(' ').toLowerCase();\n    \/\/ normalize accents\n    hay = hay.normalize('NFD').replace(\/[\\u0300-\\u036f]\/g,'');\n    var q = state.query.normalize('NFD').replace(\/[\\u0300-\\u036f]\/g,'');\n    return hay.indexOf(q) !== -1;\n  }\n\n  function typeGlyph(type){\n    if (type==='aula') return 'A';\n    if (type==='laboratorio') return 'LAB';\n    if (type==='sala') return 'S';\n    return '\u2022';\n  }\n\n  function moduleLabel(r){\n    return r.module ? 'M\u00f3dulo ' + r.module : '';\n  }\n\n  function renderList(){\n    var matched = ROOMS.filter(matches);\n    $('#esi-count').textContent = matched.length + ' zonas';\n\n    var groups = {};\n    matched.forEach(function(r){\n      var key = r.building + '|' + r.floor;\n      if (!groups[key]) groups[key] = { building:r.building, floor:r.floor, rooms:[] };\n      groups[key].rooms.push(r);\n    });\n    var order = ['fermin|0','fermin|1','fermin|2','politecnico|0'];\n\n    var listEl = $('#esi-list');\n    listEl.innerHTML = '';\n    if (matched.length === 0){\n      listEl.innerHTML = '<div class=\"esi-empty\">Sin resultados. Prueba con otro t\u00e9rmino.<\/div>';\n      return;\n    }\n    order.forEach(function(k){\n      var g = groups[k]; if (!g) return;\n      var h = document.createElement('div');\n      h.className = 'esi-group';\n      h.innerHTML = '<span>' + BUILDINGS[g.building] + ' \u00b7 ' + FLOORS[g.floor] + '<\/span>';\n      listEl.appendChild(h);\n      g.rooms.forEach(function(r){ listEl.appendChild(roomNode(r)); });\n    });\n  }\n\n  var HORARIOS_URL = 'https:\/\/esi.uclm.es\/index.php\/consulta-de-horarios-del-grado-en-ingenieria-informatica\/';\n\n  function roomNode(r){\n    var div = document.createElement('div');\n    div.className = 'esi-room' + (r.id===state.selectedId?' active':'');\n    div.setAttribute('role','listitem');\n    div.setAttribute('data-id', r.id);\n    var occupUrl = HORARIOS_URL + '?mode=room&aula=' + encodeURIComponent(r.code);\n    div.innerHTML =\n      '<div class=\"esi-room-ico\">' + typeGlyph(r.type) + '<\/div>' +\n      '<div class=\"esi-room-meta\">' +\n        '<div class=\"esi-room-code\">' +\n          '<span class=\"esi-room-code-text\">' + r.code + '<\/span>' +\n          '<a class=\"esi-occup-link\" href=\"' + occupUrl + '\" target=\"_blank\" rel=\"noopener noreferrer\" title=\"Ver ocupaci\u00f3n del aula en el horario\">(ver ocupaci\u00f3n)<\/a>' +\n        '<\/div>' +\n        '<div class=\"esi-room-name\">' + r.name + '<\/div>' +\n        (r.module ? '<div class=\"esi-room-location\">' + moduleLabel(r) + '<\/div>' : '') +\n        sensorPills(r) +\n      '<\/div>' +\n      '<div class=\"esi-room-floor\">P' + r.floor + '<\/div>';\n    div.addEventListener('click', function(ev){\n      if (ev.target.closest && ev.target.closest('.esi-occup-link')) return;\n      select(r.id);\n    });\n    return div;\n  }\n\n  \/\/ Iconos SVG inline\n  var ICO = {\n    temp: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M14 14.76V4a2 2 0 0 0-4 0v10.76a4 4 0 1 0 4 0z\"\/><\/svg>',\n    hum:  '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M12 2.5s6 6.5 6 11a6 6 0 1 1-12 0c0-4.5 6-11 6-11z\"\/><\/svg>',\n    co2:  '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><path d=\"M4 12a4 4 0 0 1 7.5-1.9A4.5 4.5 0 0 1 20 12.5a4.5 4.5 0 0 1-4.5 4.5H7a3 3 0 0 1-3-3z\"\/><\/svg>',\n    light:'<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"12\" r=\"4\"\/><path d=\"M12 2v2M12 20v2M4.93 4.93l1.41 1.41M17.66 17.66l1.41 1.41M2 12h2M20 12h2M6.34 17.66l-1.41 1.41M19.07 4.93l-1.41 1.41\"\/><\/svg>',\n    move: '<svg viewBox=\"0 0 24 24\" fill=\"none\" stroke=\"currentColor\" stroke-width=\"2\" stroke-linecap=\"round\" stroke-linejoin=\"round\"><circle cx=\"12\" cy=\"5\" r=\"2\"\/><path d=\"M10 22l1-8-3-2 2-5 4 1 2 3\"\/><path d=\"M15 22l-1-6\"\/><\/svg>'\n  };\n\n  function sensorPills(r){\n    var s = state.sensorsByAula[aulaKey(r)];\n    if (!s) return '';\n    var html = '';\n    if (s.temperature != null)\n      html += '<span class=\"esi-pill p-t\" title=\"Temperatura\">' + ICO.temp + (Math.round(s.temperature*10)\/10) + '\u00b0<\/span>';\n    if (s.humidity != null)\n      html += '<span class=\"esi-pill p-h\" title=\"Humedad\">' + ICO.hum + Math.round(s.humidity) + '%<\/span>';\n    if (s.co2 != null)\n      html += '<span class=\"esi-pill p-c ' + co2Class(s.co2) + '\" title=\"CO\u2082\">' + ICO.co2 + Math.round(s.co2) + ' ppm<\/span>';\n    return html ? '<div class=\"esi-pills\">' + html + '<\/div>' : '';\n  }\n\n  function co2Class(v){\n    if (v == null) return '';\n    if (v < 800) return 'ok';\n    if (v < 1200) return 'warn';\n    return 'bad';\n  }\n  function fmtTime(iso){\n    if (!iso) return '\u2014';\n    \/\/ ISO o 'YYYY-MM-DD HH:mm:ss.xxxx'\n    var d = new Date(iso.replace(' ','T'));\n    if (isNaN(d.getTime())) return iso;\n    var pad = function(n){return String(n).padStart(2,'0');};\n    return pad(d.getHours())+':'+pad(d.getMinutes());\n  }\n\n  \/\/ ---- Map + marker ----\n  var img = $('#esi-img');\n  var idleEl = $('#esi-idle');\n  var frameEl = $('#esi-frame');\n  var innerEl = $('#esi-inner');\n  var markerLayer = $('#esi-marker-layer');\n  var infoEl = $('#esi-info');\n  var titleEl = $('#esi-maptitle');\n\n  function setMap(key, keepSelection){\n    if (!key || !MAPS[key]) return;\n    var m = MAPS[key];\n    state.mapKey = key;\n    img.src = MAP_URLS[key];\n    img.alt = m.label;\n    img.style.display = '';\n    idleEl.style.display = 'none';\n    frameEl.style.setProperty('--ratio', m.w + '\/' + m.h);\n    titleEl.innerHTML = 'Plano actual \u00b7 <strong>' + m.label + '<\/strong>';\n    $$('.esi-tab').forEach(function(b){ b.classList.toggle('on', b.getAttribute('data-key')===key); });\n    if (!keepSelection){\n      var r = ROOMS.filter(function(r){return r.id===state.selectedId;})[0];\n      if (!r || r.map !== key) clearMarker();\n    } else {\n      drawMarker();\n    }\n    esiScheduleFollow();\n  }\n\n  function clearMarker(){\n    markerLayer.innerHTML = '';\n    infoEl.classList.remove('show');\n    esiScheduleFollow();\n  }\n\n  function drawMarker(){\n    markerLayer.innerHTML = '';\n    var r = ROOMS.filter(function(r){return r.id===state.selectedId;})[0];\n    if (!r || r.map !== state.mapKey){ infoEl.classList.remove('show'); return; }\n\n    var innerRect = innerEl.getBoundingClientRect();\n    if (innerRect.width < 5 || innerRect.height < 5) return;\n    var m = MAPS[r.map];\n    var ratio = m.w \/ m.h;\n    var innerRatio = innerRect.width \/ innerRect.height;\n    var imgW, imgH, offX, offY;\n    if (innerRatio > ratio){\n      imgH = innerRect.height; imgW = imgH * ratio;\n      offX = (innerRect.width - imgW)\/2; offY = 0;\n    } else {\n      imgW = innerRect.width;  imgH = imgW \/ ratio;\n      offX = 0; offY = (innerRect.height - imgH)\/2;\n    }\n    var left = offX + imgW * (r.x\/100);\n    var top  = offY + imgH * (r.y\/100);\n    var leftPct = (left \/ innerRect.width) * 100;\n    var topPct  = (top  \/ innerRect.height) * 100;\n\n    var el = document.createElement('div');\n    el.className = 'esi-marker'\n      + (leftPct > 75 ? ' flip-x' : '')\n      + (topPct < 18 ? ' flip-y' : '');\n    el.style.left = leftPct + '%';\n    el.style.top  = topPct  + '%';\n    el.innerHTML =\n      '<div class=\"pulse\"><\/div><div class=\"pulse d2\"><\/div><div class=\"pulse d3\"><\/div>' +\n      '<div class=\"core\"><\/div>' +\n      '<div class=\"label\"><strong>' + r.code + '<\/strong><span>' + r.name + '<\/span><\/div>';\n    markerLayer.appendChild(el);\n\n    infoEl.innerHTML =\n      '<div class=\"sub\">' + TYPES[r.type] + '<\/div>' +\n      '<h4>' + r.code + '<\/h4>' +\n      '<div class=\"row\"><span class=\"k\">Denominaci\u00f3n<\/span><span class=\"v\">' + r.name + '<\/span><\/div>' +\n      '<div class=\"row\"><span class=\"k\">Edificio<\/span><span class=\"v\">' + BUILDINGS[r.building] + '<\/span><\/div>' +\n      (r.module ? '<div class=\"row\"><span class=\"k\">M\u00f3dulo<\/span><span class=\"v\">' + moduleLabel(r) + '<\/span><\/div>' : '') +\n      '<div class=\"row\"><span class=\"k\">Planta<\/span><span class=\"v\">' + FLOORS[r.floor] + '<\/span><\/div>' +\n      sensorsBlock(r);\n    infoEl.classList.add('show');\n    esiScheduleFollow();\n  }\n\n  function sensorsBlock(r){\n    var s = state.sensorsByAula[aulaKey(r)];\n    if (!s) return '';\n    var cards = '';\n    if (s.temperature != null)\n      cards += '<div class=\"esi-sc sc-t\"><span class=\"sc-ic\">' + ICO.temp + '<\/span><span class=\"sc-v\">' + (Math.round(s.temperature*10)\/10) + ' \u00b0C<\/span><span class=\"sc-l\">Temperatura<\/span><\/div>';\n    if (s.humidity != null)\n      cards += '<div class=\"esi-sc sc-h\"><span class=\"sc-ic\">' + ICO.hum + '<\/span><span class=\"sc-v\">' + Math.round(s.humidity) + ' %<\/span><span class=\"sc-l\">Humedad<\/span><\/div>';\n    if (s.co2 != null)\n      cards += '<div class=\"esi-sc sc-c ' + co2Class(s.co2) + '\"><span class=\"sc-ic\">' + ICO.co2 + '<\/span><span class=\"sc-v\">' + Math.round(s.co2) + ' <small>ppm<\/small><\/span><span class=\"sc-l\">CO\u2082 \u00b7 Calidad aire<\/span><\/div>';\n    if (s.light != null)\n      cards += '<div class=\"esi-sc\"><span class=\"sc-ic\">' + ICO.light + '<\/span><span class=\"sc-v\">' + Math.round(s.light) + '<\/span><span class=\"sc-l\">Luz<\/span><\/div>';\n    if (typeof s.motion !== 'undefined' && s.motion !== null)\n      cards += '<div class=\"esi-sc\"><span class=\"sc-ic\">' + ICO.move + '<\/span><span class=\"sc-v\">' + s.motion + '<\/span><span class=\"sc-l\">Movimiento<\/span><\/div>';\n    if (!cards) return '';\n    return '<div class=\"esi-sensors-head\">Sensores <span class=\"esi-live\"><span class=\"dot\"><\/span>en vivo \u00b7 ' + fmtTime(s.updated) + '<\/span><\/div>' +\n           '<div class=\"esi-sensors\">' + cards + '<\/div>';\n  }\n\n  function select(id){\n    var r = ROOMS.filter(function(r){return r.id===id;})[0];\n    if (!r) return;\n    state.selectedId = id;\n    $$('.esi-room').forEach(function(n){ n.classList.toggle('active', n.getAttribute('data-id')===id); });\n    if (state.mapKey !== r.map) setMap(r.map, true);\n    else drawMarker();\n    try { localStorage.setItem('esi-map-selected', id); } catch(e){}\n\n    \/\/ On mobile, collapse the list and scroll to the map\n    if (window.matchMedia('(max-width: 820px)').matches){\n      sideEl.classList.add('collapsed');\n      menuBtn.setAttribute('aria-expanded','false');\n      menuLabel.textContent = 'Mostrar lista de aulas';\n      setTimeout(function(){\n        try {\n          var rect = frameEl.getBoundingClientRect();\n          var y = window.pageYOffset + rect.top - 12;\n          window.scrollTo({ top:y, behavior:'smooth' });\n        } catch(_){}\n        drawMarker();\n      }, 320);\n    }\n  }\n\n  \/\/ Resize observer \u2192 redraw marker\n  var resizeT;\n  window.addEventListener('resize', function(){\n    clearTimeout(resizeT);\n    resizeT = setTimeout(drawMarker, 60);\n  });\n\n  \/\/ ---- Init ----\n  renderList();\n  \/\/ sensores: primera lectura + refresco peri\u00f3dico\n  fetchSensors();\n  setInterval(fetchSensors, SENSORS_REFRESH_MS);\n  var initial = null;\n  try { initial = localStorage.getItem('esi-map-selected'); } catch(e){}\n  if (initial && ROOMS.filter(function(r){return r.id===initial;})[0]){\n    select(initial);\n  } else {\n    setMap('esi_baja', false);\n  }\n})();\n<\/script>\n\n<\/body>\n<\/html>\n\n","protected":false},"excerpt":{"rendered":"<p>Mapa Interactivo \u00b7 ESI UCLM Mapa interactivo de aulas y laboratorios Escuela Superior de Inform\u00e1tica \u00b7 UCLM \u2014 Ocultar lista de aulas \u00d7 Selecciona un aula o laboratorio Elige un aula o laboratorio Se mostrar\u00e1 la planta y se marcar\u00e1 su ubicaci\u00f3n. Escuela Superior de [&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-23033","page","type-page","status-publish","hentry"],"yoast_head":"<!-- This site is optimized with the Yoast SEO plugin v27.4 - https:\/\/yoast.com\/product\/yoast-seo-wordpress\/ -->\n<title>Mapa interactivo de aulas y laboratorios - Escuela Superior de Inform\u00e1tica de UCLM<\/title>\n<meta name=\"robots\" content=\"index, follow, max-snippet:-1, max-image-preview:large, max-video-preview:-1\" \/>\n<link rel=\"canonical\" href=\"https:\/\/esi.uclm.es\/index.php\/mapa-interactivo-de-aulas-y-laboratorios\/\" \/>\n<meta property=\"og:locale\" content=\"es_ES\" \/>\n<meta property=\"og:type\" content=\"article\" \/>\n<meta property=\"og:title\" content=\"Mapa interactivo de aulas y laboratorios - Escuela Superior de Inform\u00e1tica de UCLM\" \/>\n<meta property=\"og:description\" content=\"Mapa Interactivo \u00b7 ESI UCLM Mapa interactivo de aulas y laboratorios Escuela Superior de Inform\u00e1tica \u00b7 UCLM \u2014 Ocultar lista de aulas \u00d7 Selecciona un aula o laboratorio Elige un aula o laboratorio Se mostrar\u00e1 la planta y se marcar\u00e1 su ubicaci\u00f3n. Escuela Superior de [&hellip;]\" \/>\n<meta property=\"og:url\" content=\"https:\/\/esi.uclm.es\/index.php\/mapa-interactivo-de-aulas-y-laboratorios\/\" \/>\n<meta property=\"og:site_name\" content=\"Escuela Superior de Inform\u00e1tica de UCLM\" \/>\n<meta property=\"article:publisher\" content=\"https:\/\/www.facebook.com\/Escuela-Superior-de-Informtica-543261809027158\" \/>\n<meta property=\"article:modified_time\" content=\"2026-04-24T15:29:18+00:00\" \/>\n<meta name=\"twitter:card\" content=\"summary_large_image\" \/>\n<meta name=\"twitter:site\" content=\"@esiuclm\" \/>\n<meta name=\"twitter:label1\" content=\"Tiempo de lectura\" \/>\n\t<meta name=\"twitter:data1\" content=\"1 minuto\" \/>\n<script type=\"application\/ld+json\" class=\"yoast-schema-graph\">{\"@context\":\"https:\\\/\\\/schema.org\",\"@graph\":[{\"@type\":\"WebPage\",\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/index.php\\\/mapa-interactivo-de-aulas-y-laboratorios\\\/\",\"url\":\"https:\\\/\\\/esi.uclm.es\\\/index.php\\\/mapa-interactivo-de-aulas-y-laboratorios\\\/\",\"name\":\"Mapa interactivo de aulas y laboratorios - Escuela Superior de Inform\u00e1tica de UCLM\",\"isPartOf\":{\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/#website\"},\"datePublished\":\"2026-04-22T17:08:16+00:00\",\"dateModified\":\"2026-04-24T15:29:18+00:00\",\"breadcrumb\":{\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/index.php\\\/mapa-interactivo-de-aulas-y-laboratorios\\\/#breadcrumb\"},\"inLanguage\":\"es\",\"potentialAction\":[{\"@type\":\"ReadAction\",\"target\":[\"https:\\\/\\\/esi.uclm.es\\\/index.php\\\/mapa-interactivo-de-aulas-y-laboratorios\\\/\"]}]},{\"@type\":\"BreadcrumbList\",\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/index.php\\\/mapa-interactivo-de-aulas-y-laboratorios\\\/#breadcrumb\",\"itemListElement\":[{\"@type\":\"ListItem\",\"position\":1,\"name\":\"Portada\",\"item\":\"https:\\\/\\\/esi.uclm.es\\\/\"},{\"@type\":\"ListItem\",\"position\":2,\"name\":\"Mapa interactivo de aulas y laboratorios\"}]},{\"@type\":\"WebSite\",\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/#website\",\"url\":\"https:\\\/\\\/esi.uclm.es\\\/\",\"name\":\"Escuela Superior de Inform\u00e1tica de UCLM en Ciudad Real, Castilla-La Mancha\",\"description\":\"La Escuela Superior de Inform\u00e1tica de Ciudad Real (Castilla-La Mancha), Universidad de Castilla-La Mancha es un centro universitario que imparte el ciclo completo de Ingenier\u00eda en Inform\u00e1tica: grado, m\u00e1ster y doctorado.\",\"publisher\":{\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/#organization\"},\"potentialAction\":[{\"@type\":\"SearchAction\",\"target\":{\"@type\":\"EntryPoint\",\"urlTemplate\":\"https:\\\/\\\/esi.uclm.es\\\/?s={search_term_string}\"},\"query-input\":{\"@type\":\"PropertyValueSpecification\",\"valueRequired\":true,\"valueName\":\"search_term_string\"}}],\"inLanguage\":\"es\"},{\"@type\":\"Organization\",\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/#organization\",\"name\":\"Escuela Superior de Inform\u00e1tica de UCLM\",\"url\":\"https:\\\/\\\/esi.uclm.es\\\/\",\"logo\":{\"@type\":\"ImageObject\",\"inLanguage\":\"es\",\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/#\\\/schema\\\/logo\\\/image\\\/\",\"url\":\"https:\\\/\\\/esi.uclm.es\\\/assets\\\/uploads\\\/2022\\\/03\\\/LogoESI_cabecera-1.png\",\"contentUrl\":\"https:\\\/\\\/esi.uclm.es\\\/assets\\\/uploads\\\/2022\\\/03\\\/LogoESI_cabecera-1.png\",\"width\":460,\"height\":184,\"caption\":\"Escuela Superior de Inform\u00e1tica de UCLM\"},\"image\":{\"@id\":\"https:\\\/\\\/esi.uclm.es\\\/#\\\/schema\\\/logo\\\/image\\\/\"},\"sameAs\":[\"https:\\\/\\\/www.facebook.com\\\/Escuela-Superior-de-Informtica-543261809027158\",\"https:\\\/\\\/x.com\\\/esiuclm\",\"https:\\\/\\\/www.instagram.com\\\/esiuclm\\\/\",\"https:\\\/\\\/www.youtube.com\\\/user\\\/esiuclm\",\"https:\\\/\\\/www.twitch.tv\\\/esiuclm\",\"https:\\\/\\\/www.linkedin.com\\\/company\\\/12656631\\\/admin\\\/\"]}]}<\/script>\n<!-- \/ Yoast SEO plugin. -->","yoast_head_json":{"title":"Mapa interactivo de aulas y laboratorios - Escuela Superior de Inform\u00e1tica de UCLM","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:\/\/esi.uclm.es\/index.php\/mapa-interactivo-de-aulas-y-laboratorios\/","og_locale":"es_ES","og_type":"article","og_title":"Mapa interactivo de aulas y laboratorios - Escuela Superior de Inform\u00e1tica de UCLM","og_description":"Mapa Interactivo \u00b7 ESI UCLM Mapa interactivo de aulas y laboratorios Escuela Superior de Inform\u00e1tica \u00b7 UCLM \u2014 Ocultar lista de aulas \u00d7 Selecciona un aula o laboratorio Elige un aula o laboratorio Se mostrar\u00e1 la planta y se marcar\u00e1 su ubicaci\u00f3n. Escuela Superior de [&hellip;]","og_url":"https:\/\/esi.uclm.es\/index.php\/mapa-interactivo-de-aulas-y-laboratorios\/","og_site_name":"Escuela Superior de Inform\u00e1tica de UCLM","article_publisher":"https:\/\/www.facebook.com\/Escuela-Superior-de-Informtica-543261809027158","article_modified_time":"2026-04-24T15:29:18+00:00","twitter_card":"summary_large_image","twitter_site":"@esiuclm","twitter_misc":{"Tiempo de lectura":"1 minuto"},"schema":{"@context":"https:\/\/schema.org","@graph":[{"@type":"WebPage","@id":"https:\/\/esi.uclm.es\/index.php\/mapa-interactivo-de-aulas-y-laboratorios\/","url":"https:\/\/esi.uclm.es\/index.php\/mapa-interactivo-de-aulas-y-laboratorios\/","name":"Mapa interactivo de aulas y laboratorios - Escuela Superior de Inform\u00e1tica de UCLM","isPartOf":{"@id":"https:\/\/esi.uclm.es\/#website"},"datePublished":"2026-04-22T17:08:16+00:00","dateModified":"2026-04-24T15:29:18+00:00","breadcrumb":{"@id":"https:\/\/esi.uclm.es\/index.php\/mapa-interactivo-de-aulas-y-laboratorios\/#breadcrumb"},"inLanguage":"es","potentialAction":[{"@type":"ReadAction","target":["https:\/\/esi.uclm.es\/index.php\/mapa-interactivo-de-aulas-y-laboratorios\/"]}]},{"@type":"BreadcrumbList","@id":"https:\/\/esi.uclm.es\/index.php\/mapa-interactivo-de-aulas-y-laboratorios\/#breadcrumb","itemListElement":[{"@type":"ListItem","position":1,"name":"Portada","item":"https:\/\/esi.uclm.es\/"},{"@type":"ListItem","position":2,"name":"Mapa interactivo de aulas y laboratorios"}]},{"@type":"WebSite","@id":"https:\/\/esi.uclm.es\/#website","url":"https:\/\/esi.uclm.es\/","name":"Escuela Superior de Inform\u00e1tica de UCLM en Ciudad Real, Castilla-La Mancha","description":"La Escuela Superior de Inform\u00e1tica de Ciudad Real (Castilla-La Mancha), Universidad de Castilla-La Mancha es un centro universitario que imparte el ciclo completo de Ingenier\u00eda en Inform\u00e1tica: grado, m\u00e1ster y doctorado.","publisher":{"@id":"https:\/\/esi.uclm.es\/#organization"},"potentialAction":[{"@type":"SearchAction","target":{"@type":"EntryPoint","urlTemplate":"https:\/\/esi.uclm.es\/?s={search_term_string}"},"query-input":{"@type":"PropertyValueSpecification","valueRequired":true,"valueName":"search_term_string"}}],"inLanguage":"es"},{"@type":"Organization","@id":"https:\/\/esi.uclm.es\/#organization","name":"Escuela Superior de Inform\u00e1tica de UCLM","url":"https:\/\/esi.uclm.es\/","logo":{"@type":"ImageObject","inLanguage":"es","@id":"https:\/\/esi.uclm.es\/#\/schema\/logo\/image\/","url":"https:\/\/esi.uclm.es\/assets\/uploads\/2022\/03\/LogoESI_cabecera-1.png","contentUrl":"https:\/\/esi.uclm.es\/assets\/uploads\/2022\/03\/LogoESI_cabecera-1.png","width":460,"height":184,"caption":"Escuela Superior de Inform\u00e1tica de UCLM"},"image":{"@id":"https:\/\/esi.uclm.es\/#\/schema\/logo\/image\/"},"sameAs":["https:\/\/www.facebook.com\/Escuela-Superior-de-Informtica-543261809027158","https:\/\/x.com\/esiuclm","https:\/\/www.instagram.com\/esiuclm\/","https:\/\/www.youtube.com\/user\/esiuclm","https:\/\/www.twitch.tv\/esiuclm","https:\/\/www.linkedin.com\/company\/12656631\/admin\/"]}]}},"_links":{"self":[{"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/pages\/23033","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/comments?post=23033"}],"version-history":[{"count":16,"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/pages\/23033\/revisions"}],"predecessor-version":[{"id":23097,"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/pages\/23033\/revisions\/23097"}],"wp:attachment":[{"href":"https:\/\/esi.uclm.es\/index.php\/wp-json\/wp\/v2\/media?parent=23033"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}