Formato NBT
O Named Binary Tag (NBT) é uma estrutura de dados em forma de árvore usado pelo Minecraft em muitos arquivos salvos para armazenar dados arbitrários. O formato é composto por um aglomerado de "etiquetas". As etiquetas têm um ID numérico, um nome e um payload. Uma versão acessível ao utilizador sob a forma de strings é o formato stringified Named Binary Tag (SNBT).
Formato SNBT[editar | editar código-fonte]
SNBT, também conhecido como data tag, é frequentemente utilizado em comandos na Edição Java. Pode ser descrito começando com pares de valores-chave entre chaves. Um exemplo de SNBT é a especificação de dados complexos para entidades com comandos.
Uma data tag consiste em zero ou mais pares atributo-valor delimitados por vírgulas e entre chaves. Cada par atributo-valor consiste num nome de etiqueta e no valor da etiqueta, separados por dois pontos. Alguns valores, no entanto, podem ser uma etiqueta composta e conter pares atributo-valor, permitindo que uma etiqueta de dados descreva uma estrutura de dados hierárquica.
- Exemplo:
{name1:123,name2:"sometext1",name3:{subname1:456,subname2:"sometext2"}}
O nome da etiqueta pode ser colocado entre aspas duplas, se necessário.
É diferente do formato JSON; portanto, qualquer JSON usado no NBT, como texto JSON bruto, deve ser incluído em uma tag de string .
Tipos de dados[editar | editar código-fonte]
Tipo | Descrição | Formato SNBT | Exemplo SNBT |
---|---|---|---|
Byte | Um número inteiro de 8 bits com sinal, que varia entre -128 e 127 (inclusive). | <number>b ou <number>B
|
34B , -20b
|
Boolean | A NBT não tem um tipo de dados booleano, mas os valores de byte 0 e 1 podem ser representados como true , false . Quando um campo de bytes é utilizado como um valor booleano, o ícone é mostrado.
|
true , false
|
true
|
Short | Um número inteiro de 16 bits com sinal, que varia entre -32,768 e 32,767 (inclusive). | <number>s ou <number>S
|
31415s , -27183s
|
Int | Um número inteiro de 32 bits com sinal, entre -2.147.483.648 e 2.147.483.647 (inclusive). | <integer_number>
|
31415926
|
Long | Um número inteiro de 64 bits com sinal, que varia entre -9,223,372,036,854,775,808 e 9,223,372,036,854,775,807 (inclusive). | <number>l ou <number>L
|
31415926l
|
Float | Um número de ponto flutuante de precisão simples de 32 bits, que varia entre -3,4E+38 e +3,4E+38.
Veja IEEE ponto flutuante para detalhes. |
<number>f ou <number>F
|
3.1415926f
|
Double | Um ponto flutuante de dupla precisão de 64 bits, que varia entre -1,7E+308 e +1,7E+308.
Veja IEEE ponto flutuante para detalhes. |
<decimal_number> , <number>d ou <number>D
|
3.1415926
|
String | Uma sequência de caracteres | Uma cadeia de caracteres entre aspas. Para strings contendo apenas 0-9 , A-Z , a-z , _ , - , . , e + , e não confundir com outros tipos de dados, as aspas são opcionais. As aspas podem ser simples ' ou dupla " . As aspas aninhadas podem ser incluídas dentro de uma cadeia de caracteres, escapando o carácter com um \ escape.
|
|
List | Uma lista ordenada de tags. As tags devem ser do mesmo tipo, determinado pela primeira etiqueta da lista. | Tags sem nome entre parênteses retos e delimitadas por vírgulas.
|
[3.2,64.5,129.5]
|
Compound | Uma lista ordenada de pares atributo-valor.
Cada tag pode ser de qualquer tipo. |
Tags nomeadas entre chaves e delimitadas por vírgulas.
A chave (tag name) pode não estar entre aspas se contiver apenas |
{X:3,Y:64,Z:129}
|
Byte Array | Uma lista ordenada de números inteiros de 8 bits. Note-se que [B;1b,2b,3b] e [1b,2b,3b] são considerados de tipos diferentes, o segundo é um list.
|
B; seguido de uma lista ordenada de byte tags, delimitada por vírgulas. A etiqueta é colocada entre parênteses rectos.
|
[B;1b,2b,3b]
|
Int Array | Uma lista ordenada de números inteiros de 32 bits. Note-se que [I;1,2,3] e [1,2,3] são considerados de tipos diferentes, o segundo é um list.
|
I; seguido de uma lista ordenada de int tags, delimitada por vírgulas. A etiqueta é colocada entre parênteses rectos.
|
[I;1,2,3]
|
Long Array | Uma lista ordenada de números inteiros de 64 bits. Note-se que [L;1l,2l,3l] e [1l,2l,3l] são considerados de tipos diferentes, o segundo é um list.
|
L; seguido de uma lista ordenada de long tags, delimitadas por vírgulas. A etiqueta é colocada entre parênteses rectos.
|
[L;1l,2l,3l]
|
Objeto NBT[editar | editar código-fonte]
Quando o jogo está sendo executado, as entidades e as entidades de blocos em chunks carregadas são armazenadas na memória. Não são armazenadas com NBT, mas sim como objetos programáticos.
Ao processar operações NBT, o jogo tem de gerar um objeto NBT programático a partir de entidades/blocos, analisar o SNBT no objeto NBT, modificar entidades/blocos com base no objeto NBT fornecido ou converter o objeto NBT em SNBT.
Geração de objeto NBT[editar | editar código-fonte]
Ao gerar NBT a partir de uma entidade/bloco, as propriedades da entidade/bloco são adicionadas ao objeto NBT programático.
Note que nem todas as propriedades são adicionadas. Por exemplo, o valor que indica se um jogador está a abrir um baú não será adicionado ao objeto NBT.
É acrescentado um valor a um determinado tipo de dados. Por exemplo, um local de recurso é convertido num valor de string.
Estes objetos NBT são também armazenados nos diretórios de gravação do jogo como arquivos NBT quando o jogo é encerrado ou salvo automaticamente. Assim, as estruturas de dados que as tags NBT descrevem e o tipo de dados para cada tag são basicamente os mesmos utilizados nos diretórios de gravação do jogo. Estas estruturas de dados são descritas noutros artigos e os comandos esperam que as data tags utilizem os mesmos nomes de atributos (que são sensíveis a maiúsculas e minúsculas):
Objetos | Exemplos |
---|---|
Blocos entidades | baús, fornalhas, blocos de comandos, geradores de criaturas, placas, etc. |
Itens | objetos nos inventários (inclui especificações para encantamentos, descrições, nomes personalizados, etc.) |
Entidade de itens | itens no chão |
Criaturas | creepers, vacas, aldeões, etc. |
Projéteis | flechas, bolas de fogo, poções arremessáveis, etc. |
Veículos | botes, carrinhos de mina, etc. |
Blocos Dinâmicos | dinamite ativada, areia/cascalho/cimento/bigornas em queda |
Outras entidades | fogos de artifício, quadros, e molduras |
Conversão para SNBT[editar | editar código-fonte]
Um objeto NBT programático seria convertido num SNBT quando se tentasse obtê-lo com /data get
etc.
Depois de convertido, um número é sempre seguido de uma letra (minúscula para b, s, f, d, e maiúscula para L) exceto Integer. Por exemplo, 3s
para uma curta, 3.2f
para uma float, etc.
Um literal entre colchetes é considerado uma lista, a menos que seja utilizado um identificador: [I;1,2,3]
para um inter array e [L;1L,2L,3L]
para uma long array.
true
e false
são convertidos como 1b
e 0b
respectivamente.
Modificando blocos/entidades baseados em objetos NBT[editar | editar código-fonte]
A modificação da entidade/bloco baseados em objetos NBT programático não é um processo simples. Todas as etiquetas têm de ser resolvidas antes de alterar as propriedades de um bloco/entidade. Nota-se que apenas determinadas propriedades podem ser alteradas. Por exemplo, quando se utiliza o comando /data
para modificar uma entidade de bloco, as suas coordenadas não podem ser alteradas.
Se uma propriedade precisar de um valor do local do recurso e obtiver uma tag string, a string é convertida em um local de recurso
Se uma propriedade precisar de um valor de texto JSON e obtém uma tag string a string é analisada num objeto de texto JSON.
Se uma propriedade precisar de um valor booleano e obtém uma tag numérica, se o número não for 0 após alguma operação de arredondamento e conversão para byte o valor será verdadeiro.
Se uma propriedade precisar de um valor booleano e obtém uma tag não numérica, a propriedade torna-se falsa.
Se uma propriedade precisar de um valor numérico de determinado tipo receber uma tag numérica do tipo errado, o valor recebe uma operação de arredondamento e é convertido para o tipo necessário.
Se uma propriedade precisar de um valor numérico e recebe uma tag não numérica, o número se tornará 0.
Se uma propriedade precisar de uma string e recebe uma etiqueta que não é uma string, a string torna-se uma string vazia.
Se uma propriedade precisar de um lista ou array de determinado tipo e obtém uma tag do tipo errada, obtém-se uma lista/array vazia.
Se uma propriedade precisar de uma compound tag e obtém uma tag diferente de compound, é obtida uma compound tag vazia.
Testando tags NBT[editar | editar código-fonte]
Quando comandos como /clear
, /execute if data
são utilizados para fazer corresponder data tags, ou um argumento nbt no seletor de destino tenta atingir a entidade-alvo, o jogo converte o SNBT em objeto NBT programático e obtém o objeto NBT programático do bloco/entidade/armazenamento, comparando depois os dois objetos NBT.
Verificam apenas a presença das tags fornecidas na entidade/bloco/armazenamento de destino. Isto significa que a entidade/bloco/armazenamento pode ter tags adicionais e ainda assim corresponder. Isto é verdade mesmo em listas: a ordem e o número de elementos numa lista não são considerados e, desde que todos os elementos solicitados estejam na lista, esta corresponde mesmo que existam elementos adicionais. Por exemplo, uma entidade com dados {Pos:[1d,2d,3d],Tags:["a","b"]}
pode ser alvo de @e[nbt={Pos:[3d,2d,1d]}]
ou simplesmente @e[nbt={Pos:[2d]}]
embora a primeira represente uma posição totalmente diferente e a segunda não seja uma posição válida. Note-se que @e[nbt={Tags:[]}]
não pode corresponder-lhe, porque uma lista vazia só pode corresponder a uma lista vazia.
No entanto, a ordem e o número de elementos num array de byte/long/int são reconhecidos.
As data tags solicitadas na entidade/bloco/armazenamento de destino devem corresponder "exatamente" para que as tags fornecidas sejam aprovadas, incluindo o data type (por exemplo: 1
um int, não corresponde a 1d
, um duplo). Os namespaces também não podem ser omitidos porque no objeto NBT é apenas uma string simples que não será resolvida numa localização de recurso (por exemplo: @e[nbt={Item:{id:"stone"}}]
não corresponde a um bloco de pedra como item/entidade, deve ser @e[nbt={Item:{id:"minecraft:stone"}}]
). O mesmo se aplica à string de textos JSON, que deve ser exatamente a mesma para corresponder à tag fornecida (por exemplo: @e[nbt={CustomName:'"a"'}]
não corresponde a nenhuma entidade, deve ser @e[nbt={CustomName:"{\"text\":\"a\"}"}]
ou @e[nbt={CustomName:'{"text":"a"}'}]
).
Formato Binário[editar | editar código-fonte]
Um arquivo NBT é uma tag Compound compactada. Alguns dos arquivos utilizados pelo Minecraft podem ser descomprimidos, mas na maioria dos casos, os arquivos seguem a especificação original de Notch e são comprimidos com GZip.
Definição de TAG[editar | editar código-fonte]
Uma tag é uma parte individual da árvore de dados. O primeiro byte de uma etiqueta é o tipo da tag (ID), seguido por dois bytes em formato big-endian para o comprimento do nome e, em seguida, o nome como uma string no formato UTF-8 (Nota: TAG_End não é nomeada e não contém os 2 bytes extras; o nome é assumido como vazio). Finalmente, dependendo do tipo de tag, os bytes que se seguem fazem parte do payload dessa tag. Esta tabela descreve cada uma das 13 etiquetas conhecidas na versão 19133 do formato NBT:
ID | Ícone | Tipo da Tag | Conteúdo (carga) | Formato SNBT[EJ apenas] | Descrição | Capacidade de Armazenamento |
---|---|---|---|---|---|---|
0 | TAG_End | Nenhum. | - | Usado para marcar o fim de tags Compound. Esta tag não tem um nome, logo ela sempre é um único byte 0. Ela pode também ser o tipo de tags List vazias. | N/A | |
1 | TAG_Byte | 1 byte / 8 bits, com sinal. | <numero>b ou <numero>B
|
Um inteiro com sinal. Às vezes utilizado para booleanos. | Alcance completo de -(27) até (27 - 1) (-128 até 127) | |
2 | TAG_Short | 2 bytes / 16 bits, com sinal, big-endian. | <numero>s ou <numero>S
|
Um inteiro com sinal. | Alcance completo de -(215) até (215 - 1) (-32,768 até 32,767) | |
3 | TAG_Int | 4 bytes / 32 bits, com sinal, big-endian. | <numero>
|
Um inteiro com sinal. | Alcance completo de -(231) até (231 - 1) (-2,147,483,648 até 2,147,483,647) | |
4 | TAG_Long | 8 bytes / 64 bits, com sinal, big-endian. | <numero>l ou <numero>L
|
Um inteiro com sinal. | Alcance completo de -(263) até (263 - 1) (-9,223,372,036,854,775,808 até 9,223,372,036,854,775,807) | |
5 | TAG_Float | 4 bytes / 32 bits, com sinal, big-endian, padrão IEEE 754-2008, binary32. | <numero>f ou <numero>F
|
Um ponto flutuante com sinal. | A precisão varia ao longo do alcance de números; Veja Single-precision floating-point format. Valor máximo é cerca de 3.4*1038 | |
6 | TAG_Double | 8 bytes / 64 bits, com sinal, big-endian, padrão IEEE 754-2008, binary64. | <numero decimal> , <numero>d , ou <numero>D
|
Um ponto flutuante com sinal. | A precisão varia ao longo do alcance de números; Veja Dupla precisão no formato de ponto flutuante. Valor máximo é cerca de 1.8*10308 | |
7 | TAG_Byte_Array | Um tamanho tam do tipo carga de TAG_Int, e então tam cargas de TAG_Byte. | [B;<byte>,<byte>,...]
|
Uma lista (array) de cargas de tag Byte. | Número máximo de elementos vai de (231 - 9) até (231 - 1) (2,147,483,639 até 2,147,483,647), dependendo da JVM específica. | |
8 | TAG_String | Um tamanho tam do tipo carga de TAG_Short, e então uma string UTF-8 de comprimento tam. | <a-zA-Z0-9 texto> , "<texto>" (na qual aspas duplas " interiores precisam ser escritas como \" ), ou '<text>' (na qual aspas simples ' interiores precisam ser escritas como \' )
|
Uma string de codificação UTF-8. Ela tem um tamanho, ao invés de ser terminada por um caractere nulo. | 32,767 bytes interpretáveis como UTF-8 (veja formato UTF-8; a maioria dos caracteres mais comuns ocupam um único byte). | |
9 | TAG_List | Um ID do tipo carga de TAG_Byte, e então um tamanho tam do tipo carga de TAG_Int, e então tam cargas de tag, todas do tipo ID. | [<valor>,<valor>,...]
|
Uma lista de cargas de tag, sem aparecer repetidamente IDs ou qualquer nomes de tag. Estes são inferidos do ID da própria tag List. | Devido a algumas limitações da JVM e a implementação da ArrayList, o número máximo de elementos da lista é (231 - 9), ou 2,147,483,639. Também notar que as tags List e Compound não podem ser aninhadas além da profundidade máxima de 512. | |
10 | TAG_Compound | Tags completas, seguidas de uma TAG_End. | {<nome da tag>:<valor>,<nome da tag>:<valor>,...}
|
Uma lista de tags completas, incluindo ID, nome e carga. Não é permitido duas tags com o mesmo nome. | Diferentemente das listas, não há um limite rígido para a quantidade de tags dentro de um composto (Compound). É claro, contudo, que sempre há o limite implícito de memória virtual. Note, entretanto, que as tags List e Compound não podem ser aninhadas além da profundidade máxima de 512. | |
11 | TAG_Int_Array | Um tamanho tam do tipo carga de TAG_Int, e então tam cargas de TAG_Int. | [I;<inteiro>,<inteiro>,...]
|
Uma lista (array) de cargas de tag Int. | Número máximo de elementos vai de (231 - 9) até (231 - 1) (2,147,483,639 até 2,147,483,647), dependendo da JVM específica. | |
12 | TAG_Long_Array | Um tamanho tam do tipo carga de TAG_Int, e então tam cargas de TAG_Long. | [L;<inteiro longo>,<inteiro longo>,...]
|
Uma lista (array) de cargas de tag Long. | Número máximo de elementos vai de (231 - 9) até (231 - 1) (2,147,483,639 até 2,147,483,647), dependendo da JVM específica. |
As tags List e Compound podem ser - e frequentemente são - aninhadas recursivamente. Também é bom notar que, em uma lista de listas, cada sub-lista pode listar um tipo de tag diferente.
Utilização[editar | editar código-fonte]
Minecraft às vezes usa o formato NBT de maneira inconsistente; em alguns casos, listas vazias pode ser representadas como uma lista de tags Byte ao invés de uma lista do tipo correto, ou como uma lista de tags End em versões mais recentes do Minecraft, o que pode quebrar algumas ferramentas para manipulação de NBT mais antigas.
Na maioria dos casos, os arquivos seguem a especificação original de Notch e são comprimidos com GZip. Mas alguns dos arquivos utilizados pelo Minecraft podem ser descomprimidos, ou com zlib (também conhecido como DEFLATE com alguns bytes extra).
Todos os arquivos NBT criados pelo Minecraft contém dados compound ou, por vezes, um list[Edição Bedrock apenas] como tag raiz, esta tag tem um nome mas é frequentemente conhecida como string vazia.
Na Edição Bedrock, todos os números são codificados em little-endian. Isto inclui o prefixo de tamanho antes dos nomes das tags, string valores e list ou array bem como os valores em todas as tags numéricas.
Na Edição Bedrock, O level.dat é um arquivo NBT descomprimido com um cabeçalho de 8 bytes, constituído por um número inteiro de 4 bytes little-endian que indica a versão da ferramenta utilizada para guardar o arquivo. É seguido por outro número inteiro que contém o comprimento do arquivo, menos o cabeçalho.
Usos[editar | editar código-fonte]
- level.dat é armazenado em formato NBT comprimido.
- <player>.dat os arquivos são armazenados em formato NBT comprimido.
- idcounts.dat é armazenado em formato NBT comprimido.
- villages.dat é armazenado em formato NBT comprimido.
- Raids.dat format|raids.dat é armazenado em formato NBT comprimido.
- map_<#>.dat os arquivos são armazenados em formato NBT comprimido.
- servers.dat, que é utilizado para armazenar a lista de servidores multijogador guardados como NBT não comprimido.
- hotbar.nbt, que é utilizado para guardar hotbars no formato NBT não comprimido.
- Chunks são armazenados em arquivos no formato NBT comprimido, Region.
- scoreboard.dat é armazenado em formato NBT comprimido..
- Generated structures são armazenadas em formato NBT comprimido.
- Saved structures é armazenado em formato NBT comprimido.
JSON e NBT[editar | editar código-fonte]
JSON é um formato de troca de dados leve baseado em texto. O padrão do texto JSON é especificado em ECMA-404. Veja também JSON.
JSON é muito diferente de NBT. A NBT é uma estrutura de dados que pode ser representada por um arquivo binário ou strings. O JSON é um formato de texto para transferência de dados. Existem apenas seis tipos de dados em JSON: JsonString, JsonNumber, JsonBoolean, JsonNull, JsonObject, e JsonArray. No NBT, há mais tipos para números diferentes e não há tipos de dados nulos e booleanos.
No NBT, existem listas, byte array, int array e long array, e os elementos em uma lista ou um array devem ser do mesmo tipo. No entanto, em JSON, há apenas JsonArray, na qual os elementos podem ser de diferentes tipos de dados. A chave de uma tag em SNBT pode não ser colocada entre aspas, enquanto a chave de um name-value em JSON deve ser colocada entre aspas duplas.
A conversão entre NBT e JSON pode resultar na perda de muitas informações, ao mesmo tempo que adiciona muitas informações redundantes. No entanto, essa conversão é ocasionalmente utilizada pelo jogo vanilla. na Edição Java Atualmente usado nas partículas ambientes de biomas personalizados e na [[Lista de processadores |lista de processadores]] que "ditam" o tipo de processamento. Abaixo está como o jogo vanilla os converte.
Conversão a partir de JSON[editar | editar código-fonte]
Tipo de dados em JSON | [exibir]Convertidos em |
---|---|
JsonString | string |
JsonBoolean | byte |
JsonNumber |
|
JsonNull | Não pode ser convertido. |
JsonArray | A conversão de JsonArray para NBT é um pouco problemática.
Primeiro converte todos os elementos no array para NBT; se os tipos de dados forem diferentes, este array não pode ser convertido em NBT. Isso significa que arrays como [0,1,true] e [5e-1,0.25] podem ser convertidos para NBT com sucesso, enquanto [0,1,128], [0.5, 0.6], e [0.0, 0.1] não podem ser convertidos para NBT. E quando pode ser convertido em NBT:
Por exemplo, [true, 127] é convertida para [B; 1B, 127B]. |
JsonObject | compound |
Conversão para JSON[editar | editar código-fonte]
Tipo de dados em NBT | [exibir]Convertidos em |
---|---|
string | JsonString |
byte short int long float double |
JsonNumber |
byte array int array long array list |
JsonArray |
compound | JsonObject |
Software oficial[editar | editar código-fonte]
A Mojang forneceu exemplos de classes Java NBT para os programadores utilizarem e referenciarem como parte do código-fonte do MCRegion para conversor de Formato de arquivo bigorna. [1] Des da Edição Java 1.13, Minecraft inclui um conversor integrado entre o formato SNBT e o formato NBT comprimido, que acompanha ambos os clientes e servidores oficiais.[2]
O gerador de dados do Minecraft é capaz de converter arquivos não comprimidos em formato de Stringified NBT com extensão .snbt em uma pasta de entrada para arquivos no formato NBT comprimido com GZip e extensão .nbt em uma pasta de saída, e vice-versa.
O gerador de dados padrão pode converter qualquer formato NBT comprimido com GZip para o formato SNBT. A extensão do arquivo pode ser simplesmente alterada, como level.dat para level.nbt, e colocada na pasta de entrada. O gerador, então, decodifica os dados NBT comprimidos com GZip.
Histórico[editar | editar código-fonte]
O formato de arquivo NBT foi descrito por Notch em uma breve especificação.[3]
A versão original conhecida foi 19132, introduzida na Beta 1.3, e desde então foi atualizada para 19133 com o Formato de arquivo bigorna, que adiciona a tag Int Array
. O formato NBT remonta a Indev com as tags de 0 a 10 em uso.
[ocultar]Edição Java | |||||||
---|---|---|---|---|---|---|---|
1.0.0 | 28 de setembro de 2011 | Notch trabalhou em "salvar dados arbitrários com instâncias de itens"." | |||||
1.8 | 14w03a | Os dados NBT agora suportam o uso de IDs de string em vez de IDs numéricos. | |||||
1.12 | 17w18a | Adicionada a tag long array. | |||||
1.13 | 18w01a | Adicionado a gerador de dados tanto para o Minecraft cliente quanto para o software multiplayer padrão. | |||||
1.14 | 19w08a | As tags de string e os nomes de tags em compound no SNBT agora podem estar entre aspas simples ' além de aspas duplas. " .[4] | |||||
1.16 | 20w21a | Adicionada função de conversão entre NBT e JSON. |
Referências[editar | editar código-fonte]
- ↑ http://www.mojang.com/2012/02/new-minecraft-map-format-anvil/
- ↑ https://wiki.vg/Data_Generators#NBT_converters
- ↑ http://web.archive.org/web/20110723210920/http://www.minecraft.net/docs/NBT.txt especificação
- ↑ "Permitir aspas simples em strings por boq · Solicitação de Pull (PR) #52" – Mojang/brigadier – GitHub.
Links Externos[editar | editar código-fonte]
- nbt, Biblioteca Java para trabalhar com o formato NBT.
- NBT na wiki.vg
- NBTExplorer, Uma ferramenta para visualizar e editar arquivos NBT.
- NBT Studio, Sucessor do NBTExplorer que inclui recursos adicionais, como suporte ao Bedrock e SNBT.
- webNBT, Uma ferramenta online para visualizar e editar arquivos NBT.
- XNBTEdit, Editor e conversor NBT em XML.
[editar | editar código-fonte]
Atribuído a: Werkhauser (discussão)
Motivo: Página atualizada seguindo o padrão da wiki EN.