{"id":43073,"date":"2026-08-04T16:33:09","date_gmt":"2026-08-04T16:33:09","guid":{"rendered":"https:\/\/cursos1.nead.conasems.org.br\/?page_id=43073"},"modified":"2026-08-04T16:34:24","modified_gmt":"2026-08-04T16:34:24","slug":"cuidado-recursos-teste","status":"publish","type":"page","link":"https:\/\/cursos1.nead.conasems.org.br\/index.php\/cuidado-recursos-teste\/","title":{"rendered":"Cuidado &#8211; Recursos Teste"},"content":{"rendered":"\t\t<div data-elementor-type=\"wp-page\" data-elementor-id=\"43073\" class=\"elementor elementor-43073\" data-elementor-post-type=\"page\">\n\t\t\t\t<div class=\"elementor-element elementor-element-c6e84b3 e-con-full e-flex e-con e-parent\" data-id=\"c6e84b3\" data-element_type=\"container\">\n\t\t\t\t<div class=\"elementor-element elementor-element-01d1a7b elementor-widget elementor-widget-html\" data-id=\"01d1a7b\" data-element_type=\"widget\" data-widget_type=\"html.default\">\n\t\t\t\t<div class=\"elementor-widget-container\">\n\t\t\t\t\t<!DOCTYPE html>\r\n<html lang=\"pt-BR\">\r\n<head>\r\n  <meta charset=\"UTF-8\">\r\n  <meta name=\"viewport\" content=\"width=device-width, initial-scale=1.0\">\r\n  <title>Teia Gen\u00e9rica de Redes em Sa\u00fade \u2014 com APS<\/title>\r\n<\/head>\r\n<body style=\"margin:0;padding:24px;background:#e9eef5;\">\r\n<!--\r\nTEIA GEN\u00c9RICA DE REDES E FLUXOS EM SA\u00daDE\r\nProt\u00f3tipo reutiliz\u00e1vel para Elementor.\r\nSem bibliotecas externas.\r\n\r\nCOMO PERSONALIZAR:\r\n1. Localize o objeto CARE_NETWORK_SCENARIOS no in\u00edcio do <script>.\r\n2. Duplique um cen\u00e1rio.\r\n3. Altere atores, responsabilidades, conex\u00f5es, rotas, m\u00e9tricas e gabarito.\r\n-->\r\n\r\n<section class=\"healthNetworkBuilder\" aria-labelledby=\"healthNetworkBuilderTitle\">\r\n  <header class=\"healthNetworkBuilder__header\">\r\n    <span class=\"healthNetworkBuilder__eyebrow\">Simula\u00e7\u00e3o configur\u00e1vel<\/span>\r\n\r\n    <div class=\"healthNetworkBuilder__headerRow\">\r\n      <div>\r\n        <h2 id=\"healthNetworkBuilderTitle\">Teia interativa em sa\u00fade<\/h2>\r\n        <p class=\"healthNetworkBuilder__intro\"><\/p>\r\n      <\/div>\r\n\r\n      <label class=\"healthNetworkBuilder__scenarioPicker\">\r\n        <span>Exemplo para testar<\/span>\r\n        <select class=\"healthNetworkBuilder__scenarioSelect\"><\/select>\r\n      <\/label>\r\n    <\/div>\r\n  <\/header>\r\n\r\n  <div class=\"healthNetworkBuilder__steps\" aria-label=\"Etapas da atividade\">\r\n    <span class=\"is-current\" data-step-indicator=\"1\"><b>1<\/b> Adicione atores<\/span>\r\n    <span data-step-indicator=\"2\"><b>2<\/b> Crie conex\u00f5es<\/span>\r\n    <span data-step-indicator=\"3\"><b>3<\/b> Distribua a\u00e7\u00f5es<\/span>\r\n    <span data-step-indicator=\"4\"><b>4<\/b> Teste o fluxo<\/span>\r\n  <\/div>\r\n\r\n  <div class=\"healthNetworkBuilder__workspace\">\r\n    <aside class=\"healthNetworkBuilder__sidebar healthNetworkBuilder__sidebar--left\">\r\n      <section class=\"healthNetworkBuilder__toolSection\">\r\n        <div class=\"healthNetworkBuilder__sectionHeading\">\r\n          <div>\r\n            <span>Etapa 1<\/span>\r\n            <h3>Atores dispon\u00edveis<\/h3>\r\n          <\/div>\r\n          <small>Arraste ou clique<\/small>\r\n        <\/div>\r\n\r\n        <div class=\"healthNetworkBuilder__actorPalette\"><\/div>\r\n      <\/section>\r\n\r\n      <section class=\"healthNetworkBuilder__toolSection\">\r\n        <div class=\"healthNetworkBuilder__sectionHeading\">\r\n          <div>\r\n            <span>Etapa 3<\/span>\r\n            <h3>Responsabilidades<\/h3>\r\n          <\/div>\r\n          <small>Arraste para um ator<\/small>\r\n        <\/div>\r\n\r\n        <div class=\"healthNetworkBuilder__taskPalette\"><\/div>\r\n      <\/section>\r\n    <\/aside>\r\n\r\n    <main class=\"healthNetworkBuilder__main\">\r\n      <div class=\"healthNetworkBuilder__canvasToolbar\">\r\n        <div class=\"healthNetworkBuilder__instruction\">\r\n          <span class=\"healthNetworkBuilder__instructionIcon\" aria-hidden=\"true\">\u2197<\/span>\r\n          <p>\r\n            Use <strong>\u2725<\/strong> para mover e o ponto <strong>\u25cf<\/strong>\r\n            para puxar uma conex\u00e3o at\u00e9 outro ator.\r\n          <\/p>\r\n        <\/div>\r\n\r\n        <div class=\"healthNetworkBuilder__toolbarButtons\">\r\n          <button class=\"healthNetworkBuilder__secondaryButton healthNetworkBuilder__clearConnections\" type=\"button\">\r\n            Limpar conex\u00f5es\r\n          <\/button>\r\n\r\n          <button class=\"healthNetworkBuilder__secondaryButton healthNetworkBuilder__reset\" type=\"button\">\r\n            Reiniciar\r\n          <\/button>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div\r\n        class=\"healthNetworkBuilder__canvas\"\r\n        role=\"application\"\r\n        aria-label=\"\u00c1rea de constru\u00e7\u00e3o da rede\"\r\n      >\r\n        <svg class=\"healthNetworkBuilder__svg\" aria-hidden=\"true\">\r\n          <defs class=\"healthNetworkBuilder__markerDefs\"><\/defs>\r\n          <g class=\"healthNetworkBuilder__edgeLayer\"><\/g>\r\n          <path class=\"healthNetworkBuilder__previewEdge\" d=\"\"><\/path>\r\n          <circle class=\"healthNetworkBuilder__packet\" r=\"8\" cx=\"-50\" cy=\"-50\"><\/circle>\r\n        <\/svg>\r\n\r\n        <div class=\"healthNetworkBuilder__nodes\"><\/div>\r\n\r\n        <div class=\"healthNetworkBuilder__emptyHint\">\r\n          <span aria-hidden=\"true\">\uff0b<\/span>\r\n          <p>Adicione atores para come\u00e7ar a construir a rede.<\/p>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"healthNetworkBuilder__testArea\">\r\n        <div>\r\n          <span class=\"healthNetworkBuilder__testEyebrow\">Etapa 4<\/span>\r\n          <h3 class=\"healthNetworkBuilder__routeTitle\"><\/h3>\r\n          <p class=\"healthNetworkBuilder__routeDescription\"><\/p>\r\n\r\n          <label class=\"healthNetworkBuilder__routePicker\" hidden>\r\n            <span>Fluxo para testar<\/span>\r\n            <select class=\"healthNetworkBuilder__routeSelect\"><\/select>\r\n          <\/label>\r\n        <\/div>\r\n\r\n        <div class=\"healthNetworkBuilder__testActions\">\r\n          <button class=\"healthNetworkBuilder__answerButton\" type=\"button\">\r\n            <span aria-hidden=\"true\">\u25c6<\/span>\r\n            Ver gabarito\r\n          <\/button>\r\n\r\n          <button class=\"healthNetworkBuilder__testButton\" type=\"button\">\r\n            <span aria-hidden=\"true\">\u25b6<\/span>\r\n            Testar fluxo\r\n          <\/button>\r\n        <\/div>\r\n      <\/div>\r\n\r\n      <div class=\"healthNetworkBuilder__testMessage\" hidden aria-live=\"polite\"><\/div>\r\n    <\/main>\r\n\r\n    <aside class=\"healthNetworkBuilder__sidebar healthNetworkBuilder__sidebar--right\">\r\n      <section class=\"healthNetworkBuilder__toolSection\">\r\n        <div class=\"healthNetworkBuilder__sectionHeading\">\r\n          <div>\r\n            <span>An\u00e1lise em tempo real<\/span>\r\n            <h3>Indicadores da rede<\/h3>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"healthNetworkBuilder__metrics\"><\/div>\r\n\r\n        <div class=\"healthNetworkBuilder__score\">\r\n          <span>Qualidade geral<\/span>\r\n          <strong class=\"healthNetworkBuilder__scoreValue\">0%<\/strong>\r\n          <small class=\"healthNetworkBuilder__scoreLabel\">Rede inicial<\/small>\r\n        <\/div>\r\n      <\/section>\r\n\r\n      <section class=\"healthNetworkBuilder__toolSection healthNetworkBuilder__actorInspector\">\r\n        <div class=\"healthNetworkBuilder__inspectorPlaceholder\">\r\n          <span aria-hidden=\"true\">\u25ce<\/span>\r\n          <h3>Selecione um ator<\/h3>\r\n          <p>Veja conex\u00f5es e responsabilidades atribu\u00eddas.<\/p>\r\n        <\/div>\r\n\r\n        <div class=\"healthNetworkBuilder__inspectorContent\" hidden>\r\n          <div class=\"healthNetworkBuilder__inspectorTop\">\r\n            <span class=\"healthNetworkBuilder__inspectorIcon\" aria-hidden=\"true\"><\/span>\r\n            <div>\r\n              <small>Ator selecionado<\/small>\r\n              <h3 class=\"healthNetworkBuilder__inspectorTitle\"><\/h3>\r\n            <\/div>\r\n          <\/div>\r\n\r\n          <p class=\"healthNetworkBuilder__inspectorDescription\"><\/p>\r\n\r\n          <div class=\"healthNetworkBuilder__inspectorBlock\">\r\n            <strong>Conex\u00f5es criadas<\/strong>\r\n            <div class=\"healthNetworkBuilder__inspectorConnections\"><\/div>\r\n          <\/div>\r\n\r\n          <div class=\"healthNetworkBuilder__inspectorBlock\">\r\n            <strong>Responsabilidades atribu\u00eddas<\/strong>\r\n            <div class=\"healthNetworkBuilder__inspectorTasks\"><\/div>\r\n          <\/div>\r\n        <\/div>\r\n      <\/section>\r\n\r\n      <section class=\"healthNetworkBuilder__toolSection healthNetworkBuilder__feedback\" hidden>\r\n        <div class=\"healthNetworkBuilder__sectionHeading\">\r\n          <div>\r\n            <span>Resultado do teste<\/span>\r\n            <h3>An\u00e1lise da rede<\/h3>\r\n          <\/div>\r\n        <\/div>\r\n\r\n        <div class=\"healthNetworkBuilder__feedbackStatus\"><\/div>\r\n\r\n        <div class=\"healthNetworkBuilder__feedbackColumns\">\r\n          <div>\r\n            <strong>Pontos fortes<\/strong>\r\n            <ul class=\"healthNetworkBuilder__strengths\"><\/ul>\r\n          <\/div>\r\n\r\n          <div>\r\n            <strong>Ajustes necess\u00e1rios<\/strong>\r\n            <ul class=\"healthNetworkBuilder__gaps\"><\/ul>\r\n          <\/div>\r\n        <\/div>\r\n      <\/section>\r\n    <\/aside>\r\n  <\/div>\r\n\r\n  <div class=\"healthNetworkBuilder__answerDialog\" hidden>\r\n    <div class=\"healthNetworkBuilder__dialogBackdrop\"><\/div>\r\n\r\n    <div\r\n      class=\"healthNetworkBuilder__answerCard\"\r\n      role=\"dialog\"\r\n      aria-modal=\"true\"\r\n      aria-labelledby=\"healthNetworkBuilderAnswerTitle\"\r\n    >\r\n      <span class=\"healthNetworkBuilder__dialogEyebrow\">Gabarito de refer\u00eancia<\/span>\r\n\r\n      <h3 id=\"healthNetworkBuilderAnswerTitle\" class=\"healthNetworkBuilder__answerTitle\"><\/h3>\r\n\r\n      <p class=\"healthNetworkBuilder__answerIntro\"><\/p>\r\n\r\n      <div class=\"healthNetworkBuilder__answerGrid\">\r\n        <section>\r\n          <strong>Atores da rede<\/strong>\r\n          <div class=\"healthNetworkBuilder__answerActors\"><\/div>\r\n        <\/section>\r\n\r\n        <section>\r\n          <strong>Conex\u00f5es<\/strong>\r\n          <ol class=\"healthNetworkBuilder__answerConnections\"><\/ol>\r\n        <\/section>\r\n\r\n        <section>\r\n          <strong>Responsabilidades<\/strong>\r\n          <ul class=\"healthNetworkBuilder__answerAssignments\"><\/ul>\r\n        <\/section>\r\n      <\/div>\r\n\r\n      <div class=\"healthNetworkBuilder__answerNote\">\r\n        <strong>Por que funciona?<\/strong>\r\n        <p class=\"healthNetworkBuilder__answerExplanation\"><\/p>\r\n      <\/div>\r\n\r\n      <div class=\"healthNetworkBuilder__answerActions\">\r\n        <button class=\"healthNetworkBuilder__answerClose\" type=\"button\">\r\n          Continuar minha tentativa\r\n        <\/button>\r\n\r\n        <button class=\"healthNetworkBuilder__answerApply\" type=\"button\">\r\n          Aplicar gabarito\r\n        <\/button>\r\n      <\/div>\r\n    <\/div>\r\n  <\/div>\r\n\r\n  <div class=\"healthNetworkBuilder__connectionDialog\" hidden>\r\n    <div class=\"healthNetworkBuilder__dialogBackdrop\"><\/div>\r\n\r\n    <div\r\n      class=\"healthNetworkBuilder__connectionCard\"\r\n      role=\"dialog\"\r\n      aria-modal=\"true\"\r\n      aria-labelledby=\"healthNetworkBuilderConnectionTitle\"\r\n    >\r\n      <span class=\"healthNetworkBuilder__dialogEyebrow\">Nova conex\u00e3o<\/span>\r\n\r\n      <h3 id=\"healthNetworkBuilderConnectionTitle\">\r\n        Qual \u00e9 o papel desta liga\u00e7\u00e3o?\r\n      <\/h3>\r\n\r\n      <p class=\"healthNetworkBuilder__dialogRoute\"><\/p>\r\n\r\n      <div class=\"healthNetworkBuilder__connectionTypes\"><\/div>\r\n\r\n      <button class=\"healthNetworkBuilder__dialogCancel\" type=\"button\">\r\n        Cancelar conex\u00e3o\r\n      <\/button>\r\n    <\/div>\r\n  <\/div>\r\n<\/section>\r\n\r\n<style>\r\n  .healthNetworkBuilder,\r\n  .healthNetworkBuilder * {\r\n    box-sizing: border-box;\r\n  }\r\n\r\n  .healthNetworkBuilder {\r\n    --hnb-blue: #294b8f;\r\n    --hnb-blue-dark: #1d3568;\r\n    --hnb-yellow: #f8ca33;\r\n    --hnb-green: #0e4a38;\r\n    --hnb-red: #b6473b;\r\n    --hnb-text: #1f2937;\r\n    --hnb-muted: #667085;\r\n    --hnb-border: #dbe2ec;\r\n    --hnb-soft: #f5f8fc;\r\n\r\n    width: min(100%, 1500px);\r\n    margin: 0 auto;\r\n    padding: 38px 26px 48px;\r\n    overflow: hidden;\r\n    border-radius: 30px;\r\n    color: var(--hnb-text);\r\n    background:\r\n      radial-gradient(circle at 5% 3%, rgba(41, 75, 143, .08), transparent 22%),\r\n      radial-gradient(circle at 96% 98%, rgba(14, 74, 56, .07), transparent 21%),\r\n      var(--hnb-soft);\r\n    font-family: \"Nunito\", Arial, sans-serif;\r\n  }\r\n\r\n  .healthNetworkBuilder button,\r\n  .healthNetworkBuilder select {\r\n    font-family: inherit;\r\n  }\r\n\r\n  .healthNetworkBuilder__header {\r\n    margin-bottom: 24px;\r\n  }\r\n\r\n  .healthNetworkBuilder__eyebrow,\r\n  .healthNetworkBuilder__testEyebrow,\r\n  .healthNetworkBuilder__dialogEyebrow {\r\n    display: inline-flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n    color: var(--hnb-blue);\r\n    font-size: 12px;\r\n    font-weight: 900;\r\n    letter-spacing: .08em;\r\n    text-transform: uppercase;\r\n  }\r\n\r\n  .healthNetworkBuilder__eyebrow {\r\n    margin-bottom: 9px;\r\n  }\r\n\r\n  .healthNetworkBuilder__eyebrow::before {\r\n    content: \"\";\r\n    width: 34px;\r\n    height: 4px;\r\n    border-radius: 999px;\r\n    background: var(--hnb-yellow);\r\n  }\r\n\r\n  .healthNetworkBuilder__headerRow {\r\n    display: flex;\r\n    align-items: flex-end;\r\n    justify-content: space-between;\r\n    gap: 24px;\r\n  }\r\n\r\n  .healthNetworkBuilder__headerRow > div {\r\n    max-width: 990px;\r\n  }\r\n\r\n  .healthNetworkBuilder__header h2 {\r\n    margin: 0 0 10px;\r\n    color: #111827;\r\n    font-size: clamp(28px, 4vw, 44px);\r\n    line-height: 1.1;\r\n  }\r\n\r\n  .healthNetworkBuilder__header p {\r\n    margin: 0;\r\n    color: var(--hnb-muted);\r\n    font-size: 17px;\r\n    line-height: 1.62;\r\n  }\r\n\r\n  .healthNetworkBuilder__scenarioPicker,\r\n  .healthNetworkBuilder__routePicker {\r\n    display: grid;\r\n    gap: 5px;\r\n    color: var(--hnb-blue-dark);\r\n    font-size: 11px;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .healthNetworkBuilder__scenarioPicker {\r\n    flex: 0 0 280px;\r\n  }\r\n\r\n  .healthNetworkBuilder__scenarioPicker select,\r\n  .healthNetworkBuilder__routePicker select {\r\n    width: 100%;\r\n    padding: 11px 36px 11px 12px;\r\n    border: 1px solid rgba(41, 75, 143, .25);\r\n    border-radius: 12px;\r\n    color: var(--hnb-blue-dark);\r\n    background: #ffffff;\r\n    font-size: 12px;\r\n    font-weight: 800;\r\n  }\r\n\r\n  .healthNetworkBuilder__steps {\r\n    display: grid;\r\n    grid-template-columns: repeat(4, minmax(0, 1fr));\r\n    margin-bottom: 18px;\r\n    overflow: hidden;\r\n    border: 1px solid rgba(41, 75, 143, .12);\r\n    border-radius: 17px;\r\n    background: rgba(255, 255, 255, .76);\r\n  }\r\n\r\n  .healthNetworkBuilder__steps span {\r\n    display: flex;\r\n    min-height: 50px;\r\n    padding: 9px 12px;\r\n    align-items: center;\r\n    justify-content: center;\r\n    gap: 8px;\r\n    color: var(--hnb-muted);\r\n    border-right: 1px solid var(--hnb-border);\r\n    font-size: 13px;\r\n    font-weight: 800;\r\n    text-align: center;\r\n  }\r\n\r\n  .healthNetworkBuilder__steps span:last-child {\r\n    border-right: 0;\r\n  }\r\n\r\n  .healthNetworkBuilder__steps b {\r\n    display: grid;\r\n    width: 25px;\r\n    aspect-ratio: 1;\r\n    place-items: center;\r\n    border-radius: 50%;\r\n    color: var(--hnb-blue);\r\n    background: #e9eff9;\r\n  }\r\n\r\n  .healthNetworkBuilder__steps span.is-current {\r\n    color: var(--hnb-blue-dark);\r\n    background: #fff9de;\r\n  }\r\n\r\n  .healthNetworkBuilder__steps span.is-current b,\r\n  .healthNetworkBuilder__steps span.is-complete b {\r\n    color: #111827;\r\n    background: var(--hnb-yellow);\r\n  }\r\n\r\n  .healthNetworkBuilder__workspace {\r\n    display: grid;\r\n    grid-template-columns: minmax(220px, 260px) minmax(520px, 1fr) minmax(260px, 320px);\r\n    gap: 18px;\r\n    align-items: start;\r\n  }\r\n\r\n  .healthNetworkBuilder__sidebar {\r\n    display: flex;\r\n    flex-direction: column;\r\n    gap: 16px;\r\n  }\r\n\r\n  .healthNetworkBuilder__toolSection {\r\n    padding: 18px;\r\n    border: 1px solid rgba(41, 75, 143, .12);\r\n    border-radius: 20px;\r\n    background: rgba(255, 255, 255, .94);\r\n    box-shadow: 0 10px 28px rgba(31, 51, 89, .07);\r\n  }\r\n\r\n  .healthNetworkBuilder__sectionHeading {\r\n    display: flex;\r\n    margin-bottom: 14px;\r\n    align-items: flex-start;\r\n    justify-content: space-between;\r\n    gap: 10px;\r\n  }\r\n\r\n  .healthNetworkBuilder__sectionHeading span {\r\n    display: block;\r\n    margin-bottom: 2px;\r\n    color: var(--hnb-blue);\r\n    font-size: 10px;\r\n    font-weight: 900;\r\n    letter-spacing: .07em;\r\n    text-transform: uppercase;\r\n  }\r\n\r\n  .healthNetworkBuilder__sectionHeading h3 {\r\n    margin: 0;\r\n    color: var(--hnb-blue-dark);\r\n    font-size: 17px;\r\n  }\r\n\r\n  .healthNetworkBuilder__sectionHeading small {\r\n    max-width: 80px;\r\n    color: var(--hnb-muted);\r\n    font-size: 10px;\r\n    text-align: right;\r\n  }\r\n\r\n  .healthNetworkBuilder__actorPalette,\r\n  .healthNetworkBuilder__taskPalette,\r\n  .healthNetworkBuilder__metrics {\r\n    display: grid;\r\n    gap: 9px;\r\n  }\r\n\r\n  .healthNetworkBuilder__actorCard,\r\n  .healthNetworkBuilder__taskCard {\r\n    display: flex;\r\n    width: 100%;\r\n    padding: 10px;\r\n    align-items: center;\r\n    gap: 10px;\r\n    border: 1px solid var(--hnb-border);\r\n    border-radius: 14px;\r\n    color: var(--hnb-blue-dark);\r\n    background: #ffffff;\r\n    font: inherit;\r\n    text-align: left;\r\n    cursor: grab;\r\n    transition: transform .2s ease, border-color .2s ease, opacity .2s ease;\r\n  }\r\n\r\n  .healthNetworkBuilder__actorCard:hover,\r\n  .healthNetworkBuilder__actorCard:focus-visible,\r\n  .healthNetworkBuilder__taskCard:hover,\r\n  .healthNetworkBuilder__taskCard:focus-visible {\r\n    border-color: var(--hnb-blue);\r\n    outline: none;\r\n    transform: translateY(-1px);\r\n  }\r\n\r\n  .healthNetworkBuilder__actorCard.is-added {\r\n    opacity: .42;\r\n    cursor: default;\r\n  }\r\n\r\n  .healthNetworkBuilder__taskCard.is-selected {\r\n    border-color: var(--hnb-yellow);\r\n    background: #fff9dc;\r\n    box-shadow: 0 0 0 3px rgba(248, 202, 51, .18);\r\n  }\r\n\r\n  .healthNetworkBuilder__actorIcon,\r\n  .healthNetworkBuilder__taskIcon {\r\n    display: grid;\r\n    flex: 0 0 auto;\r\n    width: 35px;\r\n    aspect-ratio: 1;\r\n    place-items: center;\r\n    border-radius: 11px;\r\n    color: #111827;\r\n    background: var(--hnb-yellow);\r\n    font-size: 13px;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .healthNetworkBuilder__actorCard strong,\r\n  .healthNetworkBuilder__taskCard strong {\r\n    display: block;\r\n    font-size: 12px;\r\n    line-height: 1.2;\r\n  }\r\n\r\n  .healthNetworkBuilder__actorCard small,\r\n  .healthNetworkBuilder__taskCard small {\r\n    display: block;\r\n    margin-top: 2px;\r\n    color: var(--hnb-muted);\r\n    font-size: 10px;\r\n    line-height: 1.25;\r\n  }\r\n\r\n  .healthNetworkBuilder__taskAssignment {\r\n    color: var(--hnb-green) !important;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .healthNetworkBuilder__canvasToolbar {\r\n    display: flex;\r\n    margin-bottom: 10px;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n    gap: 12px;\r\n  }\r\n\r\n  .healthNetworkBuilder__instruction {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 9px;\r\n    color: var(--hnb-muted);\r\n  }\r\n\r\n  .healthNetworkBuilder__instructionIcon {\r\n    display: grid;\r\n    flex: 0 0 auto;\r\n    width: 32px;\r\n    aspect-ratio: 1;\r\n    place-items: center;\r\n    border-radius: 10px;\r\n    color: var(--hnb-blue);\r\n    background: #e9eff9;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .healthNetworkBuilder__instruction p {\r\n    margin: 0;\r\n    font-size: 12px;\r\n  }\r\n\r\n  .healthNetworkBuilder__toolbarButtons,\r\n  .healthNetworkBuilder__testActions {\r\n    display: flex;\r\n    gap: 8px;\r\n  }\r\n\r\n  .healthNetworkBuilder__secondaryButton,\r\n  .healthNetworkBuilder__answerButton,\r\n  .healthNetworkBuilder__testButton,\r\n  .healthNetworkBuilder__answerClose,\r\n  .healthNetworkBuilder__answerApply {\r\n    border: 1px solid var(--hnb-blue);\r\n    border-radius: 12px;\r\n    color: var(--hnb-blue);\r\n    background: #ffffff;\r\n    font: inherit;\r\n    font-weight: 900;\r\n    cursor: pointer;\r\n    transition: color .2s ease, background .2s ease, transform .2s ease;\r\n  }\r\n\r\n  .healthNetworkBuilder__secondaryButton {\r\n    padding: 9px 11px;\r\n    font-size: 11px;\r\n  }\r\n\r\n  .healthNetworkBuilder__secondaryButton:hover,\r\n  .healthNetworkBuilder__secondaryButton:focus-visible,\r\n  .healthNetworkBuilder__answerButton:hover,\r\n  .healthNetworkBuilder__answerButton:focus-visible {\r\n    color: #ffffff;\r\n    background: var(--hnb-blue);\r\n    outline: none;\r\n    transform: translateY(-1px);\r\n  }\r\n\r\n  .healthNetworkBuilder__canvas {\r\n    position: relative;\r\n    min-height: 660px;\r\n    overflow: hidden;\r\n    border: 1px solid rgba(41, 75, 143, .13);\r\n    border-radius: 25px;\r\n    background:\r\n      linear-gradient(rgba(41, 75, 143, .035) 1px, transparent 1px),\r\n      linear-gradient(90deg, rgba(41, 75, 143, .035) 1px, transparent 1px),\r\n      radial-gradient(circle at center, rgba(41, 75, 143, .10), transparent 27%),\r\n      #ffffff;\r\n    background-size: 34px 34px, 34px 34px, auto, auto;\r\n    touch-action: none;\r\n  }\r\n\r\n  .healthNetworkBuilder__canvas.is-drop-target {\r\n    box-shadow: inset 0 0 0 4px rgba(248, 202, 51, .5);\r\n  }\r\n\r\n  .healthNetworkBuilder__svg {\r\n    position: absolute;\r\n    inset: 0;\r\n    z-index: 1;\r\n    width: 100%;\r\n    height: 100%;\r\n    pointer-events: none;\r\n  }\r\n\r\n  .healthNetworkBuilder__edge,\r\n  .healthNetworkBuilder__previewEdge {\r\n    fill: none;\r\n    stroke-linecap: round;\r\n  }\r\n\r\n  .healthNetworkBuilder__edge {\r\n    stroke-width: 3;\r\n    cursor: pointer;\r\n    pointer-events: stroke;\r\n    transition: stroke-width .2s ease, filter .2s ease;\r\n  }\r\n\r\n  .healthNetworkBuilder__edge:hover {\r\n    stroke-width: 5;\r\n    filter: drop-shadow(0 0 4px rgba(41, 75, 143, .28));\r\n  }\r\n\r\n  .healthNetworkBuilder__edge.is-testing {\r\n    stroke: var(--hnb-yellow) !important;\r\n    stroke-width: 6;\r\n    stroke-dasharray: 12 8;\r\n    animation: healthNetworkBuilderFlow .7s linear infinite;\r\n    filter: drop-shadow(0 0 5px rgba(248, 202, 51, .7));\r\n  }\r\n\r\n  @keyframes healthNetworkBuilderFlow {\r\n    to { stroke-dashoffset: -20; }\r\n  }\r\n\r\n  .healthNetworkBuilder__previewEdge {\r\n    stroke: var(--hnb-yellow);\r\n    stroke-width: 4;\r\n    stroke-dasharray: 8 7;\r\n    opacity: 0;\r\n  }\r\n\r\n  .healthNetworkBuilder__packet {\r\n    fill: var(--hnb-yellow);\r\n    stroke: #ffffff;\r\n    stroke-width: 4;\r\n    opacity: 0;\r\n    filter: drop-shadow(0 2px 4px rgba(0, 0, 0, .25));\r\n  }\r\n\r\n  .healthNetworkBuilder__nodes {\r\n    position: absolute;\r\n    inset: 0;\r\n    z-index: 3;\r\n  }\r\n\r\n  .healthNetworkBuilder__node {\r\n    position: absolute;\r\n    display: flex;\r\n    width: 142px;\r\n    min-height: 84px;\r\n    padding: 10px 25px 10px 11px;\r\n    align-items: center;\r\n    gap: 9px;\r\n    border: 1px solid var(--hnb-border);\r\n    border-radius: 17px;\r\n    color: var(--hnb-blue-dark);\r\n    background: rgba(255, 255, 255, .98);\r\n    box-shadow: 0 10px 24px rgba(35, 55, 92, .12);\r\n    transform: translate(-50%, -50%);\r\n    user-select: none;\r\n  }\r\n\r\n  .healthNetworkBuilder__node:hover,\r\n  .healthNetworkBuilder__node:focus-visible,\r\n  .healthNetworkBuilder__node.is-selected {\r\n    border-color: var(--hnb-yellow);\r\n    outline: none;\r\n    box-shadow:\r\n      0 0 0 4px rgba(248, 202, 51, .18),\r\n      0 12px 28px rgba(35, 55, 92, .14);\r\n  }\r\n\r\n  .healthNetworkBuilder__node.is-drop-target {\r\n    border-color: var(--hnb-green);\r\n    background: #eef8f4;\r\n  }\r\n\r\n  .healthNetworkBuilder__node--central {\r\n    width: 172px;\r\n    min-height: 205px;\r\n    padding: 18px 22px;\r\n    flex-direction: column;\r\n    justify-content: center;\r\n    border-radius: 86px 86px 25px 25px;\r\n    color: var(--hnb-blue);\r\n  }\r\n\r\n  .healthNetworkBuilder__centralAvatar {\r\n    display: grid;\r\n    width: 78px;\r\n    aspect-ratio: 1;\r\n    place-items: center;\r\n    border-radius: 50%;\r\n    color: #ffffff;\r\n    background: var(--hnb-blue);\r\n    font-size: 27px;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .healthNetworkBuilder__node--central > strong {\r\n    margin-top: 7px;\r\n    color: var(--hnb-blue-dark);\r\n    font-size: 17px;\r\n    text-align: center;\r\n  }\r\n\r\n  .healthNetworkBuilder__node--central > small {\r\n    color: var(--hnb-muted);\r\n    text-align: center;\r\n  }\r\n\r\n  .healthNetworkBuilder__nodeIcon {\r\n    display: grid;\r\n    flex: 0 0 auto;\r\n    width: 37px;\r\n    aspect-ratio: 1;\r\n    place-items: center;\r\n    border-radius: 11px;\r\n    color: #111827;\r\n    background: var(--hnb-yellow);\r\n    font-size: 14px;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .healthNetworkBuilder__nodeText strong {\r\n    display: block;\r\n    font-size: 12px;\r\n    line-height: 1.15;\r\n  }\r\n\r\n  .healthNetworkBuilder__nodeText small {\r\n    display: block;\r\n    margin-top: 2px;\r\n    color: var(--hnb-muted);\r\n    font-size: 9px;\r\n    line-height: 1.2;\r\n  }\r\n\r\n  .healthNetworkBuilder__nodeMove,\r\n  .healthNetworkBuilder__nodeRemove {\r\n    position: absolute;\r\n    display: grid;\r\n    width: 20px;\r\n    aspect-ratio: 1;\r\n    place-items: center;\r\n    border: 0;\r\n    font-size: 11px;\r\n    cursor: pointer;\r\n  }\r\n\r\n  .healthNetworkBuilder__nodeMove {\r\n    top: 5px;\r\n    left: 5px;\r\n    border-radius: 7px;\r\n    color: var(--hnb-muted);\r\n    background: #eef2f7;\r\n    cursor: move;\r\n  }\r\n\r\n  .healthNetworkBuilder__nodeRemove {\r\n    top: 5px;\r\n    right: 5px;\r\n    border-radius: 50%;\r\n    color: #7a2e28;\r\n    background: #fff0ee;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .healthNetworkBuilder__nodePort {\r\n    position: absolute;\r\n    top: 50%;\r\n    right: -9px;\r\n    width: 18px;\r\n    aspect-ratio: 1;\r\n    border: 4px solid #ffffff;\r\n    border-radius: 50%;\r\n    background: var(--hnb-blue);\r\n    box-shadow: 0 2px 7px rgba(33, 59, 116, .3);\r\n    transform: translateY(-50%);\r\n    cursor: crosshair;\r\n  }\r\n\r\n  .healthNetworkBuilder__nodePort:hover {\r\n    background: var(--hnb-yellow);\r\n    transform: translateY(-50%) scale(1.16);\r\n  }\r\n\r\n  .healthNetworkBuilder__nodeTaskCount {\r\n    position: absolute;\r\n    right: 5px;\r\n    bottom: 5px;\r\n    display: grid;\r\n    min-width: 21px;\r\n    height: 21px;\r\n    padding: 0 5px;\r\n    place-items: center;\r\n    border: 2px solid #ffffff;\r\n    border-radius: 999px;\r\n    color: #ffffff;\r\n    background: var(--hnb-green);\r\n    font-size: 10px;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .healthNetworkBuilder__emptyHint {\r\n    position: absolute;\r\n    top: 22px;\r\n    left: 50%;\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 8px;\r\n    color: var(--hnb-muted);\r\n    transform: translateX(-50%);\r\n  }\r\n\r\n  .healthNetworkBuilder__emptyHint p {\r\n    margin: 0;\r\n    font-size: 11px;\r\n  }\r\n\r\n  .healthNetworkBuilder__testArea {\r\n    display: flex;\r\n    margin-top: 12px;\r\n    padding: 17px 19px;\r\n    align-items: center;\r\n    justify-content: space-between;\r\n    gap: 16px;\r\n    border: 1px solid rgba(41, 75, 143, .12);\r\n    border-radius: 18px;\r\n    background: #ffffff;\r\n  }\r\n\r\n  .healthNetworkBuilder__testArea h3 {\r\n    margin: 2px 0 3px;\r\n    color: var(--hnb-blue-dark);\r\n    font-size: 16px;\r\n  }\r\n\r\n  .healthNetworkBuilder__testArea p {\r\n    margin: 0;\r\n    color: var(--hnb-muted);\r\n    font-size: 11px;\r\n    line-height: 1.4;\r\n  }\r\n\r\n  .healthNetworkBuilder__routePicker {\r\n    margin-top: 9px;\r\n    max-width: 360px;\r\n  }\r\n\r\n  .healthNetworkBuilder__answerButton,\r\n  .healthNetworkBuilder__testButton {\r\n    display: inline-flex;\r\n    padding: 12px 16px;\r\n    align-items: center;\r\n    gap: 8px;\r\n    font-size: 13px;\r\n  }\r\n\r\n  .healthNetworkBuilder__testButton {\r\n    color: #111827;\r\n    border-color: var(--hnb-yellow);\r\n    background: var(--hnb-yellow);\r\n  }\r\n\r\n  .healthNetworkBuilder__testButton:hover,\r\n  .healthNetworkBuilder__testButton:focus-visible {\r\n    outline: none;\r\n    transform: translateY(-1px);\r\n    box-shadow: 0 9px 18px rgba(248, 202, 51, .27);\r\n  }\r\n\r\n  .healthNetworkBuilder__testButton:disabled {\r\n    opacity: .55;\r\n    cursor: wait;\r\n  }\r\n\r\n  .healthNetworkBuilder__testMessage {\r\n    margin-top: 10px;\r\n    padding: 13px 15px;\r\n    border-radius: 14px;\r\n    font-size: 12px;\r\n    font-weight: 800;\r\n  }\r\n\r\n  .healthNetworkBuilder__testMessage.is-success {\r\n    color: #0b4a35;\r\n    background: #e9f7f1;\r\n    border: 1px solid rgba(14, 74, 56, .22);\r\n  }\r\n\r\n  .healthNetworkBuilder__testMessage.is-error {\r\n    color: #7a2e28;\r\n    background: #fff0ee;\r\n    border: 1px solid rgba(182, 71, 59, .24);\r\n  }\r\n\r\n  .healthNetworkBuilder__metricTop {\r\n    display: flex;\r\n    margin-bottom: 6px;\r\n    justify-content: space-between;\r\n    color: var(--hnb-muted);\r\n    font-size: 11px;\r\n  }\r\n\r\n  .healthNetworkBuilder__metricTrack {\r\n    height: 8px;\r\n    overflow: hidden;\r\n    border-radius: 999px;\r\n    background: #edf1f6;\r\n  }\r\n\r\n  .healthNetworkBuilder__metricTrack i {\r\n    display: block;\r\n    width: 0;\r\n    height: 100%;\r\n    border-radius: inherit;\r\n    background: var(--hnb-red);\r\n    transition: width .35s ease, background .25s ease;\r\n  }\r\n\r\n  .healthNetworkBuilder__metric.is-mid i {\r\n    background: var(--hnb-yellow);\r\n  }\r\n\r\n  .healthNetworkBuilder__metric.is-high i {\r\n    background: var(--hnb-green);\r\n  }\r\n\r\n  .healthNetworkBuilder__metric.is-inverse.is-high i {\r\n    background: var(--hnb-red);\r\n  }\r\n\r\n  .healthNetworkBuilder__metric.is-inverse.is-low i {\r\n    background: var(--hnb-green);\r\n  }\r\n\r\n  .healthNetworkBuilder__score {\r\n    display: flex;\r\n    margin-top: 18px;\r\n    padding: 15px;\r\n    align-items: center;\r\n    flex-direction: column;\r\n    border-radius: 15px;\r\n    color: #ffffff;\r\n    background: var(--hnb-blue-dark);\r\n  }\r\n\r\n  .healthNetworkBuilder__score strong {\r\n    color: var(--hnb-yellow);\r\n    font-size: 28px;\r\n  }\r\n\r\n  .healthNetworkBuilder__inspectorPlaceholder {\r\n    padding: 16px 4px;\r\n    color: var(--hnb-muted);\r\n    text-align: center;\r\n  }\r\n\r\n  .healthNetworkBuilder__inspectorPlaceholder > span {\r\n    display: grid;\r\n    width: 52px;\r\n    aspect-ratio: 1;\r\n    margin: 0 auto 9px;\r\n    place-items: center;\r\n    border: 2px dashed #aebbd0;\r\n    border-radius: 50%;\r\n    color: var(--hnb-blue);\r\n  }\r\n\r\n  .healthNetworkBuilder__inspectorPlaceholder h3 {\r\n    margin: 0 0 5px;\r\n    color: var(--hnb-blue-dark);\r\n    font-size: 16px;\r\n  }\r\n\r\n  .healthNetworkBuilder__inspectorPlaceholder p,\r\n  .healthNetworkBuilder__inspectorDescription {\r\n    color: var(--hnb-muted);\r\n    font-size: 11px;\r\n    line-height: 1.45;\r\n  }\r\n\r\n  .healthNetworkBuilder__inspectorTop {\r\n    display: flex;\r\n    align-items: center;\r\n    gap: 11px;\r\n    margin-bottom: 12px;\r\n  }\r\n\r\n  .healthNetworkBuilder__inspectorIcon {\r\n    display: grid;\r\n    width: 42px;\r\n    aspect-ratio: 1;\r\n    place-items: center;\r\n    border-radius: 13px;\r\n    color: #111827;\r\n    background: var(--hnb-yellow);\r\n    font-weight: 900;\r\n  }\r\n\r\n  .healthNetworkBuilder__inspectorTop h3 {\r\n    margin: 1px 0 0;\r\n    color: var(--hnb-blue-dark);\r\n    font-size: 16px;\r\n  }\r\n\r\n  .healthNetworkBuilder__inspectorBlock {\r\n    margin-top: 12px;\r\n  }\r\n\r\n  .healthNetworkBuilder__inspectorConnections,\r\n  .healthNetworkBuilder__inspectorTasks {\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    gap: 6px;\r\n  }\r\n\r\n  .healthNetworkBuilder__miniTag {\r\n    padding: 6px 8px;\r\n    border: 1px solid var(--hnb-border);\r\n    border-radius: 999px;\r\n    color: var(--hnb-blue-dark);\r\n    background: #f5f8fc;\r\n    font-size: 9px;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .healthNetworkBuilder__miniTag--empty {\r\n    color: var(--hnb-muted);\r\n    font-weight: 700;\r\n  }\r\n\r\n  .healthNetworkBuilder__feedbackStatus {\r\n    margin-bottom: 12px;\r\n    padding: 12px;\r\n    border-radius: 13px;\r\n    font-size: 11px;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .healthNetworkBuilder__feedbackStatus.is-success {\r\n    color: #0b4a35;\r\n    background: #e9f7f1;\r\n  }\r\n\r\n  .healthNetworkBuilder__feedbackStatus.is-partial {\r\n    color: #6c4f09;\r\n    background: #fff8dc;\r\n  }\r\n\r\n  .healthNetworkBuilder__feedbackStatus.is-error {\r\n    color: #7a2e28;\r\n    background: #fff0ee;\r\n  }\r\n\r\n  .healthNetworkBuilder__feedbackColumns {\r\n    display: grid;\r\n    gap: 12px;\r\n  }\r\n\r\n  .healthNetworkBuilder__feedbackColumns ul {\r\n    margin: 0;\r\n    padding-left: 17px;\r\n    color: var(--hnb-muted);\r\n    font-size: 10px;\r\n    line-height: 1.5;\r\n  }\r\n\r\n  .healthNetworkBuilder__answerDialog,\r\n  .healthNetworkBuilder__connectionDialog {\r\n    position: fixed;\r\n    z-index: 999999;\r\n    inset: 0;\r\n    display: grid;\r\n    padding: 20px;\r\n    place-items: center;\r\n  }\r\n\r\n  .healthNetworkBuilder__answerDialog[hidden],\r\n  .healthNetworkBuilder__connectionDialog[hidden] {\r\n    display: none;\r\n  }\r\n\r\n  .healthNetworkBuilder__dialogBackdrop {\r\n    position: absolute;\r\n    inset: 0;\r\n    background: rgba(19, 31, 54, .60);\r\n    backdrop-filter: blur(4px);\r\n  }\r\n\r\n  .healthNetworkBuilder__answerCard,\r\n  .healthNetworkBuilder__connectionCard {\r\n    position: relative;\r\n    z-index: 1;\r\n    width: min(100%, 820px);\r\n    max-height: 88vh;\r\n    padding: 27px;\r\n    overflow-y: auto;\r\n    border-radius: 24px;\r\n    background: #ffffff;\r\n    box-shadow: 0 25px 75px rgba(15, 29, 52, .30);\r\n  }\r\n\r\n  .healthNetworkBuilder__connectionCard {\r\n    width: min(100%, 590px);\r\n  }\r\n\r\n  .healthNetworkBuilder__answerCard h3,\r\n  .healthNetworkBuilder__connectionCard h3 {\r\n    margin: 5px 0 8px;\r\n    color: var(--hnb-blue-dark);\r\n  }\r\n\r\n  .healthNetworkBuilder__answerIntro,\r\n  .healthNetworkBuilder__dialogRoute {\r\n    color: var(--hnb-muted);\r\n    font-size: 13px;\r\n    line-height: 1.5;\r\n  }\r\n\r\n  .healthNetworkBuilder__answerGrid {\r\n    display: grid;\r\n    grid-template-columns: .85fr 1.15fr;\r\n    gap: 14px;\r\n  }\r\n\r\n  .healthNetworkBuilder__answerGrid section {\r\n    padding: 16px;\r\n    border: 1px solid var(--hnb-border);\r\n    border-radius: 16px;\r\n    background: #f8fafc;\r\n  }\r\n\r\n  .healthNetworkBuilder__answerGrid section:last-child {\r\n    grid-column: 1 \/ -1;\r\n  }\r\n\r\n  .healthNetworkBuilder__answerActors {\r\n    display: flex;\r\n    flex-wrap: wrap;\r\n    gap: 7px;\r\n  }\r\n\r\n  .healthNetworkBuilder__answerActors span {\r\n    padding: 7px 9px;\r\n    border-radius: 999px;\r\n    color: var(--hnb-blue-dark);\r\n    background: #eaf0fa;\r\n    font-size: 10px;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .healthNetworkBuilder__answerConnections,\r\n  .healthNetworkBuilder__answerAssignments {\r\n    margin: 0;\r\n    padding-left: 19px;\r\n    color: #465268;\r\n    font-size: 11px;\r\n    line-height: 1.65;\r\n  }\r\n\r\n  .healthNetworkBuilder__answerNote {\r\n    margin-top: 14px;\r\n    padding: 15px 17px;\r\n    border-left: 5px solid var(--hnb-yellow);\r\n    border-radius: 0 15px 15px 0;\r\n    color: var(--hnb-blue-dark);\r\n    background: #fff9dd;\r\n  }\r\n\r\n  .healthNetworkBuilder__answerNote p {\r\n    margin: 4px 0 0;\r\n    font-size: 11px;\r\n  }\r\n\r\n  .healthNetworkBuilder__answerActions {\r\n    display: flex;\r\n    margin-top: 19px;\r\n    justify-content: flex-end;\r\n    gap: 9px;\r\n  }\r\n\r\n  .healthNetworkBuilder__answerClose,\r\n  .healthNetworkBuilder__answerApply {\r\n    padding: 11px 15px;\r\n    font-size: 12px;\r\n  }\r\n\r\n  .healthNetworkBuilder__answerApply {\r\n    border-color: var(--hnb-yellow);\r\n    color: #111827;\r\n    background: var(--hnb-yellow);\r\n  }\r\n\r\n  .healthNetworkBuilder__connectionTypes {\r\n    display: grid;\r\n    grid-template-columns: 1fr 1fr;\r\n    gap: 9px;\r\n  }\r\n\r\n  .healthNetworkBuilder__connectionTypes button {\r\n    display: grid;\r\n    grid-template-columns: 36px 1fr;\r\n    padding: 12px;\r\n    align-items: center;\r\n    column-gap: 10px;\r\n    border: 1px solid var(--hnb-border);\r\n    border-radius: 15px;\r\n    color: var(--hnb-blue-dark);\r\n    background: #ffffff;\r\n    text-align: left;\r\n    cursor: pointer;\r\n  }\r\n\r\n  .healthNetworkBuilder__connectionTypes button:hover,\r\n  .healthNetworkBuilder__connectionTypes button:focus-visible {\r\n    border-color: var(--hnb-yellow);\r\n    outline: none;\r\n    background: #fff9dc;\r\n  }\r\n\r\n  .healthNetworkBuilder__connectionTypes button > span {\r\n    display: grid;\r\n    grid-row: 1 \/ 3;\r\n    width: 36px;\r\n    aspect-ratio: 1;\r\n    place-items: center;\r\n    border-radius: 11px;\r\n    color: #ffffff;\r\n    font-weight: 900;\r\n  }\r\n\r\n  .healthNetworkBuilder__connectionTypes b {\r\n    font-size: 12px;\r\n  }\r\n\r\n  .healthNetworkBuilder__connectionTypes small {\r\n    color: var(--hnb-muted);\r\n    font-size: 9px;\r\n  }\r\n\r\n  .healthNetworkBuilder__dialogCancel {\r\n    display: block;\r\n    margin: 15px auto 0;\r\n    border: 0;\r\n    color: var(--hnb-muted);\r\n    background: transparent;\r\n    font-size: 11px;\r\n    font-weight: 900;\r\n    text-decoration: underline;\r\n    cursor: pointer;\r\n  }\r\n\r\n  @media (max-width: 1200px) {\r\n    .healthNetworkBuilder__workspace {\r\n      grid-template-columns: 230px minmax(480px, 1fr);\r\n    }\r\n\r\n    .healthNetworkBuilder__sidebar--right {\r\n      grid-column: 1 \/ -1;\r\n      display: grid;\r\n      grid-template-columns: repeat(3, minmax(0, 1fr));\r\n    }\r\n  }\r\n\r\n  @media (max-width: 850px) {\r\n    .healthNetworkBuilder {\r\n      padding: 28px 14px 38px;\r\n      border-radius: 22px;\r\n    }\r\n\r\n    .healthNetworkBuilder__headerRow,\r\n    .healthNetworkBuilder__canvasToolbar,\r\n    .healthNetworkBuilder__testArea {\r\n      align-items: stretch;\r\n      flex-direction: column;\r\n    }\r\n\r\n    .healthNetworkBuilder__scenarioPicker {\r\n      flex-basis: auto;\r\n      width: 100%;\r\n    }\r\n\r\n    .healthNetworkBuilder__steps {\r\n      grid-template-columns: 1fr 1fr;\r\n    }\r\n\r\n    .healthNetworkBuilder__workspace {\r\n      grid-template-columns: 1fr;\r\n    }\r\n\r\n    .healthNetworkBuilder__sidebar--left {\r\n      display: grid;\r\n      grid-template-columns: 1fr 1fr;\r\n    }\r\n\r\n    .healthNetworkBuilder__sidebar--right {\r\n      display: grid;\r\n      grid-template-columns: 1fr;\r\n    }\r\n  }\r\n\r\n  @media (max-width: 590px) {\r\n    .healthNetworkBuilder__sidebar--left,\r\n    .healthNetworkBuilder__answerGrid,\r\n    .healthNetworkBuilder__connectionTypes {\r\n      grid-template-columns: 1fr;\r\n    }\r\n\r\n    .healthNetworkBuilder__answerGrid section:last-child {\r\n      grid-column: auto;\r\n    }\r\n\r\n    .healthNetworkBuilder__toolbarButtons,\r\n    .healthNetworkBuilder__testActions,\r\n    .healthNetworkBuilder__answerActions {\r\n      display: grid;\r\n      grid-template-columns: 1fr;\r\n    }\r\n\r\n    .healthNetworkBuilder__answerButton,\r\n    .healthNetworkBuilder__testButton,\r\n    .healthNetworkBuilder__answerClose,\r\n    .healthNetworkBuilder__answerApply {\r\n      width: 100%;\r\n      justify-content: center;\r\n    }\r\n\r\n    .healthNetworkBuilder__canvas {\r\n      min-height: 580px;\r\n    }\r\n  }\r\n\r\n  @media (prefers-reduced-motion: reduce) {\r\n    .healthNetworkBuilder *,\r\n    .healthNetworkBuilder *::before,\r\n    .healthNetworkBuilder *::after {\r\n      animation-duration: .01ms !important;\r\n      transition-duration: .01ms !important;\r\n    }\r\n  }\r\n<\/style>\r\n\r\n<script>\r\n(() => {\r\n  \/*\r\n    ================================================================\r\n    OBJETOS DE EXEMPLO\r\n    ================================================================\r\n\r\n    A interface e a l\u00f3gica abaixo s\u00e3o gen\u00e9ricas. Para criar uma nova\r\n    atividade, duplique um dos cen\u00e1rios e altere apenas este objeto.\r\n\r\n    Condi\u00e7\u00f5es dispon\u00edveis nas regras:\r\n    - { type: \"actor\", actorId: \"...\" }\r\n    - { type: \"connection\", from: \"...\", to: \"...\", allowedTypes: [...] }\r\n    - { type: \"assignment\", taskId: \"...\", nodeIds: [...], mode: \"any\" | \"all\" }\r\n  *\/\r\n\r\n  const CARE_NETWORK_SCENARIOS = {\r\n    apsCare: {\r\n      label: \"Cuidado coordenado na APS\",\r\n      title: \"Constru\u00e7\u00e3o de uma teia de cuidado coordenado pela APS\",\r\n      intro:\r\n        \"Organize atores, responsabilidades e fluxos de informa\u00e7\u00e3o para que a pessoa seja acompanhada de forma cont\u00ednua, com participa\u00e7\u00e3o ativa e retorno das informa\u00e7\u00f5es \u00e0 equipe de refer\u00eancia.\",\r\n\r\n      centralNode: {\r\n        id: \"person\",\r\n        title: \"Pessoa\",\r\n        short: \"Pessoa\",\r\n        icon: \"\u25cf\",\r\n        subtitle: \"centro do cuidado\",\r\n        description:\r\n          \"Participa das decis\u00f5es, expressa prioridades e ajuda a construir um plano compat\u00edvel com sua vida.\"\r\n      },\r\n\r\n      actors: [\r\n        {\r\n          id: \"aps\",\r\n          title: \"Equipe de APS\",\r\n          short: \"APS\",\r\n          icon: \"\uff0b\",\r\n          description:\r\n            \"\u00c9 a refer\u00eancia longitudinal que integra informa\u00e7\u00f5es, acompanha encaminhamentos e mant\u00e9m o v\u00ednculo ao longo do tempo.\",\r\n          defaultX: 27,\r\n          defaultY: 34\r\n        },\r\n        {\r\n          id: \"specialty\",\r\n          title: \"Aten\u00e7\u00e3o especializada\",\r\n          short: \"Especializada\",\r\n          icon: \"\u271a\",\r\n          description:\r\n            \"Complementa o cuidado com saberes e tecnologias espec\u00edficas e precisa devolver informa\u00e7\u00f5es \u00e0 equipe de refer\u00eancia.\",\r\n          defaultX: 76,\r\n          defaultY: 28\r\n        },\r\n        {\r\n          id: \"hospital\",\r\n          title: \"Hospital e urg\u00eancia\",\r\n          short: \"Hospital\",\r\n          icon: \"H\",\r\n          description:\r\n            \"Atua em situa\u00e7\u00f5es agudas ou graves e deve comunicar condutas e necessidades ap\u00f3s a alta.\",\r\n          defaultX: 79,\r\n          defaultY: 72\r\n        },\r\n        {\r\n          id: \"family\",\r\n          title: \"Fam\u00edlia e rede de apoio\",\r\n          short: \"Fam\u00edlia\",\r\n          icon: \"\u2302\",\r\n          description:\r\n            \"Apoia decis\u00f5es, organiza\u00e7\u00e3o da rotina e viabilidade do plano de cuidado.\",\r\n          defaultX: 24,\r\n          defaultY: 76\r\n        },\r\n        {\r\n          id: \"social\",\r\n          title: \"Assist\u00eancia social\",\r\n          short: \"Assist\u00eancia social\",\r\n          icon: \"\u25c7\",\r\n          description:\r\n            \"Articula prote\u00e7\u00e3o social diante de vulnerabilidades e barreiras que n\u00e3o podem ser respondidas apenas pela sa\u00fade.\",\r\n          defaultX: 16,\r\n          defaultY: 18\r\n        },\r\n        {\r\n          id: \"territory\",\r\n          title: \"Territ\u00f3rio e comunidade\",\r\n          short: \"Territ\u00f3rio\",\r\n          icon: \"\u2316\",\r\n          description:\r\n            \"Re\u00fane recursos, condi\u00e7\u00f5es de vida, mobilidade e rela\u00e7\u00f5es locais que interferem nas possibilidades de cuidado.\",\r\n          defaultX: 84,\r\n          defaultY: 50\r\n        }\r\n      ],\r\n\r\n      connectionTypes: [\r\n        {\r\n          id: \"referral\",\r\n          label: \"Encaminha\",\r\n          verb: \"encaminha\",\r\n          icon: \"\u2192\",\r\n          description:\r\n            \"Envia a pessoa ou demanda para outro ponto da rede.\",\r\n          color: \"#294b8f\",\r\n          dash: \"\"\r\n        },\r\n        {\r\n          id: \"information\",\r\n          label: \"Compartilha informa\u00e7\u00e3o\",\r\n          verb: \"compartilha informa\u00e7\u00e3o\",\r\n          icon: \"\u21c4\",\r\n          description:\r\n            \"Envia resultados, condutas ou dados necess\u00e1rios \u00e0 continuidade.\",\r\n          color: \"#6878b7\",\r\n          dash: \"9 7\"\r\n        },\r\n        {\r\n          id: \"followup\",\r\n          label: \"Acompanha\",\r\n          verb: \"acompanha\",\r\n          icon: \"\u2713\",\r\n          description:\r\n            \"Monitora se uma a\u00e7\u00e3o, transi\u00e7\u00e3o ou retorno foi realizado.\",\r\n          color: \"#0e4a38\",\r\n          dash: \"\"\r\n        },\r\n        {\r\n          id: \"support\",\r\n          label: \"Oferece apoio\",\r\n          verb: \"oferece apoio\",\r\n          icon: \"\u25c7\",\r\n          description:\r\n            \"Contribui para tornar o plano poss\u00edvel no cotidiano.\",\r\n          color: \"#cf772b\",\r\n          dash: \"4 6\"\r\n        }\r\n      ],\r\n\r\n      tasks: [\r\n        {\r\n          id: \"review-meds\",\r\n          title: \"Revisar medicamentos\",\r\n          icon: \"Rx\",\r\n          description:\r\n            \"Conferir prescri\u00e7\u00f5es, mudan\u00e7as, ades\u00e3o e poss\u00edveis riscos.\",\r\n          maxAssignees: 2\r\n        },\r\n        {\r\n          id: \"follow-referral\",\r\n          title: \"Acompanhar encaminhamento\",\r\n          icon: \"\u2197\",\r\n          description:\r\n            \"Verificar acesso ao servi\u00e7o, atendimento e retorno das informa\u00e7\u00f5es.\",\r\n          maxAssignees: 2\r\n        },\r\n        {\r\n          id: \"share-result\",\r\n          title: \"Compartilhar resultado\",\r\n          icon: \"\u21c4\",\r\n          description:\r\n            \"Enviar resultado, recomenda\u00e7\u00e3o ou conduta a quem continuar\u00e1 o cuidado.\",\r\n          maxAssignees: 2\r\n        },\r\n        {\r\n          id: \"support-access\",\r\n          title: \"Apoiar transporte e acesso\",\r\n          icon: \"\u2316\",\r\n          description:\r\n            \"Reduzir barreiras concretas para chegar e permanecer no cuidado.\",\r\n          maxAssignees: 3\r\n        },\r\n        {\r\n          id: \"agree-plan\",\r\n          title: \"Pactuar plano de cuidado\",\r\n          icon: \"\u2713\",\r\n          description:\r\n            \"Definir objetivos e a\u00e7\u00f5es com participa\u00e7\u00e3o da pessoa.\",\r\n          maxAssignees: 2\r\n        }\r\n      ],\r\n\r\n      routes: [\r\n        {\r\n          id: \"coordinated-care\",\r\n          title: \"Teste do percurso coordenado\",\r\n          description:\r\n            \"O fluxo esperado \u00e9 Pessoa \u2192 APS \u2192 Aten\u00e7\u00e3o especializada \u2192 APS \u2192 Pessoa.\",\r\n          successMessage:\r\n            \"A pessoa chegou \u00e0 aten\u00e7\u00e3o especializada, a informa\u00e7\u00e3o retornou \u00e0 APS e o acompanhamento voltou \u00e0 pessoa.\",\r\n          steps: [\r\n            {\r\n              from: \"person\",\r\n              to: \"aps\",\r\n              allowedTypes: [\"information\", \"followup\", \"support\"],\r\n              missingText:\r\n                \"A pessoa ainda n\u00e3o possui uma conex\u00e3o definida com a equipe de APS.\"\r\n            },\r\n            {\r\n              from: \"aps\",\r\n              to: \"specialty\",\r\n              allowedTypes: [\"referral\", \"followup\"],\r\n              missingText:\r\n                \"A APS n\u00e3o possui um fluxo de encaminhamento para a aten\u00e7\u00e3o especializada.\"\r\n            },\r\n            {\r\n              from: \"specialty\",\r\n              to: \"aps\",\r\n              allowedTypes: [\"information\", \"followup\"],\r\n              missingText:\r\n                \"A aten\u00e7\u00e3o especializada n\u00e3o devolve informa\u00e7\u00f5es \u00e0 equipe de refer\u00eancia.\"\r\n            },\r\n            {\r\n              from: \"aps\",\r\n              to: \"person\",\r\n              allowedTypes: [\"information\", \"followup\", \"support\"],\r\n              missingText:\r\n                \"N\u00e3o h\u00e1 previs\u00e3o de acompanhamento e retorno da APS para a pessoa.\"\r\n            }\r\n          ]\r\n        }\r\n      ],\r\n\r\n      metrics: [\r\n        {\r\n          id: \"continuity\",\r\n          label: \"Continuidade do cuidado\"\r\n        },\r\n        {\r\n          id: \"information\",\r\n          label: \"Informa\u00e7\u00e3o compartilhada\"\r\n        },\r\n        {\r\n          id: \"participation\",\r\n          label: \"Participa\u00e7\u00e3o da pessoa\"\r\n        },\r\n        {\r\n          id: \"overload\",\r\n          label: \"Sobrecarga da APS\",\r\n          inverse: true\r\n        }\r\n      ],\r\n\r\n      metricRules: [\r\n        {\r\n          metric: \"continuity\",\r\n          points: 20,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"person\",\r\n            to: \"aps\",\r\n            allowedTypes: [\"information\", \"followup\", \"support\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"continuity\",\r\n          points: 30,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"aps\",\r\n            to: \"specialty\",\r\n            allowedTypes: [\"referral\", \"followup\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"continuity\",\r\n          points: 30,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"specialty\",\r\n            to: \"aps\",\r\n            allowedTypes: [\"information\", \"followup\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"continuity\",\r\n          points: 20,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"aps\",\r\n            to: \"person\",\r\n            allowedTypes: [\"information\", \"followup\", \"support\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"information\",\r\n          points: 35,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"specialty\",\r\n            to: \"aps\",\r\n            allowedTypes: [\"information\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"information\",\r\n          points: 25,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"hospital\",\r\n            to: \"aps\",\r\n            allowedTypes: [\"information\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"information\",\r\n          points: 20,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"aps\",\r\n            to: \"person\",\r\n            allowedTypes: [\"information\", \"followup\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"information\",\r\n          points: 20,\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"share-result\",\r\n            nodeIds: [\"specialty\", \"hospital\"],\r\n            mode: \"any\"\r\n          }\r\n        },\r\n        {\r\n          metric: \"participation\",\r\n          points: 35,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"person\",\r\n            to: \"aps\",\r\n            allowedTypes: [\"information\", \"followup\", \"support\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"participation\",\r\n          points: 35,\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"agree-plan\",\r\n            nodeIds: [\"person\", \"aps\"],\r\n            mode: \"all\"\r\n          }\r\n        },\r\n        {\r\n          metric: \"participation\",\r\n          points: 30,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"family\",\r\n            to: \"person\",\r\n            allowedTypes: [\"support\"]\r\n          }\r\n        }\r\n      ],\r\n\r\n      overload: {\r\n        metricId: \"overload\",\r\n        actorId: \"aps\",\r\n        freeAssignments: 2,\r\n        assignmentPenalty: 28,\r\n        freeConnections: 6,\r\n        connectionPenalty: 12\r\n      },\r\n\r\n      feedback: [\r\n        {\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"aps\",\r\n            to: \"specialty\",\r\n            allowedTypes: [\"referral\", \"followup\"]\r\n          },\r\n          success:\r\n            \"O encaminhamento para a aten\u00e7\u00e3o especializada foi previsto.\",\r\n          failure:\r\n            \"Falta uma conex\u00e3o de encaminhamento ou acompanhamento entre APS e aten\u00e7\u00e3o especializada.\"\r\n        },\r\n        {\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"specialty\",\r\n            to: \"aps\",\r\n            allowedTypes: [\"information\", \"followup\"]\r\n          },\r\n          success:\r\n            \"H\u00e1 previs\u00e3o de retorno da informa\u00e7\u00e3o especializada.\",\r\n          failure:\r\n            \"A contrarrefer\u00eancia da aten\u00e7\u00e3o especializada para a APS n\u00e3o est\u00e1 garantida.\"\r\n        },\r\n        {\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"share-result\",\r\n            nodeIds: [\"specialty\", \"hospital\"],\r\n            mode: \"any\"\r\n          },\r\n          success:\r\n            \"O compartilhamento do resultado possui respons\u00e1vel adequado.\",\r\n          failure:\r\n            \"A a\u00e7\u00e3o \u201cCompartilhar resultado\u201d ainda n\u00e3o possui respons\u00e1vel adequado.\"\r\n        },\r\n        {\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"agree-plan\",\r\n            nodeIds: [\"person\", \"aps\"],\r\n            mode: \"all\"\r\n          },\r\n          success:\r\n            \"Pessoa e APS participam da pactua\u00e7\u00e3o do plano de cuidado.\",\r\n          failure:\r\n            \"O plano de cuidado ainda n\u00e3o foi atribu\u00eddo de forma compartilhada \u00e0 pessoa e \u00e0 APS.\"\r\n        },\r\n        {\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"support-access\",\r\n            nodeIds: [\"social\", \"family\", \"territory\"],\r\n            mode: \"any\"\r\n          },\r\n          success:\r\n            \"A rede prev\u00ea apoio para barreiras de acesso.\",\r\n          failure:\r\n            \"Ainda n\u00e3o h\u00e1 respons\u00e1vel por apoiar transporte e acesso.\"\r\n        }\r\n      ],\r\n\r\n      answer: {\r\n        title: \"Rede de refer\u00eancia para o cuidado coordenado na APS\",\r\n        intro:\r\n          \"Este gabarito organiza v\u00ednculo, encaminhamento, contrarrefer\u00eancia, participa\u00e7\u00e3o da pessoa e apoio territorial.\",\r\n        actors: [\r\n          \"aps\",\r\n          \"specialty\",\r\n          \"hospital\",\r\n          \"family\",\r\n          \"social\",\r\n          \"territory\"\r\n        ],\r\n        connections: [\r\n          {\r\n            from: \"person\",\r\n            to: \"aps\",\r\n            type: \"information\"\r\n          },\r\n          {\r\n            from: \"aps\",\r\n            to: \"specialty\",\r\n            type: \"referral\"\r\n          },\r\n          {\r\n            from: \"specialty\",\r\n            to: \"aps\",\r\n            type: \"information\"\r\n          },\r\n          {\r\n            from: \"aps\",\r\n            to: \"person\",\r\n            type: \"followup\"\r\n          },\r\n          {\r\n            from: \"hospital\",\r\n            to: \"aps\",\r\n            type: \"information\"\r\n          },\r\n          {\r\n            from: \"family\",\r\n            to: \"person\",\r\n            type: \"support\"\r\n          },\r\n          {\r\n            from: \"social\",\r\n            to: \"person\",\r\n            type: \"support\"\r\n          },\r\n          {\r\n            from: \"territory\",\r\n            to: \"aps\",\r\n            type: \"support\"\r\n          }\r\n        ],\r\n        assignments: {\r\n          \"review-meds\": [\"aps\"],\r\n          \"follow-referral\": [\"aps\"],\r\n          \"share-result\": [\"specialty\"],\r\n          \"support-access\": [\"social\"],\r\n          \"agree-plan\": [\"person\", \"aps\"]\r\n        },\r\n        explanation:\r\n          \"O encaminhamento possui ida e retorno, a pessoa participa do plano, o compartilhamento de informa\u00e7\u00f5es tem respons\u00e1veis definidos e o territ\u00f3rio apoia a continuidade do cuidado.\"\r\n      }\r\n    },\r\n\r\n    hospitalDischarge: {\r\n      label: \"Alta hospitalar segura\",\r\n      title: \"Transi\u00e7\u00e3o segura ap\u00f3s a alta hospitalar\",\r\n      intro:\r\n        \"Organize atores, fluxos de informa\u00e7\u00e3o e responsabilidades para que a pessoa deixe o hospital com continuidade e acompanhamento garantidos.\",\r\n\r\n      centralNode: {\r\n        id: \"person\",\r\n        title: \"Pessoa\",\r\n        short: \"Pessoa\",\r\n        icon: \"\u25cf\",\r\n        subtitle: \"ap\u00f3s a alta\",\r\n        description:\r\n          \"Participa das decis\u00f5es, recebe orienta\u00e7\u00f5es e precisa saber quem procurar diante de d\u00favidas ou sinais de alerta.\"\r\n      },\r\n\r\n      actors: [\r\n        {\r\n          id: \"hospital\",\r\n          title: \"Hospital\",\r\n          short: \"Hospital\",\r\n          icon: \"H\",\r\n          description: \"Organiza a alta e comunica mudan\u00e7as cl\u00ednicas e terap\u00eauticas.\",\r\n          defaultX: 22,\r\n          defaultY: 28\r\n        },\r\n        {\r\n          id: \"aps\",\r\n          title: \"Equipe de APS\",\r\n          short: \"APS\",\r\n          icon: \"\uff0b\",\r\n          description: \"Retoma o acompanhamento longitudinal ap\u00f3s a alta.\",\r\n          defaultX: 72,\r\n          defaultY: 32\r\n        },\r\n        {\r\n          id: \"family\",\r\n          title: \"Fam\u00edlia e cuidador\",\r\n          short: \"Fam\u00edlia\",\r\n          icon: \"\u2302\",\r\n          description: \"Apoia a rotina, observa mudan\u00e7as e ajuda a viabilizar o plano.\",\r\n          defaultX: 25,\r\n          defaultY: 76\r\n        },\r\n        {\r\n          id: \"pharmacy\",\r\n          title: \"Farm\u00e1cia\",\r\n          short: \"Farm\u00e1cia\",\r\n          icon: \"Rx\",\r\n          description: \"Apoia reconcilia\u00e7\u00e3o, acesso e uso seguro de medicamentos.\",\r\n          defaultX: 78,\r\n          defaultY: 74\r\n        },\r\n        {\r\n          id: \"homecare\",\r\n          title: \"Aten\u00e7\u00e3o domiciliar\",\r\n          short: \"Aten\u00e7\u00e3o domiciliar\",\r\n          icon: \"\u2302+\",\r\n          description: \"Realiza acompanhamento no domic\u00edlio quando necess\u00e1rio.\",\r\n          defaultX: 50,\r\n          defaultY: 15\r\n        }\r\n      ],\r\n\r\n      connectionTypes: [\r\n        {\r\n          id: \"information\",\r\n          label: \"Compartilha informa\u00e7\u00e3o\",\r\n          verb: \"compartilha informa\u00e7\u00e3o\",\r\n          icon: \"\u21c4\",\r\n          description: \"Envia resumo, resultado ou mudan\u00e7a relevante.\",\r\n          color: \"#6878b7\",\r\n          dash: \"9 7\"\r\n        },\r\n        {\r\n          id: \"followup\",\r\n          label: \"Acompanha\",\r\n          verb: \"acompanha\",\r\n          icon: \"\u2713\",\r\n          description: \"Monitora retorno, evolu\u00e7\u00e3o ou cumprimento do plano.\",\r\n          color: \"#0e4a38\",\r\n          dash: \"\"\r\n        },\r\n        {\r\n          id: \"support\",\r\n          label: \"Oferece apoio\",\r\n          verb: \"oferece apoio\",\r\n          icon: \"\u25c7\",\r\n          description: \"Ajuda a tornar o plano poss\u00edvel.\",\r\n          color: \"#cf772b\",\r\n          dash: \"4 6\"\r\n        }\r\n      ],\r\n\r\n      tasks: [\r\n        {\r\n          id: \"discharge-summary\",\r\n          title: \"Emitir resumo de alta\",\r\n          icon: \"\u25a4\",\r\n          description: \"Registrar diagn\u00f3sticos, mudan\u00e7as e orienta\u00e7\u00f5es.\",\r\n          maxAssignees: 1\r\n        },\r\n        {\r\n          id: \"review-meds\",\r\n          title: \"Revisar medicamentos\",\r\n          icon: \"Rx\",\r\n          description: \"Conferir mudan\u00e7as, duplicidades e riscos.\",\r\n          maxAssignees: 2\r\n        },\r\n        {\r\n          id: \"schedule-return\",\r\n          title: \"Programar retorno\",\r\n          icon: \"\u21bb\",\r\n          description: \"Definir quando e com quem ocorrer\u00e1 o seguimento.\",\r\n          maxAssignees: 1\r\n        },\r\n        {\r\n          id: \"warning-signs\",\r\n          title: \"Orientar sinais de alerta\",\r\n          icon: \"!\",\r\n          description: \"Explicar quando e onde buscar ajuda.\",\r\n          maxAssignees: 2\r\n        }\r\n      ],\r\n\r\n      routes: [\r\n        {\r\n          id: \"safe-discharge\",\r\n          title: \"Teste da transi\u00e7\u00e3o p\u00f3s-alta\",\r\n          description:\r\n            \"O fluxo esperado \u00e9 Hospital \u2192 APS \u2192 Pessoa \u2192 APS.\",\r\n          successMessage:\r\n            \"A alta foi comunicada, a pessoa recebeu acompanhamento e conseguiu retornar \u00e0 equipe de refer\u00eancia.\",\r\n          steps: [\r\n            {\r\n              from: \"hospital\",\r\n              to: \"aps\",\r\n              allowedTypes: [\"information\"],\r\n              missingText: \"O resumo da alta n\u00e3o chegou \u00e0 APS.\"\r\n            },\r\n            {\r\n              from: \"aps\",\r\n              to: \"person\",\r\n              allowedTypes: [\"followup\", \"information\"],\r\n              missingText: \"A equipe n\u00e3o realizou contato ou orienta\u00e7\u00e3o ap\u00f3s a alta.\"\r\n            },\r\n            {\r\n              from: \"person\",\r\n              to: \"aps\",\r\n              allowedTypes: [\"information\", \"followup\"],\r\n              missingText: \"N\u00e3o h\u00e1 um canal previsto para a pessoa retornar \u00e0 APS.\"\r\n            }\r\n          ]\r\n        }\r\n      ],\r\n\r\n      metrics: [\r\n        { id: \"continuity\", label: \"Continuidade\" },\r\n        { id: \"information\", label: \"Informa\u00e7\u00e3o compartilhada\" },\r\n        { id: \"participation\", label: \"Participa\u00e7\u00e3o da pessoa\" },\r\n        { id: \"overload\", label: \"Sobrecarga da APS\", inverse: true }\r\n      ],\r\n\r\n      metricRules: [\r\n        {\r\n          metric: \"continuity\",\r\n          points: 35,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"hospital\",\r\n            to: \"aps\",\r\n            allowedTypes: [\"information\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"continuity\",\r\n          points: 35,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"aps\",\r\n            to: \"person\",\r\n            allowedTypes: [\"followup\", \"information\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"continuity\",\r\n          points: 30,\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"schedule-return\",\r\n            nodeIds: [\"aps\"],\r\n            mode: \"any\"\r\n          }\r\n        },\r\n        {\r\n          metric: \"information\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"hospital\",\r\n            to: \"aps\",\r\n            allowedTypes: [\"information\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"information\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"discharge-summary\",\r\n            nodeIds: [\"hospital\"],\r\n            mode: \"any\"\r\n          }\r\n        },\r\n        {\r\n          metric: \"participation\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"aps\",\r\n            to: \"person\",\r\n            allowedTypes: [\"followup\", \"information\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"participation\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"warning-signs\",\r\n            nodeIds: [\"hospital\", \"aps\", \"person\"],\r\n            mode: \"any\"\r\n          }\r\n        }\r\n      ],\r\n\r\n      overload: {\r\n        metricId: \"overload\",\r\n        actorId: \"aps\",\r\n        freeAssignments: 2,\r\n        assignmentPenalty: 30,\r\n        freeConnections: 5,\r\n        connectionPenalty: 15\r\n      },\r\n\r\n      feedback: [\r\n        {\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"hospital\",\r\n            to: \"aps\",\r\n            allowedTypes: [\"information\"]\r\n          },\r\n          success: \"O hospital devolve informa\u00e7\u00f5es \u00e0 APS.\",\r\n          failure: \"A APS n\u00e3o recebe informa\u00e7\u00f5es da alta.\"\r\n        },\r\n        {\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"review-meds\",\r\n            nodeIds: [\"aps\", \"pharmacy\"],\r\n            mode: \"any\"\r\n          },\r\n          success: \"A revis\u00e3o dos medicamentos possui respons\u00e1vel.\",\r\n          failure: \"Ningu\u00e9m ficou respons\u00e1vel por revisar os medicamentos.\"\r\n        },\r\n        {\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"schedule-return\",\r\n            nodeIds: [\"aps\"],\r\n            mode: \"any\"\r\n          },\r\n          success: \"O retorno foi programado.\",\r\n          failure: \"O retorno ap\u00f3s a alta ainda n\u00e3o foi organizado.\"\r\n        }\r\n      ],\r\n\r\n      answer: {\r\n        title: \"Rede de refer\u00eancia para uma alta segura\",\r\n        intro:\r\n          \"Este gabarito organiza comunica\u00e7\u00e3o, retorno e responsabilidades essenciais.\",\r\n        actors: [\"hospital\", \"aps\", \"family\", \"pharmacy\", \"homecare\"],\r\n        connections: [\r\n          { from: \"hospital\", to: \"aps\", type: \"information\" },\r\n          { from: \"aps\", to: \"person\", type: \"followup\" },\r\n          { from: \"person\", to: \"aps\", type: \"information\" },\r\n          { from: \"family\", to: \"person\", type: \"support\" },\r\n          { from: \"pharmacy\", to: \"aps\", type: \"information\" }\r\n        ],\r\n        assignments: {\r\n          \"discharge-summary\": [\"hospital\"],\r\n          \"review-meds\": [\"aps\", \"pharmacy\"],\r\n          \"schedule-return\": [\"aps\"],\r\n          \"warning-signs\": [\"hospital\", \"aps\"]\r\n        },\r\n        explanation:\r\n          \"A informa\u00e7\u00e3o da alta retorna \u00e0 equipe de refer\u00eancia, o seguimento \u00e9 programado e a pessoa sabe como voltar ao cuidado.\"\r\n      }\r\n    },\r\n\r\n    psychosocialCare: {\r\n      label: \"Rede de Aten\u00e7\u00e3o Psicossocial\",\r\n      title: \"Articula\u00e7\u00e3o de uma rede de aten\u00e7\u00e3o psicossocial\",\r\n      intro:\r\n        \"Construa uma rede que combine v\u00ednculo territorial, cuidado especializado, manejo de crise e participa\u00e7\u00e3o da pessoa.\",\r\n\r\n      centralNode: {\r\n        id: \"person\",\r\n        title: \"Pessoa\",\r\n        short: \"Pessoa\",\r\n        icon: \"\u25cf\",\r\n        subtitle: \"protagonista do cuidado\",\r\n        description:\r\n          \"Expressa necessidades e prefer\u00eancias e participa da constru\u00e7\u00e3o do projeto terap\u00eautico.\"\r\n      },\r\n\r\n      actors: [\r\n        {\r\n          id: \"aps\",\r\n          title: \"Equipe de APS\",\r\n          short: \"APS\",\r\n          icon: \"\uff0b\",\r\n          description: \"Mant\u00e9m v\u00ednculo territorial e acompanha necessidades gerais de sa\u00fade.\",\r\n          defaultX: 23,\r\n          defaultY: 32\r\n        },\r\n        {\r\n          id: \"caps\",\r\n          title: \"CAPS\",\r\n          short: \"CAPS\",\r\n          icon: \"C\",\r\n          description: \"Oferece cuidado especializado e coordena estrat\u00e9gias de aten\u00e7\u00e3o psicossocial.\",\r\n          defaultX: 76,\r\n          defaultY: 30\r\n        },\r\n        {\r\n          id: \"urgency\",\r\n          title: \"Urg\u00eancia\",\r\n          short: \"Urg\u00eancia\",\r\n          icon: \"!\",\r\n          description: \"Responde a situa\u00e7\u00f5es agudas e precisa reconectar a pessoa ao seguimento.\",\r\n          defaultX: 80,\r\n          defaultY: 72\r\n        },\r\n        {\r\n          id: \"family\",\r\n          title: \"Fam\u00edlia e rede de apoio\",\r\n          short: \"Fam\u00edlia\",\r\n          icon: \"\u2302\",\r\n          description: \"Pode apoiar o cotidiano, reconhecer sinais e participar do plano.\",\r\n          defaultX: 24,\r\n          defaultY: 75\r\n        },\r\n        {\r\n          id: \"social\",\r\n          title: \"Assist\u00eancia social\",\r\n          short: \"Assist\u00eancia social\",\r\n          icon: \"\u25c7\",\r\n          description: \"Articula prote\u00e7\u00e3o social, direitos e respostas intersetoriais.\",\r\n          defaultX: 50,\r\n          defaultY: 14\r\n        },\r\n        {\r\n          id: \"community\",\r\n          title: \"Recursos comunit\u00e1rios\",\r\n          short: \"Comunidade\",\r\n          icon: \"\u25ce\",\r\n          description: \"Apoiam conviv\u00eancia, participa\u00e7\u00e3o social e reconstru\u00e7\u00e3o de v\u00ednculos.\",\r\n          defaultX: 50,\r\n          defaultY: 88\r\n        }\r\n      ],\r\n\r\n      connectionTypes: [\r\n        {\r\n          id: \"reference\",\r\n          label: \"Compartilha o cuidado\",\r\n          verb: \"compartilha o cuidado\",\r\n          icon: \"\u21c4\",\r\n          description: \"Mant\u00e9m comunica\u00e7\u00e3o e corresponsabilidade.\",\r\n          color: \"#294b8f\",\r\n          dash: \"\"\r\n        },\r\n        {\r\n          id: \"crisis\",\r\n          label: \"Aciona em crise\",\r\n          verb: \"aciona em crise\",\r\n          icon: \"!\",\r\n          description: \"Organiza resposta para situa\u00e7\u00e3o aguda.\",\r\n          color: \"#b6473b\",\r\n          dash: \"9 7\"\r\n        },\r\n        {\r\n          id: \"support\",\r\n          label: \"Oferece apoio\",\r\n          verb: \"oferece apoio\",\r\n          icon: \"\u25c7\",\r\n          description: \"Sustenta vida cotidiana, autonomia e participa\u00e7\u00e3o.\",\r\n          color: \"#cf772b\",\r\n          dash: \"4 6\"\r\n        }\r\n      ],\r\n\r\n      tasks: [\r\n        {\r\n          id: \"therapeutic-project\",\r\n          title: \"Construir projeto terap\u00eautico\",\r\n          icon: \"\u25a4\",\r\n          description: \"Pactuar objetivos e a\u00e7\u00f5es com a pessoa.\",\r\n          maxAssignees: 2\r\n        },\r\n        {\r\n          id: \"crisis-plan\",\r\n          title: \"Definir plano de crise\",\r\n          icon: \"!\",\r\n          description: \"Prever sinais, contatos e respostas.\",\r\n          maxAssignees: 2\r\n        },\r\n        {\r\n          id: \"family-support\",\r\n          title: \"Apoiar fam\u00edlia\",\r\n          icon: \"\u2302\",\r\n          description: \"Oferecer orienta\u00e7\u00e3o e suporte sem retirar autonomia.\",\r\n          maxAssignees: 2\r\n        },\r\n        {\r\n          id: \"social-inclusion\",\r\n          title: \"Apoiar inclus\u00e3o social\",\r\n          icon: \"\u25ce\",\r\n          description: \"Articular trabalho, conviv\u00eancia e participa\u00e7\u00e3o.\",\r\n          maxAssignees: 2\r\n        }\r\n      ],\r\n\r\n      routes: [\r\n        {\r\n          id: \"routine-care\",\r\n          title: \"Teste do cuidado compartilhado\",\r\n          description:\r\n            \"O fluxo esperado \u00e9 Pessoa \u2192 APS \u2192 CAPS \u2192 APS \u2192 Pessoa.\",\r\n          successMessage:\r\n            \"O cuidado especializado permanece conectado ao acompanhamento territorial.\",\r\n          steps: [\r\n            {\r\n              from: \"person\",\r\n              to: \"aps\",\r\n              allowedTypes: [\"reference\", \"support\"],\r\n              missingText: \"A pessoa n\u00e3o possui um primeiro v\u00ednculo territorial definido.\"\r\n            },\r\n            {\r\n              from: \"aps\",\r\n              to: \"caps\",\r\n              allowedTypes: [\"reference\"],\r\n              missingText: \"APS e CAPS n\u00e3o compartilham o cuidado.\"\r\n            },\r\n            {\r\n              from: \"caps\",\r\n              to: \"aps\",\r\n              allowedTypes: [\"reference\"],\r\n              missingText: \"O CAPS n\u00e3o devolve informa\u00e7\u00f5es \u00e0 APS.\"\r\n            },\r\n            {\r\n              from: \"aps\",\r\n              to: \"person\",\r\n              allowedTypes: [\"reference\", \"support\"],\r\n              missingText: \"A pessoa n\u00e3o retorna ao acompanhamento territorial.\"\r\n            }\r\n          ]\r\n        },\r\n        {\r\n          id: \"crisis-care\",\r\n          title: \"Teste do manejo de crise\",\r\n          description:\r\n            \"O fluxo esperado \u00e9 Pessoa \u2192 CAPS \u2192 Urg\u00eancia \u2192 CAPS \u2192 Pessoa.\",\r\n          successMessage:\r\n            \"A crise foi manejada sem romper o v\u00ednculo com o servi\u00e7o de refer\u00eancia.\",\r\n          steps: [\r\n            {\r\n              from: \"person\",\r\n              to: \"caps\",\r\n              allowedTypes: [\"reference\", \"crisis\"],\r\n              missingText: \"A pessoa n\u00e3o possui acesso definido ao CAPS.\"\r\n            },\r\n            {\r\n              from: \"caps\",\r\n              to: \"urgency\",\r\n              allowedTypes: [\"crisis\"],\r\n              missingText: \"N\u00e3o h\u00e1 fluxo de acionamento da urg\u00eancia.\"\r\n            },\r\n            {\r\n              from: \"urgency\",\r\n              to: \"caps\",\r\n              allowedTypes: [\"reference\"],\r\n              missingText: \"A urg\u00eancia n\u00e3o reconecta a pessoa ao CAPS.\"\r\n            },\r\n            {\r\n              from: \"caps\",\r\n              to: \"person\",\r\n              allowedTypes: [\"reference\", \"support\"],\r\n              missingText: \"N\u00e3o h\u00e1 retomada do acompanhamento ap\u00f3s a crise.\"\r\n            }\r\n          ]\r\n        }\r\n      ],\r\n\r\n      metrics: [\r\n        { id: \"continuity\", label: \"Continuidade territorial\" },\r\n        { id: \"sharedCare\", label: \"Cuidado compartilhado\" },\r\n        { id: \"participation\", label: \"Participa\u00e7\u00e3o da pessoa\" },\r\n        { id: \"overload\", label: \"Sobrecarga do CAPS\", inverse: true }\r\n      ],\r\n\r\n      metricRules: [\r\n        {\r\n          metric: \"continuity\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"caps\",\r\n            to: \"aps\",\r\n            allowedTypes: [\"reference\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"continuity\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"aps\",\r\n            to: \"person\",\r\n            allowedTypes: [\"reference\", \"support\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"sharedCare\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"aps\",\r\n            to: \"caps\",\r\n            allowedTypes: [\"reference\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"sharedCare\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"crisis-plan\",\r\n            nodeIds: [\"aps\", \"caps\"],\r\n            mode: \"all\"\r\n          }\r\n        },\r\n        {\r\n          metric: \"participation\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"therapeutic-project\",\r\n            nodeIds: [\"person\"],\r\n            mode: \"any\"\r\n          }\r\n        },\r\n        {\r\n          metric: \"participation\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"person\",\r\n            to: \"aps\",\r\n            allowedTypes: [\"reference\", \"support\"]\r\n          }\r\n        }\r\n      ],\r\n\r\n      overload: {\r\n        metricId: \"overload\",\r\n        actorId: \"caps\",\r\n        freeAssignments: 2,\r\n        assignmentPenalty: 30,\r\n        freeConnections: 5,\r\n        connectionPenalty: 15\r\n      },\r\n\r\n      feedback: [\r\n        {\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"aps\",\r\n            to: \"caps\",\r\n            allowedTypes: [\"reference\"]\r\n          },\r\n          success: \"APS e CAPS compartilham o cuidado.\",\r\n          failure: \"APS e CAPS ainda funcionam como pontos isolados.\"\r\n        },\r\n        {\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"therapeutic-project\",\r\n            nodeIds: [\"person\", \"caps\"],\r\n            mode: \"all\"\r\n          },\r\n          success: \"A pessoa participa do projeto terap\u00eautico.\",\r\n          failure: \"O projeto terap\u00eautico n\u00e3o foi atribu\u00eddo \u00e0 pessoa e ao servi\u00e7o de refer\u00eancia.\"\r\n        },\r\n        {\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"social-inclusion\",\r\n            nodeIds: [\"social\", \"community\"],\r\n            mode: \"any\"\r\n          },\r\n          success: \"H\u00e1 uma estrat\u00e9gia para inclus\u00e3o e participa\u00e7\u00e3o social.\",\r\n          failure: \"A rede ainda n\u00e3o contempla inclus\u00e3o social.\"\r\n        }\r\n      ],\r\n\r\n      answer: {\r\n        title: \"Rede psicossocial articulada\",\r\n        intro:\r\n          \"O gabarito combina v\u00ednculo territorial, CAPS, manejo de crise e apoio social.\",\r\n        actors: [\"aps\", \"caps\", \"urgency\", \"family\", \"social\", \"community\"],\r\n        connections: [\r\n          { from: \"person\", to: \"aps\", type: \"reference\" },\r\n          { from: \"aps\", to: \"caps\", type: \"reference\" },\r\n          { from: \"caps\", to: \"aps\", type: \"reference\" },\r\n          { from: \"aps\", to: \"person\", type: \"support\" },\r\n          { from: \"person\", to: \"caps\", type: \"reference\" },\r\n          { from: \"caps\", to: \"urgency\", type: \"crisis\" },\r\n          { from: \"urgency\", to: \"caps\", type: \"reference\" },\r\n          { from: \"caps\", to: \"person\", type: \"support\" },\r\n          { from: \"family\", to: \"person\", type: \"support\" },\r\n          { from: \"community\", to: \"person\", type: \"support\" }\r\n        ],\r\n        assignments: {\r\n          \"therapeutic-project\": [\"person\", \"caps\"],\r\n          \"crisis-plan\": [\"aps\", \"caps\"],\r\n          \"family-support\": [\"aps\", \"caps\"],\r\n          \"social-inclusion\": [\"social\", \"community\"]\r\n        },\r\n        explanation:\r\n          \"A pessoa participa do plano, APS e CAPS compartilham responsabilidades e a crise n\u00e3o rompe o seguimento.\"\r\n      }\r\n    },\r\n\r\n    patientSafety: {\r\n      label: \"Seguran\u00e7a do paciente\",\r\n      title: \"Fluxo de um resultado laboratorial cr\u00edtico\",\r\n      intro:\r\n        \"Organize a comunica\u00e7\u00e3o e as responsabilidades para que um resultado cr\u00edtico gere a\u00e7\u00e3o cl\u00ednica segura e orienta\u00e7\u00e3o \u00e0 pessoa.\",\r\n\r\n      centralNode: {\r\n        id: \"patient\",\r\n        title: \"Paciente\",\r\n        short: \"Paciente\",\r\n        icon: \"\u25cf\",\r\n        subtitle: \"destinat\u00e1rio do cuidado\",\r\n        description:\r\n          \"Precisa ser corretamente identificado, informado e protegido por uma resposta cl\u00ednica oportuna.\"\r\n      },\r\n\r\n      actors: [\r\n        {\r\n          id: \"laboratory\",\r\n          title: \"Laborat\u00f3rio\",\r\n          short: \"Laborat\u00f3rio\",\r\n          icon: \"L\",\r\n          description: \"Identifica e comunica resultados cr\u00edticos.\",\r\n          defaultX: 20,\r\n          defaultY: 30\r\n        },\r\n        {\r\n          id: \"medical\",\r\n          title: \"Equipe m\u00e9dica\",\r\n          short: \"Equipe m\u00e9dica\",\r\n          icon: \"M\",\r\n          description: \"Interpreta o resultado e define a conduta.\",\r\n          defaultX: 72,\r\n          defaultY: 28\r\n        },\r\n        {\r\n          id: \"nursing\",\r\n          title: \"Enfermagem\",\r\n          short: \"Enfermagem\",\r\n          icon: \"E\",\r\n          description: \"Confirma identifica\u00e7\u00e3o, executa cuidados e monitora a resposta.\",\r\n          defaultX: 76,\r\n          defaultY: 72\r\n        },\r\n        {\r\n          id: \"pharmacy\",\r\n          title: \"Farm\u00e1cia cl\u00ednica\",\r\n          short: \"Farm\u00e1cia\",\r\n          icon: \"Rx\",\r\n          description: \"Apoia seguran\u00e7a medicamentosa e ajustes terap\u00eauticos.\",\r\n          defaultX: 22,\r\n          defaultY: 75\r\n        },\r\n        {\r\n          id: \"risk\",\r\n          title: \"Gest\u00e3o de risco\",\r\n          short: \"Gest\u00e3o de risco\",\r\n          icon: \"!\",\r\n          description: \"Analisa incidentes e acompanha a\u00e7\u00f5es de melhoria.\",\r\n          defaultX: 50,\r\n          defaultY: 14\r\n        }\r\n      ],\r\n\r\n      connectionTypes: [\r\n        {\r\n          id: \"critical-alert\",\r\n          label: \"Comunica alerta cr\u00edtico\",\r\n          verb: \"comunica alerta cr\u00edtico\",\r\n          icon: \"!\",\r\n          description: \"Transmite informa\u00e7\u00e3o que exige a\u00e7\u00e3o imediata.\",\r\n          color: \"#b6473b\",\r\n          dash: \"\"\r\n        },\r\n        {\r\n          id: \"care-action\",\r\n          label: \"Executa e acompanha\",\r\n          verb: \"executa e acompanha\",\r\n          icon: \"\u2713\",\r\n          description: \"Realiza conduta e monitora resposta.\",\r\n          color: \"#0e4a38\",\r\n          dash: \"\"\r\n        },\r\n        {\r\n          id: \"report\",\r\n          label: \"Registra e notifica\",\r\n          verb: \"registra e notifica\",\r\n          icon: \"\u25a4\",\r\n          description: \"Documenta evento, conduta ou incidente.\",\r\n          color: \"#6878b7\",\r\n          dash: \"9 7\"\r\n        }\r\n      ],\r\n\r\n      tasks: [\r\n        {\r\n          id: \"identify\",\r\n          title: \"Confirmar identifica\u00e7\u00e3o\",\r\n          icon: \"ID\",\r\n          description: \"Verificar se o resultado pertence ao paciente correto.\",\r\n          maxAssignees: 2\r\n        },\r\n        {\r\n          id: \"communicate-critical\",\r\n          title: \"Comunicar resultado cr\u00edtico\",\r\n          icon: \"!\",\r\n          description: \"Acionar profissional respons\u00e1vel com confirma\u00e7\u00e3o de recebimento.\",\r\n          maxAssignees: 1\r\n        },\r\n        {\r\n          id: \"clinical-action\",\r\n          title: \"Definir conduta cl\u00ednica\",\r\n          icon: \"\u2713\",\r\n          description: \"Interpretar e responder ao risco.\",\r\n          maxAssignees: 1\r\n        },\r\n        {\r\n          id: \"monitor\",\r\n          title: \"Monitorar resposta\",\r\n          icon: \"\u25ce\",\r\n          description: \"Acompanhar evolu\u00e7\u00e3o ap\u00f3s a interven\u00e7\u00e3o.\",\r\n          maxAssignees: 2\r\n        },\r\n        {\r\n          id: \"notify-incident\",\r\n          title: \"Notificar incidente\",\r\n          icon: \"\u25a4\",\r\n          description: \"Registrar falha quando houver atraso ou dano.\",\r\n          maxAssignees: 1\r\n        }\r\n      ],\r\n\r\n      routes: [\r\n        {\r\n          id: \"critical-result\",\r\n          title: \"Teste do resultado cr\u00edtico\",\r\n          description:\r\n            \"O fluxo esperado \u00e9 Laborat\u00f3rio \u2192 Equipe m\u00e9dica \u2192 Enfermagem \u2192 Paciente.\",\r\n          successMessage:\r\n            \"O alerta cr\u00edtico gerou conduta, monitoramento e orienta\u00e7\u00e3o ao paciente.\",\r\n          steps: [\r\n            {\r\n              from: \"laboratory\",\r\n              to: \"medical\",\r\n              allowedTypes: [\"critical-alert\"],\r\n              missingText: \"O laborat\u00f3rio n\u00e3o comunicou o resultado cr\u00edtico.\"\r\n            },\r\n            {\r\n              from: \"medical\",\r\n              to: \"nursing\",\r\n              allowedTypes: [\"care-action\"],\r\n              missingText: \"A conduta n\u00e3o chegou \u00e0 equipe que executar\u00e1 e monitorar\u00e1 o cuidado.\"\r\n            },\r\n            {\r\n              from: \"nursing\",\r\n              to: \"patient\",\r\n              allowedTypes: [\"care-action\"],\r\n              missingText: \"O paciente n\u00e3o recebeu cuidado ou orienta\u00e7\u00e3o.\"\r\n            }\r\n          ]\r\n        }\r\n      ],\r\n\r\n      metrics: [\r\n        { id: \"response\", label: \"Resposta oportuna\" },\r\n        { id: \"communication\", label: \"Comunica\u00e7\u00e3o segura\" },\r\n        { id: \"traceability\", label: \"Rastreabilidade\" },\r\n        { id: \"overload\", label: \"Sobrecarga da enfermagem\", inverse: true }\r\n      ],\r\n\r\n      metricRules: [\r\n        {\r\n          metric: \"response\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"laboratory\",\r\n            to: \"medical\",\r\n            allowedTypes: [\"critical-alert\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"response\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"clinical-action\",\r\n            nodeIds: [\"medical\"],\r\n            mode: \"any\"\r\n          }\r\n        },\r\n        {\r\n          metric: \"communication\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"communicate-critical\",\r\n            nodeIds: [\"laboratory\"],\r\n            mode: \"any\"\r\n          }\r\n        },\r\n        {\r\n          metric: \"communication\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"nursing\",\r\n            to: \"patient\",\r\n            allowedTypes: [\"care-action\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"traceability\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"identify\",\r\n            nodeIds: [\"laboratory\", \"nursing\"],\r\n            mode: \"any\"\r\n          }\r\n        },\r\n        {\r\n          metric: \"traceability\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"medical\",\r\n            to: \"risk\",\r\n            allowedTypes: [\"report\"]\r\n          }\r\n        }\r\n      ],\r\n\r\n      overload: {\r\n        metricId: \"overload\",\r\n        actorId: \"nursing\",\r\n        freeAssignments: 2,\r\n        assignmentPenalty: 30,\r\n        freeConnections: 5,\r\n        connectionPenalty: 15\r\n      },\r\n\r\n      feedback: [\r\n        {\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"laboratory\",\r\n            to: \"medical\",\r\n            allowedTypes: [\"critical-alert\"]\r\n          },\r\n          success: \"O alerta cr\u00edtico chega ao profissional respons\u00e1vel.\",\r\n          failure: \"O resultado cr\u00edtico n\u00e3o possui fluxo de comunica\u00e7\u00e3o.\"\r\n        },\r\n        {\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"clinical-action\",\r\n            nodeIds: [\"medical\"],\r\n            mode: \"any\"\r\n          },\r\n          success: \"A conduta cl\u00ednica possui respons\u00e1vel.\",\r\n          failure: \"A resposta cl\u00ednica ao resultado n\u00e3o foi atribu\u00edda.\"\r\n        },\r\n        {\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"monitor\",\r\n            nodeIds: [\"nursing\", \"medical\"],\r\n            mode: \"any\"\r\n          },\r\n          success: \"A resposta ao cuidado ser\u00e1 monitorada.\",\r\n          failure: \"N\u00e3o h\u00e1 respons\u00e1vel por monitorar a evolu\u00e7\u00e3o.\"\r\n        }\r\n      ],\r\n\r\n      answer: {\r\n        title: \"Fluxo seguro para resultado cr\u00edtico\",\r\n        intro:\r\n          \"O gabarito conecta identifica\u00e7\u00e3o, alerta, conduta, monitoramento e rastreabilidade.\",\r\n        actors: [\"laboratory\", \"medical\", \"nursing\", \"pharmacy\", \"risk\"],\r\n        connections: [\r\n          { from: \"laboratory\", to: \"medical\", type: \"critical-alert\" },\r\n          { from: \"medical\", to: \"nursing\", type: \"care-action\" },\r\n          { from: \"nursing\", to: \"patient\", type: \"care-action\" },\r\n          { from: \"medical\", to: \"risk\", type: \"report\" },\r\n          { from: \"pharmacy\", to: \"medical\", type: \"care-action\" }\r\n        ],\r\n        assignments: {\r\n          \"identify\": [\"laboratory\", \"nursing\"],\r\n          \"communicate-critical\": [\"laboratory\"],\r\n          \"clinical-action\": [\"medical\"],\r\n          \"monitor\": [\"nursing\", \"medical\"],\r\n          \"notify-incident\": [\"risk\"]\r\n        },\r\n        explanation:\r\n          \"O resultado \u00e9 corretamente identificado, comunicado, convertido em conduta e acompanhado com registro.\"\r\n      }\r\n    },\r\n\r\n    vaccinationCampaign: {\r\n      label: \"Campanha de vacina\u00e7\u00e3o\",\r\n      title: \"Organiza\u00e7\u00e3o de uma campanha de vacina\u00e7\u00e3o\",\r\n      intro:\r\n        \"Articule planejamento, oferta, comunica\u00e7\u00e3o, registro e busca ativa para ampliar acesso e cobertura.\",\r\n\r\n      centralNode: {\r\n        id: \"population\",\r\n        title: \"Popula\u00e7\u00e3o priorit\u00e1ria\",\r\n        short: \"Popula\u00e7\u00e3o\",\r\n        icon: \"\u25cf\",\r\n        subtitle: \"p\u00fablico da campanha\",\r\n        description:\r\n          \"Precisa receber informa\u00e7\u00e3o clara, ter acesso \u00e0 vacina\u00e7\u00e3o e contar com registro adequado.\"\r\n      },\r\n\r\n      actors: [\r\n        {\r\n          id: \"management\",\r\n          title: \"Gest\u00e3o\",\r\n          short: \"Gest\u00e3o\",\r\n          icon: \"G\",\r\n          description: \"Planeja recursos, metas, estoque e log\u00edstica.\",\r\n          defaultX: 21,\r\n          defaultY: 28\r\n        },\r\n        {\r\n          id: \"vaccination\",\r\n          title: \"Equipe de vacina\u00e7\u00e3o\",\r\n          short: \"Vacina\u00e7\u00e3o\",\r\n          icon: \"V\",\r\n          description: \"Realiza acolhimento, aplica\u00e7\u00e3o e registro das doses.\",\r\n          defaultX: 72,\r\n          defaultY: 30\r\n        },\r\n        {\r\n          id: \"surveillance\",\r\n          title: \"Vigil\u00e2ncia\",\r\n          short: \"Vigil\u00e2ncia\",\r\n          icon: \"\u25ce\",\r\n          description: \"Monitora cobertura, eventos e grupos com baixa ades\u00e3o.\",\r\n          defaultX: 78,\r\n          defaultY: 72\r\n        },\r\n        {\r\n          id: \"school\",\r\n          title: \"Escolas e institui\u00e7\u00f5es\",\r\n          short: \"Escolas\",\r\n          icon: \"\u25a3\",\r\n          description: \"Apoiam comunica\u00e7\u00e3o, acesso e estrat\u00e9gias extramuros.\",\r\n          defaultX: 22,\r\n          defaultY: 74\r\n        },\r\n        {\r\n          id: \"communication\",\r\n          title: \"Comunica\u00e7\u00e3o\",\r\n          short: \"Comunica\u00e7\u00e3o\",\r\n          icon: \"\u25c9\",\r\n          description: \"Produz informa\u00e7\u00e3o clara e combate desinforma\u00e7\u00e3o.\",\r\n          defaultX: 50,\r\n          defaultY: 14\r\n        },\r\n        {\r\n          id: \"transport\",\r\n          title: \"Log\u00edstica e transporte\",\r\n          short: \"Log\u00edstica\",\r\n          icon: \"\u2197\",\r\n          description: \"Garante distribui\u00e7\u00e3o e conserva\u00e7\u00e3o dos imunobiol\u00f3gicos.\",\r\n          defaultX: 50,\r\n          defaultY: 88\r\n        }\r\n      ],\r\n\r\n      connectionTypes: [\r\n        {\r\n          id: \"planning\",\r\n          label: \"Planeja e orienta\",\r\n          verb: \"planeja e orienta\",\r\n          icon: \"\u25a4\",\r\n          description: \"Define metas, fluxos e responsabilidades.\",\r\n          color: \"#294b8f\",\r\n          dash: \"\"\r\n        },\r\n        {\r\n          id: \"information\",\r\n          label: \"Compartilha informa\u00e7\u00e3o\",\r\n          verb: \"compartilha informa\u00e7\u00e3o\",\r\n          icon: \"\u21c4\",\r\n          description: \"Envia dados, registros ou mensagens.\",\r\n          color: \"#6878b7\",\r\n          dash: \"9 7\"\r\n        },\r\n        {\r\n          id: \"access\",\r\n          label: \"Amplia acesso\",\r\n          verb: \"amplia acesso\",\r\n          icon: \"\u2197\",\r\n          description: \"Leva a vacina\u00e7\u00e3o at\u00e9 o p\u00fablico.\",\r\n          color: \"#0e4a38\",\r\n          dash: \"\"\r\n        }\r\n      ],\r\n\r\n      tasks: [\r\n        {\r\n          id: \"stock\",\r\n          title: \"Planejar estoque\",\r\n          icon: \"\u25a6\",\r\n          description: \"Dimensionar doses e insumos.\",\r\n          maxAssignees: 2\r\n        },\r\n        {\r\n          id: \"cold-chain\",\r\n          title: \"Garantir rede de frio\",\r\n          icon: \"\u2744\",\r\n          description: \"Manter conserva\u00e7\u00e3o e transporte adequados.\",\r\n          maxAssignees: 2\r\n        },\r\n        {\r\n          id: \"communication\",\r\n          title: \"Divulgar campanha\",\r\n          icon: \"\u25c9\",\r\n          description: \"Informar p\u00fablico, locais e crit\u00e9rios.\",\r\n          maxAssignees: 2\r\n        },\r\n        {\r\n          id: \"register\",\r\n          title: \"Registrar doses\",\r\n          icon: \"\u25a4\",\r\n          description: \"Garantir informa\u00e7\u00e3o nominal e cobertura.\",\r\n          maxAssignees: 2\r\n        },\r\n        {\r\n          id: \"active-search\",\r\n          title: \"Realizar busca ativa\",\r\n          icon: \"\u2316\",\r\n          description: \"Identificar grupos n\u00e3o alcan\u00e7ados.\",\r\n          maxAssignees: 2\r\n        }\r\n      ],\r\n\r\n      routes: [\r\n        {\r\n          id: \"campaign-flow\",\r\n          title: \"Teste do fluxo da campanha\",\r\n          description:\r\n            \"O fluxo esperado \u00e9 Gest\u00e3o \u2192 Vacina\u00e7\u00e3o \u2192 Popula\u00e7\u00e3o \u2192 Vigil\u00e2ncia.\",\r\n          successMessage:\r\n            \"A campanha foi planejada, chegou ao p\u00fablico e gerou informa\u00e7\u00e3o para monitoramento.\",\r\n          steps: [\r\n            {\r\n              from: \"management\",\r\n              to: \"vaccination\",\r\n              allowedTypes: [\"planning\"],\r\n              missingText: \"A equipe de vacina\u00e7\u00e3o n\u00e3o recebeu planejamento e orienta\u00e7\u00e3o.\"\r\n            },\r\n            {\r\n              from: \"vaccination\",\r\n              to: \"population\",\r\n              allowedTypes: [\"access\", \"information\"],\r\n              missingText: \"A vacina\u00e7\u00e3o n\u00e3o chegou \u00e0 popula\u00e7\u00e3o priorit\u00e1ria.\"\r\n            },\r\n            {\r\n              from: \"population\",\r\n              to: \"surveillance\",\r\n              allowedTypes: [\"information\"],\r\n              missingText: \"O registro n\u00e3o retorna para monitoramento da cobertura.\"\r\n            }\r\n          ]\r\n        }\r\n      ],\r\n\r\n      metrics: [\r\n        { id: \"coverage\", label: \"Cobertura potencial\" },\r\n        { id: \"access\", label: \"Acesso\" },\r\n        { id: \"records\", label: \"Qualidade do registro\" },\r\n        { id: \"overload\", label: \"Sobrecarga da vacina\u00e7\u00e3o\", inverse: true }\r\n      ],\r\n\r\n      metricRules: [\r\n        {\r\n          metric: \"coverage\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"vaccination\",\r\n            to: \"population\",\r\n            allowedTypes: [\"access\", \"information\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"coverage\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"active-search\",\r\n            nodeIds: [\"surveillance\", \"school\"],\r\n            mode: \"any\"\r\n          }\r\n        },\r\n        {\r\n          metric: \"access\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"school\",\r\n            to: \"population\",\r\n            allowedTypes: [\"access\", \"information\"]\r\n          }\r\n        },\r\n        {\r\n          metric: \"access\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"communication\",\r\n            nodeIds: [\"communication\", \"school\"],\r\n            mode: \"any\"\r\n          }\r\n        },\r\n        {\r\n          metric: \"records\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"register\",\r\n            nodeIds: [\"vaccination\"],\r\n            mode: \"any\"\r\n          }\r\n        },\r\n        {\r\n          metric: \"records\",\r\n          points: 50,\r\n          condition: {\r\n            type: \"connection\",\r\n            from: \"population\",\r\n            to: \"surveillance\",\r\n            allowedTypes: [\"information\"]\r\n          }\r\n        }\r\n      ],\r\n\r\n      overload: {\r\n        metricId: \"overload\",\r\n        actorId: \"vaccination\",\r\n        freeAssignments: 2,\r\n        assignmentPenalty: 30,\r\n        freeConnections: 5,\r\n        connectionPenalty: 15\r\n      },\r\n\r\n      feedback: [\r\n        {\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"cold-chain\",\r\n            nodeIds: [\"management\", \"transport\"],\r\n            mode: \"any\"\r\n          },\r\n          success: \"A rede de frio possui respons\u00e1vel.\",\r\n          failure: \"A conserva\u00e7\u00e3o e o transporte n\u00e3o foram atribu\u00eddos.\"\r\n        },\r\n        {\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"register\",\r\n            nodeIds: [\"vaccination\"],\r\n            mode: \"any\"\r\n          },\r\n          success: \"O registro das doses est\u00e1 previsto.\",\r\n          failure: \"N\u00e3o h\u00e1 respons\u00e1vel pelo registro das doses.\"\r\n        },\r\n        {\r\n          condition: {\r\n            type: \"assignment\",\r\n            taskId: \"active-search\",\r\n            nodeIds: [\"surveillance\", \"school\"],\r\n            mode: \"any\"\r\n          },\r\n          success: \"A campanha prev\u00ea busca ativa.\",\r\n          failure: \"A rede n\u00e3o possui estrat\u00e9gia para alcan\u00e7ar grupos n\u00e3o vacinados.\"\r\n        }\r\n      ],\r\n\r\n      answer: {\r\n        title: \"Rede de refer\u00eancia para campanha de vacina\u00e7\u00e3o\",\r\n        intro:\r\n          \"O gabarito distribui planejamento, log\u00edstica, comunica\u00e7\u00e3o, oferta e monitoramento.\",\r\n        actors: [\"management\", \"vaccination\", \"surveillance\", \"school\", \"communication\", \"transport\"],\r\n        connections: [\r\n          { from: \"management\", to: \"vaccination\", type: \"planning\" },\r\n          { from: \"vaccination\", to: \"population\", type: \"access\" },\r\n          { from: \"population\", to: \"surveillance\", type: \"information\" },\r\n          { from: \"school\", to: \"population\", type: \"access\" },\r\n          { from: \"communication\", to: \"population\", type: \"information\" },\r\n          { from: \"transport\", to: \"vaccination\", type: \"planning\" }\r\n        ],\r\n        assignments: {\r\n          \"stock\": [\"management\", \"vaccination\"],\r\n          \"cold-chain\": [\"management\", \"transport\"],\r\n          \"communication\": [\"communication\", \"school\"],\r\n          \"register\": [\"vaccination\"],\r\n          \"active-search\": [\"surveillance\", \"school\"]\r\n        },\r\n        explanation:\r\n          \"A campanha combina planejamento, log\u00edstica, comunica\u00e7\u00e3o, oferta, registro e busca ativa sem concentrar tudo em uma \u00fanica equipe.\"\r\n      }\r\n    }\r\n  };\r\n\r\n  const roots = document.querySelectorAll(\".healthNetworkBuilder\");\r\n\r\n  roots.forEach((root, rootIndex) => {\r\n    if (root.dataset.initialized === \"true\") return;\r\n    root.dataset.initialized = \"true\";\r\n\r\n    const title = root.querySelector(\"#healthNetworkBuilderTitle\");\r\n    const intro = root.querySelector(\".healthNetworkBuilder__intro\");\r\n    const scenarioSelect = root.querySelector(\".healthNetworkBuilder__scenarioSelect\");\r\n    const actorPalette = root.querySelector(\".healthNetworkBuilder__actorPalette\");\r\n    const taskPalette = root.querySelector(\".healthNetworkBuilder__taskPalette\");\r\n    const metricsWrap = root.querySelector(\".healthNetworkBuilder__metrics\");\r\n    const nodesWrap = root.querySelector(\".healthNetworkBuilder__nodes\");\r\n    const canvas = root.querySelector(\".healthNetworkBuilder__canvas\");\r\n    const svg = root.querySelector(\".healthNetworkBuilder__svg\");\r\n    const markerDefs = root.querySelector(\".healthNetworkBuilder__markerDefs\");\r\n    const edgeLayer = root.querySelector(\".healthNetworkBuilder__edgeLayer\");\r\n    const previewEdge = root.querySelector(\".healthNetworkBuilder__previewEdge\");\r\n    const packet = root.querySelector(\".healthNetworkBuilder__packet\");\r\n    const emptyHint = root.querySelector(\".healthNetworkBuilder__emptyHint\");\r\n\r\n    const routeTitle = root.querySelector(\".healthNetworkBuilder__routeTitle\");\r\n    const routeDescription = root.querySelector(\".healthNetworkBuilder__routeDescription\");\r\n    const routePicker = root.querySelector(\".healthNetworkBuilder__routePicker\");\r\n    const routeSelect = root.querySelector(\".healthNetworkBuilder__routeSelect\");\r\n\r\n    const answerButton = root.querySelector(\".healthNetworkBuilder__answerButton\");\r\n    const testButton = root.querySelector(\".healthNetworkBuilder__testButton\");\r\n    const testMessage = root.querySelector(\".healthNetworkBuilder__testMessage\");\r\n    const clearConnectionsButton = root.querySelector(\".healthNetworkBuilder__clearConnections\");\r\n    const resetButton = root.querySelector(\".healthNetworkBuilder__reset\");\r\n\r\n    const scoreValue = root.querySelector(\".healthNetworkBuilder__scoreValue\");\r\n    const scoreLabel = root.querySelector(\".healthNetworkBuilder__scoreLabel\");\r\n    const stepIndicators = root.querySelectorAll(\"[data-step-indicator]\");\r\n\r\n    const inspectorPlaceholder = root.querySelector(\".healthNetworkBuilder__inspectorPlaceholder\");\r\n    const inspectorContent = root.querySelector(\".healthNetworkBuilder__inspectorContent\");\r\n    const inspectorIcon = root.querySelector(\".healthNetworkBuilder__inspectorIcon\");\r\n    const inspectorTitle = root.querySelector(\".healthNetworkBuilder__inspectorTitle\");\r\n    const inspectorDescription = root.querySelector(\".healthNetworkBuilder__inspectorDescription\");\r\n    const inspectorConnections = root.querySelector(\".healthNetworkBuilder__inspectorConnections\");\r\n    const inspectorTasks = root.querySelector(\".healthNetworkBuilder__inspectorTasks\");\r\n\r\n    const feedbackSection = root.querySelector(\".healthNetworkBuilder__feedback\");\r\n    const feedbackStatus = root.querySelector(\".healthNetworkBuilder__feedbackStatus\");\r\n    const strengthsList = root.querySelector(\".healthNetworkBuilder__strengths\");\r\n    const gapsList = root.querySelector(\".healthNetworkBuilder__gaps\");\r\n\r\n    const answerDialog = root.querySelector(\".healthNetworkBuilder__answerDialog\");\r\n    const answerBackdrop = answerDialog.querySelector(\".healthNetworkBuilder__dialogBackdrop\");\r\n    const answerTitle = root.querySelector(\".healthNetworkBuilder__answerTitle\");\r\n    const answerIntro = root.querySelector(\".healthNetworkBuilder__answerIntro\");\r\n    const answerActors = root.querySelector(\".healthNetworkBuilder__answerActors\");\r\n    const answerConnections = root.querySelector(\".healthNetworkBuilder__answerConnections\");\r\n    const answerAssignments = root.querySelector(\".healthNetworkBuilder__answerAssignments\");\r\n    const answerExplanation = root.querySelector(\".healthNetworkBuilder__answerExplanation\");\r\n    const answerClose = root.querySelector(\".healthNetworkBuilder__answerClose\");\r\n    const answerApply = root.querySelector(\".healthNetworkBuilder__answerApply\");\r\n\r\n    const connectionDialog = root.querySelector(\".healthNetworkBuilder__connectionDialog\");\r\n    const connectionBackdrop = connectionDialog.querySelector(\".healthNetworkBuilder__dialogBackdrop\");\r\n    const dialogRoute = root.querySelector(\".healthNetworkBuilder__dialogRoute\");\r\n    const connectionTypesWrap = root.querySelector(\".healthNetworkBuilder__connectionTypes\");\r\n    const dialogCancel = root.querySelector(\".healthNetworkBuilder__dialogCancel\");\r\n\r\n    let config = null;\r\n    let centralNodeId = null;\r\n    let connections = [];\r\n    let assignments = new Map();\r\n    let nodeElements = new Map();\r\n    let actorCards = new Map();\r\n    let taskCards = new Map();\r\n    let metricElements = new Map();\r\n\r\n    let selectedTaskId = null;\r\n    let selectedNodeId = null;\r\n    let pendingConnection = null;\r\n    let connectingFrom = null;\r\n    let draggingNode = null;\r\n    let dragOffset = { x: 0, y: 0 };\r\n    let isTesting = false;\r\n    let resizeFrame = null;\r\n\r\n    const markerPrefix = `hnb-${rootIndex}`;\r\n\r\n    const clamp = (value, min, max) =>\r\n      Math.min(Math.max(value, min), max);\r\n\r\n    const getAllNodeData = () => [\r\n      config.centralNode,\r\n      ...config.actors\r\n    ];\r\n\r\n    const getNodeData = (id) =>\r\n      getAllNodeData().find((node) => node.id === id);\r\n\r\n    const getConnectionType = (id) =>\r\n      config.connectionTypes.find((type) => type.id === id);\r\n\r\n    const getTask = (id) =>\r\n      config.tasks.find((task) => task.id === id);\r\n\r\n    const renderScenarioOptions = () => {\r\n      scenarioSelect.innerHTML = \"\";\r\n\r\n      Object.entries(CARE_NETWORK_SCENARIOS).forEach(\r\n        ([key, scenario]) => {\r\n          const option = document.createElement(\"option\");\r\n          option.value = key;\r\n          option.textContent = scenario.label;\r\n          scenarioSelect.appendChild(option);\r\n        }\r\n      );\r\n    };\r\n\r\n    const renderMarkers = () => {\r\n      markerDefs.innerHTML = \"\";\r\n\r\n      config.connectionTypes.forEach((type) => {\r\n        const marker = document.createElementNS(\r\n          \"http:\/\/www.w3.org\/2000\/svg\",\r\n          \"marker\"\r\n        );\r\n\r\n        const markerId = `${markerPrefix}-${type.id}`;\r\n\r\n        marker.setAttribute(\"id\", markerId);\r\n        marker.setAttribute(\"markerWidth\", \"9\");\r\n        marker.setAttribute(\"markerHeight\", \"9\");\r\n        marker.setAttribute(\"refX\", \"7\");\r\n        marker.setAttribute(\"refY\", \"4.5\");\r\n        marker.setAttribute(\"orient\", \"auto\");\r\n        marker.setAttribute(\"markerUnits\", \"strokeWidth\");\r\n\r\n        const path = document.createElementNS(\r\n          \"http:\/\/www.w3.org\/2000\/svg\",\r\n          \"path\"\r\n        );\r\n\r\n        path.setAttribute(\"d\", \"M0,0 L9,4.5 L0,9 z\");\r\n        path.setAttribute(\"fill\", type.color);\r\n\r\n        marker.appendChild(path);\r\n        markerDefs.appendChild(marker);\r\n      });\r\n    };\r\n\r\n    const renderConnectionTypeButtons = () => {\r\n      connectionTypesWrap.innerHTML = \"\";\r\n\r\n      config.connectionTypes.forEach((type) => {\r\n        const button = document.createElement(\"button\");\r\n        button.type = \"button\";\r\n        button.dataset.connectionType = type.id;\r\n\r\n        button.innerHTML = `\r\n          <span style=\"background:${type.color}\" aria-hidden=\"true\">${type.icon}<\/span>\r\n          <b>${type.label}<\/b>\r\n          <small>${type.description}<\/small>\r\n        `;\r\n\r\n        button.addEventListener(\"click\", () => {\r\n          if (!pendingConnection) return;\r\n\r\n          const duplicateIndex = connections.findIndex(\r\n            (connection) =>\r\n              connection.from === pendingConnection.from &&\r\n              connection.to === pendingConnection.to\r\n          );\r\n\r\n          const newConnection = {\r\n            ...pendingConnection,\r\n            type: type.id\r\n          };\r\n\r\n          if (duplicateIndex >= 0) {\r\n            connections.splice(duplicateIndex, 1, newConnection);\r\n          } else {\r\n            connections.push(newConnection);\r\n          }\r\n\r\n          pendingConnection = null;\r\n          connectionDialog.hidden = true;\r\n          drawConnections();\r\n          updateAll();\r\n        });\r\n\r\n        connectionTypesWrap.appendChild(button);\r\n      });\r\n    };\r\n\r\n    const createCentralNode = () => {\r\n      const node = document.createElement(\"div\");\r\n      const central = config.centralNode;\r\n\r\n      node.className =\r\n        \"healthNetworkBuilder__node healthNetworkBuilder__node--central\";\r\n\r\n      node.dataset.nodeId = central.id;\r\n      node.style.left = \"50%\";\r\n      node.style.top = \"52%\";\r\n      node.tabIndex = 0;\r\n\r\n      node.innerHTML = `\r\n        <span class=\"healthNetworkBuilder__nodePort\" title=\"Criar conex\u00e3o\"><\/span>\r\n        <span class=\"healthNetworkBuilder__centralAvatar\" aria-hidden=\"true\">${central.icon}<\/span>\r\n        <strong>${central.title}<\/strong>\r\n        <small>${central.subtitle || \"\"}<\/small>\r\n        <span class=\"healthNetworkBuilder__nodeTaskCount\" hidden>0<\/span>\r\n      `;\r\n\r\n      nodesWrap.appendChild(node);\r\n      nodeElements.set(central.id, node);\r\n      bindNodeEvents(node, false);\r\n    };\r\n\r\n    const createActorNode = (\r\n      actor,\r\n      xPercent = actor.defaultX,\r\n      yPercent = actor.defaultY\r\n    ) => {\r\n      if (nodeElements.has(actor.id)) return;\r\n\r\n      const node = document.createElement(\"div\");\r\n      node.className = \"healthNetworkBuilder__node\";\r\n      node.dataset.nodeId = actor.id;\r\n      node.tabIndex = 0;\r\n      node.style.left = `${xPercent}%`;\r\n      node.style.top = `${yPercent}%`;\r\n\r\n      node.innerHTML = `\r\n        <button class=\"healthNetworkBuilder__nodeMove\" type=\"button\" title=\"Mover ator\">\u2725<\/button>\r\n        <button class=\"healthNetworkBuilder__nodeRemove\" type=\"button\" title=\"Remover ator\">\u00d7<\/button>\r\n        <span class=\"healthNetworkBuilder__nodeIcon\" aria-hidden=\"true\">${actor.icon}<\/span>\r\n        <span class=\"healthNetworkBuilder__nodeText\">\r\n          <strong>${actor.title}<\/strong>\r\n          <small>${actor.description}<\/small>\r\n        <\/span>\r\n        <span class=\"healthNetworkBuilder__nodePort\" title=\"Criar conex\u00e3o\"><\/span>\r\n        <span class=\"healthNetworkBuilder__nodeTaskCount\" hidden>0<\/span>\r\n      `;\r\n\r\n      nodesWrap.appendChild(node);\r\n      nodeElements.set(actor.id, node);\r\n      actorCards.get(actor.id)?.classList.add(\"is-added\");\r\n      bindNodeEvents(node, true);\r\n\r\n      emptyHint.style.opacity =\r\n        nodeElements.size > 1 ? \"0\" : \"1\";\r\n\r\n      drawConnections();\r\n      updateAll();\r\n    };\r\n\r\n    const removeActorNode = (nodeId) => {\r\n      if (nodeId === centralNodeId) return;\r\n\r\n      nodeElements.get(nodeId)?.remove();\r\n      nodeElements.delete(nodeId);\r\n      actorCards.get(nodeId)?.classList.remove(\"is-added\");\r\n\r\n      connections = connections.filter(\r\n        (connection) =>\r\n          connection.from !== nodeId &&\r\n          connection.to !== nodeId\r\n      );\r\n\r\n      assignments.forEach((nodeIds, taskId) => {\r\n        nodeIds.delete(nodeId);\r\n\r\n        if (!nodeIds.size) {\r\n          assignments.delete(taskId);\r\n        }\r\n      });\r\n\r\n      if (selectedNodeId === nodeId) {\r\n        selectedNodeId = null;\r\n      }\r\n\r\n      emptyHint.style.opacity =\r\n        nodeElements.size === 1 ? \"1\" : \"0\";\r\n\r\n      drawConnections();\r\n      updateAll();\r\n    };\r\n\r\n    const renderActorPalette = () => {\r\n      actorPalette.innerHTML = \"\";\r\n      actorCards.clear();\r\n\r\n      config.actors.forEach((actor) => {\r\n        const button = document.createElement(\"button\");\r\n        button.type = \"button\";\r\n        button.className = \"healthNetworkBuilder__actorCard\";\r\n        button.draggable = true;\r\n\r\n        button.innerHTML = `\r\n          <span class=\"healthNetworkBuilder__actorIcon\" aria-hidden=\"true\">${actor.icon}<\/span>\r\n          <div>\r\n            <strong>${actor.title}<\/strong>\r\n            <small>${actor.description}<\/small>\r\n          <\/div>\r\n        `;\r\n\r\n        button.addEventListener(\"click\", () => {\r\n          if (nodeElements.has(actor.id)) {\r\n            selectNode(actor.id);\r\n          } else {\r\n            createActorNode(actor);\r\n          }\r\n        });\r\n\r\n        button.addEventListener(\"dragstart\", (event) => {\r\n          if (nodeElements.has(actor.id)) {\r\n            event.preventDefault();\r\n            return;\r\n          }\r\n\r\n          event.dataTransfer.setData(\r\n            \"application\/x-health-network-actor\",\r\n            actor.id\r\n          );\r\n        });\r\n\r\n        actorPalette.appendChild(button);\r\n        actorCards.set(actor.id, button);\r\n      });\r\n    };\r\n\r\n    const renderTaskPalette = () => {\r\n      taskPalette.innerHTML = \"\";\r\n      taskCards.clear();\r\n\r\n      config.tasks.forEach((task) => {\r\n        const button = document.createElement(\"button\");\r\n        button.type = \"button\";\r\n        button.className = \"healthNetworkBuilder__taskCard\";\r\n        button.draggable = true;\r\n\r\n        button.innerHTML = `\r\n          <span class=\"healthNetworkBuilder__taskIcon\" aria-hidden=\"true\">${task.icon}<\/span>\r\n          <div>\r\n            <strong>${task.title}<\/strong>\r\n            <small>${task.description}<\/small>\r\n            <small class=\"healthNetworkBuilder__taskAssignment\"><\/small>\r\n          <\/div>\r\n        `;\r\n\r\n        button.addEventListener(\"click\", () => {\r\n          selectedTaskId =\r\n            selectedTaskId === task.id ? null : task.id;\r\n\r\n          taskCards.forEach((card, taskId) => {\r\n            card.classList.toggle(\r\n              \"is-selected\",\r\n              taskId === selectedTaskId\r\n            );\r\n          });\r\n\r\n          if (selectedTaskId) {\r\n            showTestMessage(\r\n              `A\u00e7\u00e3o selecionada: \u201c${task.title}\u201d. Clique em um ator para atribuir ou remover.`,\r\n              \"\"\r\n            );\r\n          } else {\r\n            testMessage.hidden = true;\r\n          }\r\n        });\r\n\r\n        button.addEventListener(\"dragstart\", (event) => {\r\n          event.dataTransfer.setData(\r\n            \"application\/x-health-network-task\",\r\n            task.id\r\n          );\r\n        });\r\n\r\n        taskPalette.appendChild(button);\r\n        taskCards.set(task.id, button);\r\n      });\r\n    };\r\n\r\n    const renderMetrics = () => {\r\n      metricsWrap.innerHTML = \"\";\r\n      metricElements.clear();\r\n\r\n      config.metrics.forEach((metric) => {\r\n        const element = document.createElement(\"div\");\r\n\r\n        element.className =\r\n          \"healthNetworkBuilder__metric\" +\r\n          (metric.inverse ? \" is-inverse\" : \"\");\r\n\r\n        element.dataset.metric = metric.id;\r\n\r\n        element.innerHTML = `\r\n          <div class=\"healthNetworkBuilder__metricTop\">\r\n            <span>${metric.label}<\/span>\r\n            <b>0%<\/b>\r\n          <\/div>\r\n          <div class=\"healthNetworkBuilder__metricTrack\">\r\n            <i><\/i>\r\n          <\/div>\r\n        `;\r\n\r\n        metricsWrap.appendChild(element);\r\n        metricElements.set(metric.id, element);\r\n      });\r\n    };\r\n\r\n    const renderRoutes = () => {\r\n      routeSelect.innerHTML = \"\";\r\n\r\n      config.routes.forEach((route) => {\r\n        const option = document.createElement(\"option\");\r\n        option.value = route.id;\r\n        option.textContent = route.title;\r\n        routeSelect.appendChild(option);\r\n      });\r\n\r\n      routePicker.hidden = config.routes.length <= 1;\r\n      updateRouteCopy();\r\n    };\r\n\r\n    const getCurrentRoute = () =>\r\n      config.routes.find(\r\n        (route) => route.id === routeSelect.value\r\n      ) || config.routes[0];\r\n\r\n    const updateRouteCopy = () => {\r\n      const route = getCurrentRoute();\r\n\r\n      routeTitle.textContent = route.title;\r\n      routeDescription.textContent = route.description;\r\n    };\r\n\r\n    const getCanvasPoint = (clientX, clientY) => {\r\n      const rect = canvas.getBoundingClientRect();\r\n\r\n      return {\r\n        x: clientX - rect.left,\r\n        y: clientY - rect.top\r\n      };\r\n    };\r\n\r\n    const getNodeCenter = (nodeId) => {\r\n      const node = nodeElements.get(nodeId);\r\n      const canvasRect = canvas.getBoundingClientRect();\r\n      const nodeRect = node.getBoundingClientRect();\r\n\r\n      return {\r\n        x:\r\n          nodeRect.left -\r\n          canvasRect.left +\r\n          nodeRect.width \/ 2,\r\n        y:\r\n          nodeRect.top -\r\n          canvasRect.top +\r\n          nodeRect.height \/ 2\r\n      };\r\n    };\r\n\r\n    const makePath = (fromId, toId, index = 0) => {\r\n      const start = getNodeCenter(fromId);\r\n      const end = getNodeCenter(toId);\r\n      const dx = end.x - start.x;\r\n      const dy = end.y - start.y;\r\n      const distance = Math.max(1, Math.hypot(dx, dy));\r\n      const normalX = -dy \/ distance;\r\n      const normalY = dx \/ distance;\r\n      const curve =\r\n        Math.min(52, Math.max(18, distance * .10)) *\r\n        (index % 2 ? -1 : 1);\r\n\r\n      const controlX =\r\n        (start.x + end.x) \/ 2 + normalX * curve;\r\n\r\n      const controlY =\r\n        (start.y + end.y) \/ 2 + normalY * curve;\r\n\r\n      return `M ${start.x} ${start.y} Q ${controlX} ${controlY} ${end.x} ${end.y}`;\r\n    };\r\n\r\n    const edgeKey = (from, to) =>\r\n      `${from}::${to}`;\r\n\r\n    const drawConnections = () => {\r\n      edgeLayer.innerHTML = \"\";\r\n\r\n      connections.forEach((connection, index) => {\r\n        if (\r\n          !nodeElements.has(connection.from) ||\r\n          !nodeElements.has(connection.to)\r\n        ) return;\r\n\r\n        const type = getConnectionType(connection.type);\r\n        const path = document.createElementNS(\r\n          \"http:\/\/www.w3.org\/2000\/svg\",\r\n          \"path\"\r\n        );\r\n\r\n        path.setAttribute(\r\n          \"d\",\r\n          makePath(connection.from, connection.to, index)\r\n        );\r\n\r\n        path.setAttribute(\r\n          \"class\",\r\n          \"healthNetworkBuilder__edge\"\r\n        );\r\n\r\n        path.setAttribute(\"stroke\", type.color);\r\n\r\n        if (type.dash) {\r\n          path.setAttribute(\r\n            \"stroke-dasharray\",\r\n            type.dash\r\n          );\r\n        }\r\n\r\n        path.style.markerEnd =\r\n          `url(#${markerPrefix}-${type.id})`;\r\n\r\n        path.dataset.from = connection.from;\r\n        path.dataset.to = connection.to;\r\n        path.dataset.type = connection.type;\r\n        path.dataset.key =\r\n          edgeKey(connection.from, connection.to);\r\n\r\n        path.addEventListener(\"click\", () => {\r\n          if (isTesting) return;\r\n\r\n          const confirmed = window.confirm(\r\n            `Remover \u201c${getNodeData(connection.from).short} \u2192 ${getNodeData(connection.to).short}\u201d?`\r\n          );\r\n\r\n          if (!confirmed) return;\r\n\r\n          connections = connections.filter(\r\n            (item) => item !== connection\r\n          );\r\n\r\n          drawConnections();\r\n          updateAll();\r\n        });\r\n\r\n        edgeLayer.appendChild(path);\r\n      });\r\n    };\r\n\r\n    const setNodePositionFromPointer = (\r\n      node,\r\n      clientX,\r\n      clientY\r\n    ) => {\r\n      const rect = canvas.getBoundingClientRect();\r\n      const nodeRect = node.getBoundingClientRect();\r\n      const halfWidth = nodeRect.width \/ 2;\r\n      const halfHeight = nodeRect.height \/ 2;\r\n\r\n      let x =\r\n        clientX -\r\n        rect.left -\r\n        dragOffset.x;\r\n\r\n      let y =\r\n        clientY -\r\n        rect.top -\r\n        dragOffset.y;\r\n\r\n      x = clamp(\r\n        x,\r\n        halfWidth + 8,\r\n        rect.width - halfWidth - 8\r\n      );\r\n\r\n      y = clamp(\r\n        y,\r\n        halfHeight + 8,\r\n        rect.height - halfHeight - 8\r\n      );\r\n\r\n      node.style.left =\r\n        `${(x \/ rect.width) * 100}%`;\r\n\r\n      node.style.top =\r\n        `${(y \/ rect.height) * 100}%`;\r\n\r\n      drawConnections();\r\n    };\r\n\r\n    const startConnection = (nodeId, event) => {\r\n      if (isTesting) return;\r\n\r\n      connectingFrom = nodeId;\r\n      const start = getNodeCenter(nodeId);\r\n      const point = getCanvasPoint(\r\n        event.clientX,\r\n        event.clientY\r\n      );\r\n\r\n      previewEdge.setAttribute(\r\n        \"d\",\r\n        `M ${start.x} ${start.y} Q ${(start.x + point.x) \/ 2} ${start.y - 30} ${point.x} ${point.y}`\r\n      );\r\n\r\n      previewEdge.style.opacity = \"1\";\r\n      event.preventDefault();\r\n      event.stopPropagation();\r\n    };\r\n\r\n    const moveConnectionPreview = (event) => {\r\n      if (!connectingFrom) return;\r\n\r\n      const start = getNodeCenter(connectingFrom);\r\n      const point = getCanvasPoint(\r\n        event.clientX,\r\n        event.clientY\r\n      );\r\n\r\n      previewEdge.setAttribute(\r\n        \"d\",\r\n        `M ${start.x} ${start.y} Q ${(start.x + point.x) \/ 2} ${(start.y + point.y) \/ 2 - 30} ${point.x} ${point.y}`\r\n      );\r\n    };\r\n\r\n    const finishConnection = (event) => {\r\n      if (!connectingFrom) return;\r\n\r\n      previewEdge.style.opacity = \"0\";\r\n      previewEdge.setAttribute(\"d\", \"\");\r\n\r\n      const targetElement = document\r\n        .elementFromPoint(\r\n          event.clientX,\r\n          event.clientY\r\n        )\r\n        ?.closest(\".healthNetworkBuilder__node\");\r\n\r\n      const targetId =\r\n        targetElement?.dataset.nodeId;\r\n\r\n      if (\r\n        targetId &&\r\n        targetId !== connectingFrom &&\r\n        nodeElements.has(targetId)\r\n      ) {\r\n        pendingConnection = {\r\n          from: connectingFrom,\r\n          to: targetId\r\n        };\r\n\r\n        dialogRoute.textContent =\r\n          `${getNodeData(connectingFrom).title} \u2192 ${getNodeData(targetId).title}`;\r\n\r\n        connectionDialog.hidden = false;\r\n      }\r\n\r\n      connectingFrom = null;\r\n    };\r\n\r\n    const assignTask = (taskId, nodeId) => {\r\n      const task = getTask(taskId);\r\n      const nodeIds =\r\n        assignments.get(taskId) || new Set();\r\n\r\n      if (nodeIds.has(nodeId)) {\r\n        nodeIds.delete(nodeId);\r\n      } else {\r\n        if (\r\n          task.maxAssignees &&\r\n          nodeIds.size >= task.maxAssignees\r\n        ) {\r\n          if (task.maxAssignees === 1) {\r\n            nodeIds.clear();\r\n          } else {\r\n            showTestMessage(\r\n              `A a\u00e7\u00e3o \u201c${task.title}\u201d aceita no m\u00e1ximo ${task.maxAssignees} respons\u00e1veis.`,\r\n              \"error\"\r\n            );\r\n            return;\r\n          }\r\n        }\r\n\r\n        nodeIds.add(nodeId);\r\n      }\r\n\r\n      if (nodeIds.size) {\r\n        assignments.set(taskId, nodeIds);\r\n      } else {\r\n        assignments.delete(taskId);\r\n      }\r\n\r\n      updateAll();\r\n      selectNode(nodeId, false);\r\n    };\r\n\r\n    const selectNode = (\r\n      nodeId,\r\n      allowAssignment = true\r\n    ) => {\r\n      if (\r\n        allowAssignment &&\r\n        selectedTaskId\r\n      ) {\r\n        assignTask(\r\n          selectedTaskId,\r\n          nodeId\r\n        );\r\n\r\n        return;\r\n      }\r\n\r\n      selectedNodeId = nodeId;\r\n\r\n      nodeElements.forEach((node, id) => {\r\n        node.classList.toggle(\r\n          \"is-selected\",\r\n          id === nodeId\r\n        );\r\n      });\r\n\r\n      renderInspector();\r\n    };\r\n\r\n    const bindNodeEvents = (\r\n      node,\r\n      removable\r\n    ) => {\r\n      const nodeId = node.dataset.nodeId;\r\n      const moveHandle = node.querySelector(\".healthNetworkBuilder__nodeMove\");\r\n      const removeButton = node.querySelector(\".healthNetworkBuilder__nodeRemove\");\r\n      const port = node.querySelector(\".healthNetworkBuilder__nodePort\");\r\n\r\n      node.addEventListener(\"click\", (event) => {\r\n        if (\r\n          event.target.closest(\".healthNetworkBuilder__nodeMove\") ||\r\n          event.target.closest(\".healthNetworkBuilder__nodeRemove\") ||\r\n          event.target.closest(\".healthNetworkBuilder__nodePort\")\r\n        ) return;\r\n\r\n        selectNode(nodeId);\r\n      });\r\n\r\n      node.addEventListener(\"dragover\", (event) => {\r\n        if (\r\n          !event.dataTransfer.types.includes(\r\n            \"application\/x-health-network-task\"\r\n          )\r\n        ) return;\r\n\r\n        event.preventDefault();\r\n        node.classList.add(\"is-drop-target\");\r\n      });\r\n\r\n      node.addEventListener(\"dragleave\", () => {\r\n        node.classList.remove(\"is-drop-target\");\r\n      });\r\n\r\n      node.addEventListener(\"drop\", (event) => {\r\n        const taskId = event.dataTransfer.getData(\r\n          \"application\/x-health-network-task\"\r\n        );\r\n\r\n        if (!taskId) return;\r\n\r\n        event.preventDefault();\r\n        node.classList.remove(\"is-drop-target\");\r\n        assignTask(taskId, nodeId);\r\n      });\r\n\r\n      port.addEventListener(\"pointerdown\", (event) => {\r\n        startConnection(nodeId, event);\r\n      });\r\n\r\n      moveHandle?.addEventListener(\r\n        \"pointerdown\",\r\n        (event) => {\r\n          if (isTesting) return;\r\n\r\n          const canvasRect =\r\n            canvas.getBoundingClientRect();\r\n\r\n          const nodeRect =\r\n            node.getBoundingClientRect();\r\n\r\n          draggingNode = node;\r\n\r\n          dragOffset = {\r\n            x:\r\n              event.clientX -\r\n              (\r\n                nodeRect.left -\r\n                canvasRect.left +\r\n                nodeRect.width \/ 2\r\n              ),\r\n            y:\r\n              event.clientY -\r\n              (\r\n                nodeRect.top -\r\n                canvasRect.top +\r\n                nodeRect.height \/ 2\r\n              )\r\n          };\r\n\r\n          event.preventDefault();\r\n          event.stopPropagation();\r\n        }\r\n      );\r\n\r\n      if (removable) {\r\n        removeButton.addEventListener(\r\n          \"click\",\r\n          (event) => {\r\n            event.stopPropagation();\r\n            removeActorNode(nodeId);\r\n          }\r\n        );\r\n      }\r\n    };\r\n\r\n    const hasConnection = (\r\n      from,\r\n      to,\r\n      allowedTypes = null\r\n    ) => {\r\n      const connection = connections.find(\r\n        (item) =>\r\n          item.from === from &&\r\n          item.to === to\r\n      );\r\n\r\n      if (!connection) return false;\r\n\r\n      return !allowedTypes ||\r\n        allowedTypes.includes(connection.type);\r\n    };\r\n\r\n    const evaluateCondition = (condition) => {\r\n      if (!condition) return false;\r\n\r\n      if (condition.type === \"actor\") {\r\n        return nodeElements.has(\r\n          condition.actorId\r\n        );\r\n      }\r\n\r\n      if (condition.type === \"connection\") {\r\n        return hasConnection(\r\n          condition.from,\r\n          condition.to,\r\n          condition.allowedTypes || null\r\n        );\r\n      }\r\n\r\n      if (condition.type === \"assignment\") {\r\n        const assigned =\r\n          assignments.get(condition.taskId) ||\r\n          new Set();\r\n\r\n        const nodeIds =\r\n          condition.nodeIds || [];\r\n\r\n        if (condition.mode === \"all\") {\r\n          return nodeIds.every(\r\n            (nodeId) => assigned.has(nodeId)\r\n          );\r\n        }\r\n\r\n        return nodeIds.some(\r\n          (nodeId) => assigned.has(nodeId)\r\n        );\r\n      }\r\n\r\n      return false;\r\n    };\r\n\r\n    const calculateMetrics = () => {\r\n      const values = Object.fromEntries(\r\n        config.metrics.map(\r\n          (metric) => [metric.id, 0]\r\n        )\r\n      );\r\n\r\n      config.metricRules.forEach((rule) => {\r\n        if (evaluateCondition(rule.condition)) {\r\n          values[rule.metric] =\r\n            (values[rule.metric] || 0) +\r\n            rule.points;\r\n        }\r\n      });\r\n\r\n      if (config.overload) {\r\n        const overload = config.overload;\r\n\r\n        const assignmentCount =\r\n          [...assignments.values()]\r\n            .filter((nodeIds) =>\r\n              nodeIds.has(overload.actorId)\r\n            )\r\n            .length;\r\n\r\n        const connectionCount =\r\n          connections.filter(\r\n            (connection) =>\r\n              connection.from === overload.actorId ||\r\n              connection.to === overload.actorId\r\n          ).length;\r\n\r\n        values[overload.metricId] = clamp(\r\n          Math.max(\r\n            0,\r\n            assignmentCount -\r\n              overload.freeAssignments\r\n          ) * overload.assignmentPenalty +\r\n          Math.max(\r\n            0,\r\n            connectionCount -\r\n              overload.freeConnections\r\n          ) * overload.connectionPenalty,\r\n          0,\r\n          100\r\n        );\r\n      }\r\n\r\n      config.metrics.forEach((metric) => {\r\n        values[metric.id] = clamp(\r\n          values[metric.id] || 0,\r\n          0,\r\n          100\r\n        );\r\n      });\r\n\r\n      const overall = Math.round(\r\n        config.metrics.reduce(\r\n          (sum, metric) =>\r\n            sum +\r\n            (\r\n              metric.inverse\r\n                ? 100 - values[metric.id]\r\n                : values[metric.id]\r\n            ),\r\n          0\r\n        ) \/ config.metrics.length\r\n      );\r\n\r\n      return { values, overall };\r\n    };\r\n\r\n    const renderMetric = (\r\n      metric,\r\n      value\r\n    ) => {\r\n      const element =\r\n        metricElements.get(metric.id);\r\n\r\n      const bar = element.querySelector(\"i\");\r\n      const label = element.querySelector(\"b\");\r\n\r\n      bar.style.width = `${value}%`;\r\n      label.textContent = `${value}%`;\r\n\r\n      element.classList.remove(\r\n        \"is-low\",\r\n        \"is-mid\",\r\n        \"is-high\"\r\n      );\r\n\r\n      if (value >= 70) {\r\n        element.classList.add(\"is-high\");\r\n      } else if (value >= 35) {\r\n        element.classList.add(\"is-mid\");\r\n      } else {\r\n        element.classList.add(\"is-low\");\r\n      }\r\n    };\r\n\r\n    const updateMetrics = () => {\r\n      const result = calculateMetrics();\r\n\r\n      config.metrics.forEach((metric) => {\r\n        renderMetric(\r\n          metric,\r\n          result.values[metric.id]\r\n        );\r\n      });\r\n\r\n      scoreValue.textContent =\r\n        `${result.overall}%`;\r\n\r\n      scoreLabel.textContent =\r\n        result.overall >= 80\r\n          ? \"Rede bem organizada\"\r\n          : result.overall >= 55\r\n            ? \"Rede parcialmente organizada\"\r\n            : result.overall >= 35\r\n              ? \"Rede com fragilidades\"\r\n              : \"Rede inicial\";\r\n    };\r\n\r\n    const renderTaskAssignments = () => {\r\n      taskCards.forEach((card, taskId) => {\r\n        const assignmentText =\r\n          card.querySelector(\r\n            \".healthNetworkBuilder__taskAssignment\"\r\n          );\r\n\r\n        const nodeIds =\r\n          assignments.get(taskId) ||\r\n          new Set();\r\n\r\n        assignmentText.textContent =\r\n          nodeIds.size\r\n            ? `Respons\u00e1veis: ${\r\n                [...nodeIds]\r\n                  .map(\r\n                    (id) =>\r\n                      getNodeData(id)?.short || id\r\n                  )\r\n                  .join(\", \")\r\n              }`\r\n            : \"\";\r\n      });\r\n\r\n      nodeElements.forEach(\r\n        (node, nodeId) => {\r\n          const count =\r\n            [...assignments.values()]\r\n              .filter((nodeIds) =>\r\n                nodeIds.has(nodeId)\r\n              )\r\n              .length;\r\n\r\n          const badge =\r\n            node.querySelector(\r\n              \".healthNetworkBuilder__nodeTaskCount\"\r\n            );\r\n\r\n          badge.textContent = String(count);\r\n          badge.hidden = count === 0;\r\n        }\r\n      );\r\n    };\r\n\r\n    const renderInspector = () => {\r\n      if (\r\n        !selectedNodeId ||\r\n        !nodeElements.has(selectedNodeId)\r\n      ) {\r\n        inspectorPlaceholder.hidden = false;\r\n        inspectorContent.hidden = true;\r\n        return;\r\n      }\r\n\r\n      const nodeData =\r\n        getNodeData(selectedNodeId);\r\n\r\n      inspectorPlaceholder.hidden = true;\r\n      inspectorContent.hidden = false;\r\n      inspectorIcon.textContent = nodeData.icon;\r\n      inspectorTitle.textContent = nodeData.title;\r\n      inspectorDescription.textContent =\r\n        nodeData.description;\r\n\r\n      inspectorConnections.innerHTML = \"\";\r\n      inspectorTasks.innerHTML = \"\";\r\n\r\n      const relatedConnections =\r\n        connections.filter(\r\n          (connection) =>\r\n            connection.from === selectedNodeId ||\r\n            connection.to === selectedNodeId\r\n        );\r\n\r\n      if (!relatedConnections.length) {\r\n        inspectorConnections.innerHTML =\r\n          '<span class=\"healthNetworkBuilder__miniTag healthNetworkBuilder__miniTag--empty\">Nenhuma conex\u00e3o<\/span>';\r\n      } else {\r\n        relatedConnections.forEach(\r\n          (connection) => {\r\n            const otherId =\r\n              connection.from === selectedNodeId\r\n                ? connection.to\r\n                : connection.from;\r\n\r\n            const direction =\r\n              connection.from === selectedNodeId\r\n                ? \"\u2192\"\r\n                : \"\u2190\";\r\n\r\n            const tag =\r\n              document.createElement(\"span\");\r\n\r\n            tag.className =\r\n              \"healthNetworkBuilder__miniTag\";\r\n\r\n            tag.textContent =\r\n              `${direction} ${getNodeData(otherId).short}: ${getConnectionType(connection.type).verb}`;\r\n\r\n            inspectorConnections.appendChild(tag);\r\n          }\r\n        );\r\n      }\r\n\r\n      const relatedTasks =\r\n        config.tasks.filter((task) =>\r\n          (\r\n            assignments.get(task.id) ||\r\n            new Set()\r\n          ).has(selectedNodeId)\r\n        );\r\n\r\n      if (!relatedTasks.length) {\r\n        inspectorTasks.innerHTML =\r\n          '<span class=\"healthNetworkBuilder__miniTag healthNetworkBuilder__miniTag--empty\">Nenhuma responsabilidade<\/span>';\r\n      } else {\r\n        relatedTasks.forEach((task) => {\r\n          const tag =\r\n            document.createElement(\"span\");\r\n\r\n          tag.className =\r\n            \"healthNetworkBuilder__miniTag\";\r\n\r\n          tag.textContent = task.title;\r\n          inspectorTasks.appendChild(tag);\r\n        });\r\n      }\r\n    };\r\n\r\n    const updateSteps = () => {\r\n      const states = [\r\n        nodeElements.size > 1,\r\n        connections.length > 0,\r\n        assignments.size > 0,\r\n        !feedbackSection.hidden\r\n      ];\r\n\r\n      let current =\r\n        states.findIndex((state) => !state);\r\n\r\n      if (current === -1) current = 3;\r\n\r\n      stepIndicators.forEach(\r\n        (indicator, index) => {\r\n          indicator.classList.toggle(\r\n            \"is-complete\",\r\n            states[index]\r\n          );\r\n\r\n          indicator.classList.toggle(\r\n            \"is-current\",\r\n            index === current\r\n          );\r\n        }\r\n      );\r\n    };\r\n\r\n    const updateAll = () => {\r\n      renderTaskAssignments();\r\n      renderInspector();\r\n      updateMetrics();\r\n      updateSteps();\r\n    };\r\n\r\n    const showTestMessage = (\r\n      text,\r\n      type\r\n    ) => {\r\n      testMessage.hidden = false;\r\n      testMessage.className =\r\n        \"healthNetworkBuilder__testMessage\";\r\n\r\n      if (type) {\r\n        testMessage.classList.add(\r\n          `is-${type}`\r\n        );\r\n      }\r\n\r\n      testMessage.textContent = text;\r\n    };\r\n\r\n    const animateAlongPath = (\r\n      path,\r\n      duration = 850\r\n    ) =>\r\n      new Promise((resolve) => {\r\n        const length = path.getTotalLength();\r\n        const startTime = performance.now();\r\n\r\n        path.classList.add(\"is-testing\");\r\n        packet.style.opacity = \"1\";\r\n\r\n        const tick = (time) => {\r\n          const progress = Math.min(\r\n            1,\r\n            (time - startTime) \/ duration\r\n          );\r\n\r\n          const point =\r\n            path.getPointAtLength(\r\n              length * progress\r\n            );\r\n\r\n          packet.setAttribute(\r\n            \"cx\",\r\n            String(point.x)\r\n          );\r\n\r\n          packet.setAttribute(\r\n            \"cy\",\r\n            String(point.y)\r\n          );\r\n\r\n          if (progress < 1) {\r\n            requestAnimationFrame(tick);\r\n          } else {\r\n            path.classList.remove(\"is-testing\");\r\n            resolve();\r\n          }\r\n        };\r\n\r\n        requestAnimationFrame(tick);\r\n      });\r\n\r\n    const getRenderedEdge = (\r\n      from,\r\n      to\r\n    ) =>\r\n      edgeLayer.querySelector(\r\n        `[data-key=\"${CSS.escape(edgeKey(from, to))}\"]`\r\n      );\r\n\r\n    const generateFeedback = (\r\n      routeSuccess\r\n    ) => {\r\n      const strengths = [];\r\n      const gaps = [];\r\n\r\n      config.feedback.forEach((item) => {\r\n        if (evaluateCondition(item.condition)) {\r\n          strengths.push(item.success);\r\n        } else {\r\n          gaps.push(item.failure);\r\n        }\r\n      });\r\n\r\n      feedbackSection.hidden = false;\r\n      feedbackStatus.className =\r\n        \"healthNetworkBuilder__feedbackStatus\";\r\n\r\n      if (\r\n        routeSuccess &&\r\n        gaps.length === 0\r\n      ) {\r\n        feedbackStatus.classList.add(\r\n          \"is-success\"\r\n        );\r\n\r\n        feedbackStatus.textContent =\r\n          \"Fluxo conclu\u00eddo e crit\u00e9rios principais atendidos.\";\r\n      } else if (routeSuccess) {\r\n        feedbackStatus.classList.add(\r\n          \"is-partial\"\r\n        );\r\n\r\n        feedbackStatus.textContent =\r\n          \"O fluxo funciona, mas a rede ainda possui fragilidades.\";\r\n      } else {\r\n        feedbackStatus.classList.add(\r\n          \"is-error\"\r\n        );\r\n\r\n        feedbackStatus.textContent =\r\n          \"O fluxo foi interrompido. A rede precisa ser reparada.\";\r\n      }\r\n\r\n      strengthsList.innerHTML = \"\";\r\n      gapsList.innerHTML = \"\";\r\n\r\n      (\r\n        strengths.length\r\n          ? strengths\r\n          : [\"A rede ainda est\u00e1 em constru\u00e7\u00e3o.\"]\r\n      ).forEach((text) => {\r\n        const item =\r\n          document.createElement(\"li\");\r\n\r\n        item.textContent = text;\r\n        strengthsList.appendChild(item);\r\n      });\r\n\r\n      (\r\n        gaps.length\r\n          ? gaps\r\n          : [\"Nenhum ajuste cr\u00edtico identificado.\"]\r\n      ).forEach((text) => {\r\n        const item =\r\n          document.createElement(\"li\");\r\n\r\n        item.textContent = text;\r\n        gapsList.appendChild(item);\r\n      });\r\n\r\n      updateSteps();\r\n    };\r\n\r\n    const testRoute = async () => {\r\n      if (isTesting) return;\r\n\r\n      const route = getCurrentRoute();\r\n\r\n      isTesting = true;\r\n      testButton.disabled = true;\r\n\r\n      showTestMessage(\r\n        \"Testando o fluxo...\",\r\n        \"\"\r\n      );\r\n\r\n      packet.style.opacity = \"0\";\r\n\r\n      let success = true;\r\n      let failureText = \"\";\r\n\r\n      for (const step of route.steps) {\r\n        if (\r\n          !nodeElements.has(step.from) ||\r\n          !nodeElements.has(step.to)\r\n        ) {\r\n          success = false;\r\n\r\n          const missingId =\r\n            !nodeElements.has(step.from)\r\n              ? step.from\r\n              : step.to;\r\n\r\n          failureText =\r\n            `O ator \u201c${getNodeData(missingId)?.title || missingId}\u201d ainda n\u00e3o foi adicionado.`;\r\n\r\n          break;\r\n        }\r\n\r\n        if (\r\n          !hasConnection(\r\n            step.from,\r\n            step.to,\r\n            step.allowedTypes\r\n          )\r\n        ) {\r\n          success = false;\r\n          failureText = step.missingText;\r\n          break;\r\n        }\r\n\r\n        const path =\r\n          getRenderedEdge(\r\n            step.from,\r\n            step.to\r\n          );\r\n\r\n        await animateAlongPath(path);\r\n      }\r\n\r\n      packet.style.opacity = \"0\";\r\n\r\n      if (success) {\r\n        showTestMessage(\r\n          route.successMessage,\r\n          \"success\"\r\n        );\r\n      } else {\r\n        showTestMessage(\r\n          failureText,\r\n          \"error\"\r\n        );\r\n      }\r\n\r\n      generateFeedback(success);\r\n\r\n      isTesting = false;\r\n      testButton.disabled = false;\r\n    };\r\n\r\n    const renderAnswer = () => {\r\n      const answer = config.answer;\r\n\r\n      answerTitle.textContent = answer.title;\r\n      answerIntro.textContent = answer.intro;\r\n      answerExplanation.textContent =\r\n        answer.explanation;\r\n\r\n      answerActors.innerHTML = \"\";\r\n      answerConnections.innerHTML = \"\";\r\n      answerAssignments.innerHTML = \"\";\r\n\r\n      answer.actors.forEach((actorId) => {\r\n        const tag =\r\n          document.createElement(\"span\");\r\n\r\n        tag.textContent =\r\n          getNodeData(actorId).title;\r\n\r\n        answerActors.appendChild(tag);\r\n      });\r\n\r\n      answer.connections.forEach(\r\n        (connection) => {\r\n          const item =\r\n            document.createElement(\"li\");\r\n\r\n          item.innerHTML =\r\n            `${getNodeData(connection.from).title} \u2192 ${getNodeData(connection.to).title}: <b>${getConnectionType(connection.type).verb}<\/b>`;\r\n\r\n          answerConnections.appendChild(item);\r\n        }\r\n      );\r\n\r\n      Object.entries(\r\n        answer.assignments\r\n      ).forEach(([taskId, nodeIds]) => {\r\n        const item =\r\n          document.createElement(\"li\");\r\n\r\n        item.innerHTML =\r\n          `${getTask(taskId).title} \u2192 <b>${\r\n            nodeIds\r\n              .map(\r\n                (id) =>\r\n                  getNodeData(id).title\r\n              )\r\n              .join(\" + \")\r\n          }<\/b>`;\r\n\r\n        answerAssignments.appendChild(item);\r\n      });\r\n    };\r\n\r\n    const applyAnswer = () => {\r\n      resetState(false);\r\n\r\n      config.answer.actors.forEach(\r\n        (actorId) => {\r\n          const actor =\r\n            config.actors.find(\r\n              (item) => item.id === actorId\r\n            );\r\n\r\n          createActorNode(actor);\r\n        }\r\n      );\r\n\r\n      connections =\r\n        config.answer.connections.map(\r\n          (connection) => ({\r\n            ...connection\r\n          })\r\n        );\r\n\r\n      Object.entries(\r\n        config.answer.assignments\r\n      ).forEach(([taskId, nodeIds]) => {\r\n        assignments.set(\r\n          taskId,\r\n          new Set(nodeIds)\r\n        );\r\n      });\r\n\r\n      answerDialog.hidden = true;\r\n      selectedNodeId = centralNodeId;\r\n\r\n      drawConnections();\r\n      updateAll();\r\n\r\n      showTestMessage(\r\n        \"Gabarito aplicado. Teste o fluxo e observe os indicadores.\",\r\n        \"success\"\r\n      );\r\n    };\r\n\r\n    const clearConnections = () => {\r\n      connections = [];\r\n      drawConnections();\r\n      updateAll();\r\n    };\r\n\r\n    const resetState = (\r\n      showMessage = false\r\n    ) => {\r\n      nodesWrap.innerHTML = \"\";\r\n      connections = [];\r\n      assignments = new Map();\r\n      nodeElements = new Map();\r\n      actorCards.forEach((card) =>\r\n        card.classList.remove(\"is-added\")\r\n      );\r\n\r\n      taskCards.forEach((card) =>\r\n        card.classList.remove(\"is-selected\")\r\n      );\r\n\r\n      selectedTaskId = null;\r\n      selectedNodeId = null;\r\n      pendingConnection = null;\r\n      connectingFrom = null;\r\n      feedbackSection.hidden = true;\r\n\r\n      createCentralNode();\r\n      emptyHint.style.opacity = \"1\";\r\n      drawConnections();\r\n      updateAll();\r\n\r\n      if (showMessage) {\r\n        testMessage.hidden = true;\r\n      }\r\n    };\r\n\r\n    const loadScenario = (scenarioKey) => {\r\n      config =\r\n        CARE_NETWORK_SCENARIOS[scenarioKey];\r\n\r\n      centralNodeId =\r\n        config.centralNode.id;\r\n\r\n      title.textContent = config.title;\r\n      intro.textContent = config.intro;\r\n\r\n      renderMarkers();\r\n      renderConnectionTypeButtons();\r\n      renderActorPalette();\r\n      renderTaskPalette();\r\n      renderMetrics();\r\n      renderRoutes();\r\n      renderAnswer();\r\n      resetState(true);\r\n    };\r\n\r\n    canvas.addEventListener(\r\n      \"dragover\",\r\n      (event) => {\r\n        if (\r\n          event.dataTransfer.types.includes(\r\n            \"application\/x-health-network-actor\"\r\n          )\r\n        ) {\r\n          event.preventDefault();\r\n          canvas.classList.add(\r\n            \"is-drop-target\"\r\n          );\r\n        }\r\n      }\r\n    );\r\n\r\n    canvas.addEventListener(\r\n      \"dragleave\",\r\n      () => {\r\n        canvas.classList.remove(\r\n          \"is-drop-target\"\r\n        );\r\n      }\r\n    );\r\n\r\n    canvas.addEventListener(\r\n      \"drop\",\r\n      (event) => {\r\n        const actorId =\r\n          event.dataTransfer.getData(\r\n            \"application\/x-health-network-actor\"\r\n          );\r\n\r\n        canvas.classList.remove(\r\n          \"is-drop-target\"\r\n        );\r\n\r\n        if (!actorId) return;\r\n\r\n        event.preventDefault();\r\n\r\n        const actor =\r\n          config.actors.find(\r\n            (item) => item.id === actorId\r\n          );\r\n\r\n        if (\r\n          !actor ||\r\n          nodeElements.has(actorId)\r\n        ) return;\r\n\r\n        const point = getCanvasPoint(\r\n          event.clientX,\r\n          event.clientY\r\n        );\r\n\r\n        const rect =\r\n          canvas.getBoundingClientRect();\r\n\r\n        createActorNode(\r\n          actor,\r\n          (point.x \/ rect.width) * 100,\r\n          (point.y \/ rect.height) * 100\r\n        );\r\n      }\r\n    );\r\n\r\n    canvas.addEventListener(\r\n      \"pointermove\",\r\n      (event) => {\r\n        if (draggingNode) {\r\n          setNodePositionFromPointer(\r\n            draggingNode,\r\n            event.clientX,\r\n            event.clientY\r\n          );\r\n        }\r\n\r\n        moveConnectionPreview(event);\r\n      }\r\n    );\r\n\r\n    window.addEventListener(\r\n      \"pointerup\",\r\n      (event) => {\r\n        if (draggingNode) {\r\n          draggingNode = null;\r\n          updateAll();\r\n        }\r\n\r\n        finishConnection(event);\r\n      }\r\n    );\r\n\r\n    scenarioSelect.addEventListener(\r\n      \"change\",\r\n      () => {\r\n        loadScenario(\r\n          scenarioSelect.value\r\n        );\r\n      }\r\n    );\r\n\r\n    routeSelect.addEventListener(\r\n      \"change\",\r\n      updateRouteCopy\r\n    );\r\n\r\n    answerButton.addEventListener(\r\n      \"click\",\r\n      () => {\r\n        answerDialog.hidden = false;\r\n      }\r\n    );\r\n\r\n    answerClose.addEventListener(\r\n      \"click\",\r\n      () => {\r\n        answerDialog.hidden = true;\r\n      }\r\n    );\r\n\r\n    answerBackdrop.addEventListener(\r\n      \"click\",\r\n      () => {\r\n        answerDialog.hidden = true;\r\n      }\r\n    );\r\n\r\n    answerApply.addEventListener(\r\n      \"click\",\r\n      applyAnswer\r\n    );\r\n\r\n    dialogCancel.addEventListener(\r\n      \"click\",\r\n      () => {\r\n        pendingConnection = null;\r\n        connectionDialog.hidden = true;\r\n      }\r\n    );\r\n\r\n    connectionBackdrop.addEventListener(\r\n      \"click\",\r\n      () => {\r\n        pendingConnection = null;\r\n        connectionDialog.hidden = true;\r\n      }\r\n    );\r\n\r\n    testButton.addEventListener(\r\n      \"click\",\r\n      testRoute\r\n    );\r\n\r\n    clearConnectionsButton.addEventListener(\r\n      \"click\",\r\n      clearConnections\r\n    );\r\n\r\n    resetButton.addEventListener(\r\n      \"click\",\r\n      () => resetState(true)\r\n    );\r\n\r\n    const requestRedraw = () => {\r\n      if (resizeFrame) {\r\n        cancelAnimationFrame(resizeFrame);\r\n      }\r\n\r\n      resizeFrame =\r\n        requestAnimationFrame(() => {\r\n          drawConnections();\r\n          resizeFrame = null;\r\n        });\r\n    };\r\n\r\n    window.addEventListener(\r\n      \"resize\",\r\n      requestRedraw\r\n    );\r\n\r\n    if (\"ResizeObserver\" in window) {\r\n      const observer =\r\n        new ResizeObserver(requestRedraw);\r\n\r\n      observer.observe(canvas);\r\n    }\r\n\r\n    renderScenarioOptions();\r\n    loadScenario(\r\n      Object.keys(\r\n        CARE_NETWORK_SCENARIOS\r\n      )[0]\r\n    );\r\n  });\r\n})();\r\n<\/script>\r\n\r\n<\/body>\r\n<\/html>\r\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t\t\t<\/div>\n\t\t","protected":false},"excerpt":{"rendered":"<p>Teia Gen\u00e9rica de Redes em Sa\u00fade \u2014 com APS<\/p>\n","protected":false},"author":5,"featured_media":0,"parent":0,"menu_order":0,"comment_status":"closed","ping_status":"closed","template":"","meta":{"footnotes":""},"class_list":["post-43073","page","type-page","status-publish","hentry"],"_links":{"self":[{"href":"https:\/\/cursos1.nead.conasems.org.br\/index.php\/wp-json\/wp\/v2\/pages\/43073","targetHints":{"allow":["GET"]}}],"collection":[{"href":"https:\/\/cursos1.nead.conasems.org.br\/index.php\/wp-json\/wp\/v2\/pages"}],"about":[{"href":"https:\/\/cursos1.nead.conasems.org.br\/index.php\/wp-json\/wp\/v2\/types\/page"}],"author":[{"embeddable":true,"href":"https:\/\/cursos1.nead.conasems.org.br\/index.php\/wp-json\/wp\/v2\/users\/5"}],"replies":[{"embeddable":true,"href":"https:\/\/cursos1.nead.conasems.org.br\/index.php\/wp-json\/wp\/v2\/comments?post=43073"}],"version-history":[{"count":4,"href":"https:\/\/cursos1.nead.conasems.org.br\/index.php\/wp-json\/wp\/v2\/pages\/43073\/revisions"}],"predecessor-version":[{"id":43077,"href":"https:\/\/cursos1.nead.conasems.org.br\/index.php\/wp-json\/wp\/v2\/pages\/43073\/revisions\/43077"}],"wp:attachment":[{"href":"https:\/\/cursos1.nead.conasems.org.br\/index.php\/wp-json\/wp\/v2\/media?parent=43073"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}