{
  "openapi": "3.1.0",
  "info": {
    "title": "Informal Movelaria API & Agent Services",
    "description": "API pública REST versionada (v1), serviços para agentes autônomos e Model Context Protocol (MCP) da Informal Movelaria — Indústria de móveis planejados de alto padrão em Poços de Caldas (MG) e Mogi Mirim (SP) desde 2002.\n\n### API Versioning & Deprecation Policy\nAll Informal Movelaria APIs follow explicit URL path versioning (/v1/, /v2/). Active versions are guaranteed stable with no breaking schema alterations within the same major version. When an endpoint or version is scheduled for retirement:\n1. A minimum 6-month advance notice is published in API documentation and developer portal.\n2. Deprecation is signaled on every HTTP response via the RFC 8594 standard headers `Sunset` (e.g. `Sunset: Wed, 01 Sep 2027 00:00:00 GMT`) and `Deprecation: true`.\n3. Structured migration hints and resolution paths are embedded in RFC 9457 error payloads.\n\n### Rate Limiting Policy\nAll API endpoints enforce a rate limit of 120 requests per minute per IP. Standard IETF headers are returned on all responses: `RateLimit-Limit`, `RateLimit-Remaining`, `RateLimit-Reset`, and `RateLimit-Policy`. Upon exceeding the limit, HTTP 429 Too Many Requests is returned with a `Retry-After` header and an RFC 9457 Problem Details payload.",
    "version": "1.0.0",
    "x-api-versioning": {
      "strategy": "path",
      "current_version": "v1",
      "supported_versions": ["v1"],
      "deprecation_notice_window": "P6M",
      "headers": {
        "sunset": "Sunset",
        "deprecation": "Deprecation"
      },
      "documentation_url": "https://informal-movelaria.vercel.app/docs#versioning"
    },
    "contact": {
      "name": "Informal Movelaria Suporte Técnico",
      "email": "contato@informalmovelaria.com.br",
      "url": "https://informal-movelaria.vercel.app/"
    }
  },
  "servers": [
    {
      "url": "https://informal-movelaria.vercel.app/v1",
      "description": "Informal Movelaria v1 Production API"
    },
    {
      "url": "https://informal-movelaria.vercel.app",
      "description": "Servidor de Produção Global (Root & MCP)"
    }
  ],
  "paths": {
    "/v1": {
      "get": {
        "summary": "REST API Root & Directory",
        "description": "Retorna o índice operacional da API REST v1, status e mapa de recursos disponíveis para agentes.",
        "operationId": "getApiV1Index",
        "responses": {
          "200": {
            "description": "Índice de recursos e status da API v1",
            "headers": {
              "RateLimit-Limit": { "$ref": "#/components/headers/RateLimit-Limit" },
              "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimit-Remaining" },
              "RateLimit-Reset": { "$ref": "#/components/headers/RateLimit-Reset" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/ApiIndexResponse" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "500": { "$ref": "#/components/responses/InternalServerError" }
        }
      }
    },
    "/v1/company": {
      "get": {
        "summary": "Informações Corporativas da Empresa",
        "description": "Retorna histórico, parque fabril CNC, diferenciais técnicos de marcenaria, garantia de 5 anos e dados de contato da Informal Movelaria.",
        "operationId": "getCompanyInfo",
        "responses": {
          "200": {
            "description": "Dados cadastrais e técnicos da Informal Movelaria",
            "headers": {
              "RateLimit-Limit": { "$ref": "#/components/headers/RateLimit-Limit" },
              "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimit-Remaining" },
              "RateLimit-Reset": { "$ref": "#/components/headers/RateLimit-Reset" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/CompanyInfo" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "500": { "$ref": "#/components/responses/InternalServerError" }
        }
      }
    },
    "/v1/showrooms": {
      "get": {
        "summary": "Lista de Showrooms e Unidades Físicas",
        "description": "Retorna endereços completos, telefones, canais de WhatsApp e horários de funcionamento em Poços de Caldas (MG) e Mogi Mirim (SP).",
        "operationId": "listShowrooms",
        "responses": {
          "200": {
            "description": "Lista de unidades físicas e showrooms",
            "headers": {
              "RateLimit-Limit": { "$ref": "#/components/headers/RateLimit-Limit" },
              "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimit-Remaining" },
              "RateLimit-Reset": { "$ref": "#/components/headers/RateLimit-Reset" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/ShowroomListResponse" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "500": { "$ref": "#/components/responses/InternalServerError" }
        }
      }
    },
    "/v1/ambientes": {
      "get": {
        "summary": "Catálogo de Ambientes Planejados",
        "description": "Retorna as categorias de ambientes sob medida desenvolvidas pela Informal Movelaria (Cozinhas, Closets, Living, Dormitórios, Corporativo).",
        "operationId": "listAmbientes",
        "responses": {
          "200": {
            "description": "Lista de categorias de ambientes planejados",
            "headers": {
              "RateLimit-Limit": { "$ref": "#/components/headers/RateLimit-Limit" },
              "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimit-Remaining" },
              "RateLimit-Reset": { "$ref": "#/components/headers/RateLimit-Reset" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/AmbienteListResponse" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "500": { "$ref": "#/components/responses/InternalServerError" }
        }
      }
    },
    "/v1/ambientes/{id}": {
      "get": {
        "summary": "Detalhes de um Ambiente Planejado Específico",
        "description": "Obtém especificações de arquitetura, ferragens recomendadas e diferenciais de acabamento para um determinado ambiente.",
        "operationId": "getAmbienteDetails",
        "parameters": [
          {
            "name": "id",
            "in": "path",
            "required": true,
            "description": "Identificador único do ambiente (ex: cozinhas, closets, living, dormitorios, corporativo)",
            "schema": {
              "type": "string",
              "enum": ["cozinhas", "closets", "living", "dormitorios", "corporativo"]
            }
          }
        ],
        "responses": {
          "200": {
            "description": "Especificações detalhadas do ambiente",
            "headers": {
              "RateLimit-Limit": { "$ref": "#/components/headers/RateLimit-Limit" },
              "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimit-Remaining" },
              "RateLimit-Reset": { "$ref": "#/components/headers/RateLimit-Reset" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/Ambiente" }
              }
            }
          },
          "404": { "$ref": "#/components/responses/NotFound" },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "500": { "$ref": "#/components/responses/InternalServerError" }
        }
      }
    },
    "/v1/blog": {
      "get": {
        "summary": "Artigos Técnicos e Conteúdo de Marcenaria",
        "description": "Retorna lista de artigos informativos e guias técnicos sobre materiais (MDF, MDP, lâminas nobres), ferragens e design de interiores.",
        "operationId": "listBlogPosts",
        "responses": {
          "200": {
            "description": "Lista de publicações do blog técnico",
            "headers": {
              "RateLimit-Limit": { "$ref": "#/components/headers/RateLimit-Limit" },
              "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimit-Remaining" },
              "RateLimit-Reset": { "$ref": "#/components/headers/RateLimit-Reset" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/BlogListResponse" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "500": { "$ref": "#/components/responses/InternalServerError" }
        }
      }
    },
    "/v1/quote": {
      "post": {
        "summary": "Solicitação de Orçamento e Consultoria Técnica",
        "description": "Recebe requisitos de um projeto de móveis sob medida e gera um protocolo de atendimento para contato consultivo.",
        "operationId": "createQuoteRequest",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/QuoteRequest" }
            }
          }
        },
        "responses": {
          "201": {
            "description": "Solicitação registrada com sucesso",
            "headers": {
              "RateLimit-Limit": { "$ref": "#/components/headers/RateLimit-Limit" },
              "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimit-Remaining" },
              "RateLimit-Reset": { "$ref": "#/components/headers/RateLimit-Reset" }
            },
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/QuoteResponse" }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "429": { "$ref": "#/components/responses/TooManyRequests" },
          "500": { "$ref": "#/components/responses/InternalServerError" }
        }
      }
    },
    "/.well-known/mcp": {
      "get": {
        "summary": "MCP Server Discovery & Handshake Manifest",
        "description": "Retorna o manifesto de descoberta e os metadados do servidor MCP para clientes e agentes (Claude, ChatGPT, Cursor, etc.).",
        "operationId": "getMcpHandshake",
        "responses": {
          "200": {
            "description": "Manifesto MCP e metadados de conexão com transporte Streamable HTTP",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/McpManifest" }
              }
            }
          },
          "429": { "$ref": "#/components/responses/TooManyRequests" }
        }
      }
    },
    "/api/mcp": {
      "post": {
        "summary": "MCP Streamable HTTP JSON-RPC Endpoint",
        "description": "Executa métodos do Model Context Protocol (initialize, ping, tools/list, tools/call) para consulta e interação de agentes.",
        "operationId": "callMcpMethod",
        "requestBody": {
          "required": true,
          "content": {
            "application/json": {
              "schema": { "$ref": "#/components/schemas/JsonRpcRequest" }
            }
          }
        },
        "responses": {
          "200": {
            "description": "Resultado da invocação JSON-RPC 2.0 do servidor MCP",
            "content": {
              "application/json": {
                "schema": { "$ref": "#/components/schemas/JsonRpcResponse" }
              }
            }
          },
          "400": { "$ref": "#/components/responses/BadRequest" },
          "429": { "$ref": "#/components/responses/TooManyRequests" }
        }
      }
    },
    "/llms.txt": {
      "get": {
        "summary": "Diretório Padronizado de Agentes LLM (llmstxt.org)",
        "description": "Retorna o índice padronizado para modelos de linguagem e agentes inteligentes contendo orientação 'when-to-use'.",
        "operationId": "getLlmsTxt",
        "responses": {
          "200": {
            "description": "Arquivo de texto conforme especificação llmstxt.org",
            "content": {
              "text/plain": {
                "schema": { "type": "string" }
              }
            }
          }
        }
      }
    },
    "/index.md": {
      "get": {
        "summary": "Representação Markdown da Página Principal",
        "description": "Retorna o conteúdo completo do site em formato Markdown puro para agentes e parsers de texto.",
        "operationId": "getMarkdownIndex",
        "responses": {
          "200": {
            "description": "Conteúdo em Markdown puro",
            "content": {
              "text/markdown": {
                "schema": { "type": "string" }
              }
            }
          }
        }
      }
    }
  },
  "components": {
    "headers": {
      "RateLimit-Limit": {
        "description": "Número máximo de requisições permitidas na janela de medição (120)",
        "schema": { "type": "integer", "example": 120 }
      },
      "RateLimit-Remaining": {
        "description": "Número de requisições restantes na janela atual",
        "schema": { "type": "integer", "example": 119 }
      },
      "RateLimit-Reset": {
        "description": "Segundos restantes até a janela de medição ser reiniciada",
        "schema": { "type": "integer", "example": 60 }
      },
      "Retry-After": {
        "description": "Segundos de espera recomendados antes de enviar nova requisição após status 429",
        "schema": { "type": "integer", "example": 60 }
      }
    },
    "responses": {
      "BadRequest": {
        "description": "Requisição inválida ou parâmetros ausentes (RFC 9457)",
        "content": {
          "application/problem+json": {
            "schema": { "$ref": "#/components/schemas/ProblemDetails" }
          }
        }
      },
      "NotFound": {
        "description": "Recurso solicitado não foi encontrado (RFC 9457)",
        "content": {
          "application/problem+json": {
            "schema": { "$ref": "#/components/schemas/ProblemDetails" }
          }
        }
      },
      "TooManyRequests": {
        "description": "Limite de requisições por minuto excedido (RFC 9457)",
        "headers": {
          "Retry-After": { "$ref": "#/components/headers/Retry-After" },
          "RateLimit-Limit": { "$ref": "#/components/headers/RateLimit-Limit" },
          "RateLimit-Remaining": { "$ref": "#/components/headers/RateLimit-Remaining" },
          "RateLimit-Reset": { "$ref": "#/components/headers/RateLimit-Reset" }
        },
        "content": {
          "application/problem+json": {
            "schema": { "$ref": "#/components/schemas/ProblemDetails" }
          }
        }
      },
      "InternalServerError": {
        "description": "Erro interno inesperado no servidor (RFC 9457)",
        "content": {
          "application/problem+json": {
            "schema": { "$ref": "#/components/schemas/ProblemDetails" }
          }
        }
      }
    },
    "schemas": {
      "ProblemDetails": {
        "type": "object",
        "required": ["type", "title", "status", "detail", "code"],
        "description": "Modelo de erro padronizado conforme RFC 9457 (Problem Details for HTTP APIs)",
        "properties": {
          "type": {
            "type": "string",
            "format": "uri",
            "description": "URI identificando a categoria do problema",
            "example": "https://informal-movelaria.vercel.app/docs/errors#resource-not-found"
          },
          "title": {
            "type": "string",
            "description": "Título curto legível por humanos descrevendo a classe de erro",
            "example": "Resource Not Found"
          },
          "status": {
            "type": "integer",
            "description": "Código de status HTTP associado",
            "example": 404
          },
          "detail": {
            "type": "string",
            "description": "Descrição detalhada específica da ocorrência do erro",
            "example": "The requested endpoint '/v1/unknown' does not exist."
          },
          "instance": {
            "type": "string",
            "description": "URI ou rota específica onde o erro ocorreu",
            "example": "/v1/unknown"
          },
          "code": {
            "type": "string",
            "description": "Código de erro legível por máquina para tratamento por agentes",
            "example": "ERR_RESOURCE_NOT_FOUND"
          },
          "hint": {
            "type": "string",
            "description": "Orientação acionável para o agente de IA contornar ou resolver a falha",
            "example": "Inspect /api/openapi.json or GET /v1 for valid resources."
          }
        }
      },
      "ApiIndexResponse": {
        "type": "object",
        "required": ["name", "version", "status", "documentation", "endpoints"],
        "properties": {
          "name": { "type": "string", "example": "Informal Movelaria REST API" },
          "version": { "type": "string", "example": "v1" },
          "status": { "type": "string", "example": "operational" },
          "documentation": { "type": "string", "format": "uri", "example": "https://informal-movelaria.vercel.app/docs" },
          "openapi": { "type": "string", "format": "uri", "example": "https://informal-movelaria.vercel.app/api/openapi.json" },
          "mcp": { "type": "string", "format": "uri", "example": "https://informal-movelaria.vercel.app/.well-known/mcp" },
          "endpoints": {
            "type": "object",
            "properties": {
              "company": { "type": "string", "example": "/v1/company" },
              "showrooms": { "type": "string", "example": "/v1/showrooms" },
              "ambientes": { "type": "string", "example": "/v1/ambientes" },
              "blog": { "type": "string", "example": "/v1/blog" },
              "quote": { "type": "string", "example": "/v1/quote" }
            }
          },
          "versioningPolicy": {
            "type": "object",
            "properties": {
              "current": { "type": "string", "example": "v1" },
              "deprecationNoticePeriod": { "type": "string", "example": "6 months minimum" },
              "sunsetHeader": { "type": "string", "example": "Sunset (RFC 8594)" },
              "deprecationHeader": { "type": "string", "example": "Deprecation" }
            }
          }
        }
      },
      "CompanyInfo": {
        "type": "object",
        "required": ["name", "foundedYear", "description", "headquarters", "factory"],
        "properties": {
          "name": { "type": "string", "example": "Informal Movelaria" },
          "legalName": { "type": "string", "example": "Informal Movelaria LTDA" },
          "brand": { "type": "string", "example": "Informal Movelaria" },
          "foundedYear": { "type": "integer", "example": 2002 },
          "foundingDate": { "type": "string", "example": "2002-08-20" },
          "experienceYears": { "type": "integer", "example": 24 },
          "description": { "type": "string" },
          "headquarters": {
            "type": "object",
            "properties": {
              "streetAddress": { "type": "string", "example": "Rua Antônio Bortolan, 46" },
              "city": { "type": "string", "example": "Poços de Caldas" },
              "state": { "type": "string", "example": "MG" },
              "postalCode": { "type": "string", "example": "37704-266" },
              "telephone": { "type": "string", "example": "+55 (35) 3714-3546" },
              "whatsapp": { "type": "string", "example": "+55 (35) 99191-1568" },
              "email": { "type": "string", "format": "email", "example": "contato@informalmovelaria.com.br" }
            }
          },
          "factory": {
            "type": "object",
            "properties": {
              "technology": { "type": "string" },
              "leadTime": { "type": "string", "example": "35 a 45 dias úteis" },
              "warrantyYears": { "type": "integer", "example": 5 },
              "installationTeam": { "type": "string" },
              "sustainableSourcing": { "type": "string" }
            }
          }
        }
      },
      "Showroom": {
        "type": "object",
        "required": ["id", "city", "state", "address", "telephone", "whatsapp", "hours"],
        "properties": {
          "id": { "type": "string", "example": "pocos-de-caldas" },
          "city": { "type": "string", "example": "Poços de Caldas" },
          "state": { "type": "string", "example": "MG" },
          "type": { "type": "string", "example": "Fábrica Própria & Showroom Principal" },
          "address": { "type": "string", "example": "Rua Antônio Bortolan, 46" },
          "neighborhood": { "type": "string", "example": "Jardim Country Club" },
          "postalCode": { "type": "string", "example": "37704-266" },
          "telephone": { "type": "string", "example": "+55 (35) 3714-3546" },
          "whatsapp": { "type": "string", "example": "+55 (35) 99191-1568" },
          "whatsappUrl": { "type": "string", "format": "uri" },
          "email": { "type": "string", "format": "email" },
          "hours": { "type": "string", "example": "Segunda a Sexta-feira: 08:00 às 18:00" },
          "coordinates": {
            "type": "object",
            "properties": {
              "latitude": { "type": "number", "example": -21.7584167 },
              "longitude": { "type": "number", "example": -46.6111306 }
            }
          }
        }
      },
      "ShowroomListResponse": {
        "type": "object",
        "required": ["showrooms"],
        "properties": {
          "showrooms": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/Showroom" }
          }
        }
      },
      "Ambiente": {
        "type": "object",
        "required": ["id", "name", "description", "highlights"],
        "properties": {
          "id": { "type": "string", "example": "cozinhas" },
          "name": { "type": "string", "example": "Cozinhas Planejadas & Espaço Gourmet" },
          "description": { "type": "string" },
          "highlights": {
            "type": "array",
            "items": { "type": "string" }
          }
        }
      },
      "AmbienteListResponse": {
        "type": "object",
        "required": ["ambientes"],
        "properties": {
          "ambientes": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/Ambiente" }
          }
        }
      },
      "BlogPost": {
        "type": "object",
        "required": ["id", "slug", "title", "summary", "category", "readTime", "url"],
        "properties": {
          "id": { "type": "string", "example": "1" },
          "slug": { "type": "string", "example": "mdf-mdp-ou-madeira-macica-qual-escolher" },
          "title": { "type": "string" },
          "summary": { "type": "string" },
          "category": { "type": "string", "example": "Materiais & Tecnologia" },
          "readTime": { "type": "string", "example": "6 min" },
          "url": { "type": "string", "format": "uri" }
        }
      },
      "BlogListResponse": {
        "type": "object",
        "required": ["posts"],
        "properties": {
          "posts": {
            "type": "array",
            "items": { "$ref": "#/components/schemas/BlogPost" }
          }
        }
      },
      "QuoteRequest": {
        "type": "object",
        "required": ["clientName", "phone"],
        "properties": {
          "clientName": { "type": "string", "description": "Nome completo do cliente ou arquiteto solicitante", "example": "Mariana Souza" },
          "phone": { "type": "string", "description": "Telefone ou WhatsApp com DDD", "example": "(35) 99191-1568" },
          "email": { "type": "string", "format": "email", "description": "E-mail para envio da proposta", "example": "cliente@exemplo.com.br" },
          "city": { "type": "string", "description": "Cidade da residência/obra", "example": "Poços de Caldas" },
          "ambienteType": { "type": "string", "description": "Tipo do ambiente desejado", "example": "Cozinha Gourmet e Closet Master" },
          "estimatedBudget": { "type": "string", "description": "Faixa orçamentária estimada (opcional)", "example": "R$ 50.000 a R$ 100.000" },
          "notes": { "type": "string", "description": "Detalhes técnicos adicionais ou observações do projeto" }
        }
      },
      "QuoteResponse": {
        "type": "object",
        "required": ["success", "protocol", "message", "details"],
        "properties": {
          "success": { "type": "boolean", "example": true },
          "protocol": { "type": "string", "example": "INF-M39K18" },
          "message": { "type": "string", "example": "Solicitação de orçamento recebida com sucesso." },
          "details": {
            "type": "object",
            "properties": {
              "clientName": { "type": "string", "example": "Mariana Souza" },
              "phone": { "type": "string", "example": "(35) 99191-1568" },
              "ambienteType": { "type": "string", "example": "Cozinha Gourmet" },
              "city": { "type": "string", "example": "Poços de Caldas" }
            }
          },
          "directWhatsAppUrl": { "type": "string", "format": "uri" }
        }
      },
      "McpManifest": {
        "type": "object",
        "required": ["name", "version", "protocolVersion", "transport", "capabilities", "tools"],
        "properties": {
          "name": { "type": "string", "example": "informal-movelaria" },
          "version": { "type": "string", "example": "1.0.0" },
          "protocolVersion": { "type": "string", "example": "2024-11-05" },
          "transport": {
            "type": "object",
            "required": ["type", "endpoint"],
            "properties": {
              "type": { "type": "string", "example": "streamable-http" },
              "endpoint": { "type": "string", "format": "uri", "example": "https://informal-movelaria.vercel.app/api/mcp" }
            }
          },
          "capabilities": {
            "type": "object",
            "properties": {
              "tools": {
                "type": "object",
                "properties": {
                  "listChanged": { "type": "boolean", "example": false }
                }
              }
            }
          },
          "tools": {
            "type": "array",
            "items": {
              "type": "object",
              "required": ["name", "description"],
              "properties": {
                "name": { "type": "string" },
                "description": { "type": "string" }
              }
            }
          }
        }
      },
      "JsonRpcRequest": {
        "type": "object",
        "required": ["jsonrpc", "method"],
        "properties": {
          "jsonrpc": { "type": "string", "enum": ["2.0"], "example": "2.0" },
          "id": { "oneOf": [{ "type": "string" }, { "type": "number" }], "example": 1 },
          "method": { "type": "string", "enum": ["initialize", "ping", "tools/list", "tools/call"], "example": "initialize" },
          "params": { "type": "object" }
        }
      },
      "JsonRpcResponse": {
        "type": "object",
        "required": ["jsonrpc", "id"],
        "properties": {
          "jsonrpc": { "type": "string", "example": "2.0" },
          "id": { "oneOf": [{ "type": "string" }, { "type": "number" }], "example": 1 },
          "result": { "type": "object", "description": "Resultado tipado da invocação do método ou ferramenta" },
          "error": {
            "type": "object",
            "properties": {
              "code": { "type": "integer" },
              "message": { "type": "string" },
              "data": { "type": "object" }
            }
          }
        }
      }
    }
  }
}
