diff --git a/.nojekyll b/.nojekyll new file mode 100644 index 0000000..e69de29 diff --git a/404.html b/404.html new file mode 100644 index 0000000..45c2761 --- /dev/null +++ b/404.html @@ -0,0 +1,1366 @@ + + + + + + + + + + + + + + + + + + + Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ +

404 - Not found

+ +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Analise/CasosDeUso/index.html b/Analise/CasosDeUso/index.html new file mode 100644 index 0000000..1cd4c44 --- /dev/null +++ b/Analise/CasosDeUso/index.html @@ -0,0 +1,1741 @@ + + + + + + + + + + + + + + + + + + + + + + + Inspeção Casos de Uso - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Inspeção dos casos de uso

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
08/09/20240.1Criação do documentoDanilo Melo
+

Metodologia

+

Durante o processo de inspeção dos casos de uso, cada item foi verificado individualmente, utilizando uma metodologia baseada em checklist. Para cada item do checklist, uma resposta binária foi atribuída, avaliando se o item atende aos critérios de qualidade previamente definidos. Esse processo garante que cada caso de uso esteja em conformidade com os padrões esperados e pronto para ser considerado no ciclo de desenvolvimento.

+

Checklist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Itens
1O caso de uso apresenta uma descrição clara?
2O caso de uso apresenta o fluxo principal?
3O caso de uso apresenta o fluxo alternativo?
4O caso de uso apresenta o fluxo de exceção?
5O caso de uso apresenta uma pós-condição?
6O caso de uso apresenta rastreabilidade?
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
UC123434
UC01✔️✔️✔️✔️✔️✔️
UC02✔️✔️✔️✔️✔️✔️
UC03✔️✔️✔️✔️✔️✔️
UC04✔️✔️✔️✔️✔️✔️
UC05✔️✔️✔️✔️✔️✔️
UC06✔️✔️✔️✔️✔️
UC07✔️✔️✔️✔️✔️✔️
UC08✔️✔️✔️✔️✔️✔️
UC09✔️✔️✔️✔️✔️✔️
UC10✔️✔️✔️✔️✔️✔️
UC11✔️✔️✔️✔️✔️✔️
UC12✔️✔️✔️✔️✔️✔️
UC13✔️✔️✔️✔️✔️✔️
UC14✔️✔️✔️✔️✔️✔️
UC15✔️✔️✔️✔️✔️✔️
UC16✔️✔️✔️✔️✔️✔️
UC17✔️✔️✔️✔️✔️✔️
UC18✔️✔️✔️✔️✔️✔️
UC19✔️✔️✔️✔️✔️✔️
UC20✔️✔️✔️✔️✔️✔️
UC21✔️✔️✔️✔️✔️✔️
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Analise/EspecificacaoSuplementar/index.html b/Analise/EspecificacaoSuplementar/index.html new file mode 100644 index 0000000..24a2232 --- /dev/null +++ b/Analise/EspecificacaoSuplementar/index.html @@ -0,0 +1,1586 @@ + + + + + + + + + + + + + + + + + + + + + + + Inspeção Especificações Suplementares - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Inspeção Especificações Suplementares

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
08/09/20240.1Criação do documentoPatricia Helena
+

Metodologia

+

Utilizando a metodologia de inspeção por meio de um checklist, as características das Especificações Suplementares foram verificadas individualmente, resultando em uma resposta para cada pergunta do checklist, podendo ser 'sim' ou 'não'. Esse processo permite uma averiguação da qualidade de cada um dos itens, assegurando que os requisitos estejam em conformidade com os padrões esperados.

+

Checklist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Perguntas
1Todos os requisitos estão descritos de forma clara?
2A especificação abrange todos os aspectos essenciais relacionados aos requisitos não funcionais?
3Os requisitos de desempenho descrevem de forma clara as condições e níveis de operação?
4Os requisitos de segurança descrevem de forma clara as condições e níveis de proteção?
5Os requisitos de usabilidade descrevem de forma clara as condições e níveis de facilidade de uso?
6Os requisitos de compatibilidade descrevem de forma clara as condições e níveis de integração com outros sistemas?
7Os requisitos de manutenção descrevem de forma clara as condições e níveis de suporte e atualização?
+

Matriz de Avaliação

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Especificações Suplementares1234567
Especificação Suplementar✔️✔️✔️✔️✔️✔️✔️
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Analise/NFR/index.html b/Analise/NFR/index.html new file mode 100644 index 0000000..b988bc5 --- /dev/null +++ b/Analise/NFR/index.html @@ -0,0 +1,1584 @@ + + + + + + + + + + + + + + + + + + + + + + + Inspeção NFR - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Inspeção NFR

+ +

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
08/09/20240.1Criação do documentoSamara Letícia
+

Metodologia

+

O processo de inspeção dos NFR Framework foi realizado utilizando uma metodologia baseada em checklist. Para cada pergunta do checklist, uma resposta binária foi atribuída, avaliando se o item atende aos critérios.

+

Checklist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Perguntas
1Todos os requisitos não funcionais relevantes foram identificados?
2As metas de qualidade foram devidamente classificadas?
3Cada meta foi descrita como um softgoal, permitindo a flexibilidade necessária para ajustes?
4As dependências entre softgoals foram mapeadas e documentadas?
5A notação gráfica do NFR Framework está bem organizada e fácil de seguir?
6O diagrama visual representa corretamente as interações e impactos entre os softgoals?
+

Matriz de Avaliação

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Diagrama123456
Usabilidade✔️✔️✔️✔️✔️✔️
Desempenho✔️✔️✔️✔️✔️✔️
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Analise/argumentacao/index.html b/Analise/argumentacao/index.html new file mode 100644 index 0000000..396f627 --- /dev/null +++ b/Analise/argumentacao/index.html @@ -0,0 +1,1582 @@ + + + + + + + + + + + + + + + + + + + + + + + Inspeção Argumentação - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Inspeção Argumentação

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
08/09/20240.1Criação do documentoPatricia Helena
+

Metodologia

+

Utilizando a metodologia de inspeção por meio de um checklist, as características da Argumentação foram verificadas individualmente, resultando em uma resposta para cada pergunta do checklist, podendo ser 'sim' ou 'não'. Esse processo permite uma averiguação da qualidade de cada um dos itens, assegurando que os requisitos estejam em conformidade com os padrões esperados.

+

Checklist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Perguntas
1As legendas e explicações estão claras?
2A argumentação atinge uma conclusão consistente?
3A notação de argumento utilizada segue um padrão específico e é respeitada ao longo do documento?
4As questão citadas foram devidamente respondidas?
5É possível rastrear a origem dos argumentos?
+

Matriz de Avaliação

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Argumentação12345
A01✔️✔️✔️✔️✔️
A02✔️✔️✔️✔️✔️
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Analise/backlog/index.html b/Analise/backlog/index.html new file mode 100644 index 0000000..0d9206b --- /dev/null +++ b/Analise/backlog/index.html @@ -0,0 +1,1933 @@ + + + + + + + + + + + + + + + + + + + + + + + Inspeção Backlog do Produto - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Inspeção Backlog do Produto

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
07/09/20240.1Criação do documentoCarlos Eduardo Rodrigues
+

Metodologia

+

Durante o processo de inspeção dos itens do backlog, cada item foi verificado individualmente, utilizando uma metodologia baseada em checklist. Para cada pergunta do checklist, uma resposta binária foi atribuída, avaliando se o item atende aos critérios de qualidade previamente definidos. Esse processo garante que cada requisito esteja em conformidade com os padrões esperados e pronto para ser considerado no ciclo de desenvolvimento.

+

Checklist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Perguntas
1A história é clara e objetiva?
2A história apresenta épico?
3A história é separada por tema?
4A história possui um ID em ordem crescente?
5A história é priorizada pelo modelo MoSCoW?
6A história identifica o usuário principal?
7A história apresenta link(s) do(s) seu(s) respectivo(s) rastreamento(s)?
8A história é suficientemente pequena para ser concluída dentro de um ciclo de sprint?
+

Matriz de Avaliação

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
US12345678
US001✔️✔️✔️✔️✔️✔️
US002✔️✔️✔️✔️✔️✔️
US002✔️✔️✔️✔️✔️✔️
US003✔️✔️✔️✔️✔️✔️
US004✔️✔️✔️✔️✔️✔️
US005✔️✔️✔️✔️✔️✔️
US006✔️✔️✔️✔️✔️✔️
US007✔️✔️✔️✔️✔️✔️
US008✔️✔️✔️✔️✔️
US009✔️✔️✔️✔️✔️
US010✔️✔️✔️✔️✔️
US011✔️✔️✔️✔️✔️
US012✔️✔️✔️✔️✔️
US013✔️✔️✔️✔️✔️
US014✔️✔️✔️✔️✔️✔️
US015✔️✔️✔️✔️✔️✔️
US016✔️✔️✔️✔️✔️✔️
US017✔️✔️✔️✔️✔️✔️
US018✔️✔️✔️✔️✔️✔️
US019✔️✔️✔️✔️✔️✔️
US020✔️✔️✔️✔️✔️✔️
US021✔️✔️✔️✔️✔️✔️
US022✔️✔️✔️✔️✔️✔️
US023✔️✔️✔️✔️✔️
US024✔️✔️✔️✔️✔️✔️
US025✔️✔️✔️✔️✔️✔️
US026✔️✔️✔️✔️✔️
US027✔️✔️✔️✔️✔️
US028✔️✔️✔️✔️✔️✔️
US029✔️✔️✔️✔️✔️✔️
US030✔️✔️✔️✔️✔️✔️
US031✔️✔️✔️✔️✔️
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Analise/cenarios/index.html b/Analise/cenarios/index.html new file mode 100644 index 0000000..72be54b --- /dev/null +++ b/Analise/cenarios/index.html @@ -0,0 +1,1735 @@ + + + + + + + + + + + + + + + + + + + + + + + Inspeção Cenários - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Inspeção Cenários

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
07/09/20240.1Criação do documentoPatricia Helena
+

Metodologia

+

Utilizando a metodologia de inspeção por meio de um checklist, as características de cada cenário foram verificadas individualmente, resultando em uma resposta para cada pergunta do checklist, podendo ser 'sim' ou 'não'. Esse processo permite uma averiguação da qualidade de cada um dos cenários, assegurando que os requisitos estejam em conformidade com os padrões esperados.

+

Checklist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Perguntas
1O cenário possui um título descritivo?
2O objetivo usado naquele cenário esta claro?
3O cenário possui um contexto claro?
4Os atores pertencentes do cenário estão descritos?
5O cenário descreve os recursos necessários?
6O cenário possui episódios coerentes?
7As possiveis restrições estao descritas?
8O cenário possui (hyperlinks) com os léxicos? Se sim, estão todos em ordem?
+

Matriz de Avaliação

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
C12345678
C01✔️✔️✔️✔️✔️✔️
C02✔️✔️✔️✔️✔️✔️✔️
C02✔️✔️✔️✔️✔️✔️✔️
C03✔️✔️✔️✔️✔️✔️
C04✔️✔️✔️✔️✔️✔️✔️
C05✔️✔️✔️✔️✔️✔️
C06✔️✔️✔️✔️✔️✔️
C07✔️✔️✔️✔️✔️✔️
C08✔️✔️✔️✔️✔️✔️
C09✔️✔️✔️✔️✔️✔️
C10✔️✔️✔️✔️✔️✔️
C11✔️✔️✔️✔️✔️✔️
C12✔️✔️✔️✔️✔️✔️
C13✔️✔️✔️✔️✔️✔️
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Analise/epics/index.html b/Analise/epics/index.html new file mode 100644 index 0000000..baedcc6 --- /dev/null +++ b/Analise/epics/index.html @@ -0,0 +1,1591 @@ + + + + + + + + + + + + + + + + + + + + + + + Inspeção Epics - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Inspeção Epics

+ +

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
08/09/20240.1Criação do documentoSamara Letícia
+

Metodologia

+

O processo de inspeção dos modelos Epic foi realizado utilizando uma metodologia baseada em checklist. Para cada pergunta do checklist, uma resposta binária foi atribuída, avaliando se o item atende aos critérios.

+

Checklist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Perguntas
1O modelo está claramente definido, com uma descrição concisa e compreensível?
2O modelo está alinhado aos seus objetivos?
3O escopo do modelo está bem delimitado, sem ser muito amplo ou vago?
4O modelo foi dividido em User Stories ou tarefas menores e gerenciáveis?
5Cada história ou tarefa derivada tem um objetivo claro e pode ser entregue de forma independente?
6Todas as dependências e impactos foram identificados e documentados?
7A estimativa de tempo e esforço foi feita para o Modelo e suas histórias derivadas?
+

Matriz de Avaliação

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Diagrama1234567
Modo de Jogo✔️✔️✔️✔️✔️✔️
Exploração✔️✔️✔️✔️✔️✔️
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Analise/lexicos/index.html b/Analise/lexicos/index.html new file mode 100644 index 0000000..a66773b --- /dev/null +++ b/Analise/lexicos/index.html @@ -0,0 +1,1899 @@ + + + + + + + + + + + + + + + + + + + + + + + Inspeção Léxico - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Inspeção dos léxicos

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
08/09/20240.1Criação do documentoDanilo Melo
+

Metodologia

+

Durante o processo de inspeção dos itens do léxico, cada item foi verificado individualmente, utilizando uma metodologia baseada em checklist. Para cada item do checklist, uma resposta binária foi atribuída, avaliando se o item atende aos critérios de qualidade previamente definidos. Esse processo garante que cada léxico esteja em conformidade com os padrões esperados e pronto para ser considerado no ciclo de desenvolvimento.

+

Checklist

+ + + + + + + + + + + + + + + + + + + + + + + + + +
Itens
1Clareza e Simplicidade: Cada termo é descrito de maneira clara e objetiva, evitando ambiguidade.
2Consistência: A documentação é feita de maneira consistente seguindo um padrão em todo o documento.
3Inclusão de Sinônimos: O léxico deve listar sinônimos ou termos alternativos comuns para cada conceito
4Definição Contextual: As definições fornecem o contexto de uso, indicando onde e como cada termo é utilizado no sistema.
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
L1234
L01✔️✔️✔️✔️
L01✔️✔️✔️✔️
L01✔️✔️✔️
L01✔️✔️✔️✔️
L05✔️✔️✔️✔️
L06✔️✔️✔️✔️
L07✔️✔️✔️✔️
L08✔️✔️✔️✔️
L09✔️✔️✔️✔️
L10✔️✔️✔️✔️
L11✔️✔️✔️✔️
L12✔️✔️✔️✔️
L13✔️✔️✔️✔️
L14✔️✔️✔️✔️
L15✔️✔️✔️✔️
L16✔️✔️✔️✔️
L17✔️✔️✔️✔️
L18✔️✔️✔️✔️
L19✔️✔️✔️✔️
L20✔️✔️✔️✔️
L21✔️✔️✔️✔️
L22✔️✔️✔️✔️
L23✔️✔️✔️✔️
L24✔️✔️✔️
L25✔️✔️✔️✔️
L26✔️✔️✔️✔️
L27✔️✔️✔️✔️
L28✔️✔️✔️✔️
L29✔️✔️✔️
L30✔️✔️✔️✔️
L31✔️✔️✔️✔️
L32✔️✔️✔️✔️
L33✔️✔️✔️✔️
L34✔️✔️✔️✔️
L35✔️✔️✔️✔️
L36✔️✔️✔️✔️
L37✔️✔️✔️✔️
L38✔️✔️✔️✔️
L39✔️✔️✔️✔️
L40✔️✔️✔️✔️
L41✔️✔️✔️✔️
L42✔️✔️✔️✔️
L43✔️✔️✔️
L44✔️✔️✔️✔️
L45✔️✔️✔️✔️
L46✔️✔️✔️✔️
L47✔️✔️✔️✔️
L48✔️✔️✔️✔️
L49✔️✔️✔️✔️
L50✔️✔️✔️✔️
L51✔️✔️✔️✔️
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Analise/personas/index.html b/Analise/personas/index.html new file mode 100644 index 0000000..f37d79a --- /dev/null +++ b/Analise/personas/index.html @@ -0,0 +1,1606 @@ + + + + + + + + + + + + + + + + + + + + + + + Inspeção Personas - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Inspeção Personas

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
07/09/20240.1Criação do documentoCarlos Eduardo Rodrigues
+

Metodologia

+

O processo de inspeção das personas foi realizado utilizando uma metodologia baseada em checklist. Para cada pergunta do checklist, uma resposta binária foi atribuída, avaliando se o item atende aos critérios.

+

Checklist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Perguntas
1A persona tem uma descrição clara e objetiva?
2A persona inclui informações sobre idade, profissão e contexto de vida?
3A persona apresenta motivações e objetivos específicos relacionados ao jogo?
4A persona possui frustrações ou desafios bem definidos?
5A persona identifica as principais necessidades do usuário?
6A persona está baseada em dados reais ou entrevistas com usuários?
7A persona inclui uma representação visual?
+

Matriz de Avaliação

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Persona1234567
Sarah✔️✔️✔️✔️✔️✔️✔️
Arthur✔️✔️✔️✔️✔️✔️✔️
Victor✔️✔️✔️✔️✔️✔️✔️
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Analise/richpicture/index.html b/Analise/richpicture/index.html new file mode 100644 index 0000000..776de4f --- /dev/null +++ b/Analise/richpicture/index.html @@ -0,0 +1,1611 @@ + + + + + + + + + + + + + + + + + + + + + + + Inspeção Rich Picture - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Inspeção Rich Picture

+ +

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
08/09/20240.1Criação do documentoSamara Letícia
+

Metodologia

+

O processo de inspeção dos diagramas Rich Picture foi realizado utilizando uma metodologia baseada em checklist. Para cada pergunta do checklist, uma resposta binária foi atribuída, avaliando se o item atende aos critérios.

+

Checklist

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Perguntas
1O diagrama é fácil de entender sem explicações adicionais?
2Os elementos visuais (símbolos, ícones, desenhos) são claros e consistentes?
3Todos os componentes principais do sistema ou problema estão representados?
4As interações e relacionamentos importantes entre os elementos estão bem ilustrados?
5Todos os atores relevantes estão representados?
6O diagrama está organizado visualmente, facilitando a leitura?
7O diagrama simplifica adequadamente a complexidade do sistema sem perder informações essenciais?
+

Matriz de Avaliação

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Diagrama1234567
Visão Geral✔️✔️✔️✔️✔️✔️✔️
Exploração✔️✔️✔️✔️✔️✔️✔️
Personagem✔️✔️✔️✔️✔️✔️✔️
Criação de Mundos✔️✔️✔️✔️✔️✔️✔️
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Analise/validacao/index.html b/Analise/validacao/index.html new file mode 100644 index 0000000..858d490 --- /dev/null +++ b/Analise/validacao/index.html @@ -0,0 +1,2574 @@ + + + + + + + + + + + + + + + + + + + + + + + Validação - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Validação

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
08/09/20240.1Criação do documento e adição dos requisitos funcionaisSamara Letícia
+

Introdução

+

Validação é o processo de submeter os requisitos à aprovação externa da equipe de software, verificando se atendem às necessidades dos stakeholders e evitando custos de correções.

+

Metodologia

+

Após levantarmos os requisitos, testamos e validamos cada um em diferentes ambientes do jogo.

+

RF01 - O usuário deve ser capaz de criar, entrar e gerenciar uma conta no Minecraft.

+

RF01

+

RF02 - O usuário deve ser capaz de se locomover utilizando o teclado.

+

RF02

+

RF03 - O usuário deve ser capaz de interagir com o mundo utilizando o mouse.

+

RF03

+

RF04 - Os recursos devem ser armazenados no inventário do usuário.

+

RF04

+

RF05 - O jogo deve possuir um dicionário com a explicação de todos os itens descobertos pelo usuário.

+

RF05

+

RF06 - O usuário deve precisar de uma mesa de trabalho para fabricar ferramentas eficientes.

+

RF06

+

RF7 - O jogo deve permitir que, através de minérios, o usuário crie novas ferramentas.

+

RF07

+

RF08 - O jogo deve oferecer diferentes tipos de alimentos para evitar que o personagem do usuário morra de fome.

+

RF08

+

RF09 - No modo hardcore, o usuário deve ter apenas uma vida, tornando o jogo mais desafiador e definitivo.

+

RF09

+

RF10 - No modo hardcore, após a morte, o usuário deve ser capaz de entrar apenas no modo espectador, sem interagir com o mundo.

+

RF10

+

RF11 - No modo hardcore, o jogo deve ser definido automaticamente na dificuldade mais alta e não pode ser alterado.

+

RF11

+

RF12 - No modo hardcore, os comandos de cheats devem estar desabilitados para garantir a integridade do desafio.

+

RF12

+

RF13 - Deve existir um modo de jogo onde o jogador pode exercitar a sua criatividade

+

RF13

+

RF14 - No modo criativo, o usuário deve ser capaz de sobrevoar rapidamente pelo mapa para facilitar as criações.

+

RF14

+

RF15 - O usuário deve ser capaz de colocar e quebrar blocos com apenas um comando no modo criativo.

+

RF15

+

RF16 - O usuário deve ter acesso a todos os itens do jogo no modo criativo.

+

RF16

+

RF17 - O usuário não deve precisar se preocupar com vida ou barra de fome no modo criativo, focando apenas em criar.

+

RF17

+

RF18 - Mobs hostis devem ignorar a presença do usuário no modo criativo.

+

RF18

+

RF19 - No modo criativo, usuário deve ser capaz de alterar o clima e a hora do dia conforme necessário para suas criações.

+

RF19

+

RF20 - Deve haver um sistema de chat para comunicação entre os jogadores, com suporte a comandos especiais.

+

RF20

+

RF21 - Jogos multiplayer devem permitir a criação e personalização de diversos modos de jogo, como construção, sobrevivência e PvP.

+

RF21

+

RF22 - Jogos multiplayer devem fornecer um sistema de votação justo e intuitivo durante competições para escolher as melhores construções ou desempenhos.

+

RF22

+

RF23 - Em Jogos multiplayer deve ser possível a criação e agendamento de eventos e competições especiais para os jogadores.

+

RF23

+

RF24 - O jogador dever ser capaz de colocar alguns blocos na hotbar.

+

RF24

+

RF25 - O jogador deve ser capaz de compartilhar o seu mapa com outro jogador.

+

RF26 - Deve existir um modo de jogo onde o jogador pode morrer (sobrevivência)

+

RF26

+

RF27 - Com exceção dos modos Criativo e Espectador, o jogador deve ter uma quantidade limitada de vida

+

RF27

+

RF28 - O jogador deve ser capaz de criar ferramentas

+

RF28

+

RF29 - O jogador deve ser capaz de atacar os inimigos

+

RF29

+

RF30 - Com exceção do modo hardcore, o jogador deve ser capaz de escolher a dificuldade do jogo

+

RF30

+

RF31 - O mundo deve ser gerado com diversos biomas

+

RF31

+

RF32 - O jogador deve ser capaz de melhorar o material dos seus itens

+

RF32

+

RF33 - O jogador deve ser capaz de encantar os seus itens

+

RF33

+

RF34 - Quando um inimigo morrer ele deve deixar um drop

+

RF34

+

RF35 - O jogador deve ter uma barra de fome

+

RF35

+

RF36 - Cada dimensão deve ter diferentes inimigos

+

RF36

+

RF37 - Devem existir inimigos de diferentes dificuldades

+

RF37

+

RF38 - O jogo deve apresentar um sistema de conquistas

+

RF38

+

RF39 - O jogador deve poder acessar o sistema de conquistas a qualquer momento

+

RF39

+

RF40 - O jogador deve ser capaz de compartilhar suas conquistas com outros jogadores

+

RF41 - O jogo deve possuir chefes

+

RF41

+

RF42 - Deve haver blocos decorativos para expandir as opções de construção e paisagismo.

+

RF42

+

RF43 - Deve haver ruínas, cavernas, montanhas e masmorras subterrâneas, com desafios e recompensas para que os jogadores realizem explorações.

+

RF43

+

RF44 - Deve haver armaduras para os jogadores e seus animais de combate.

+

RF44

+

RF45 - Deve haver armas de dano em área para facilitar combates enfrentando múltiplos inimigos de uma só vez

+

RF45

+

RF46 - Os biomas do Nether, devem possuir desafios e recompensas únicas para incentivar a exploração do submundo.

+

RF46

+

RF47 - Deve haver mobs pacíficos com profissões

+

RF47

+

RF48 - Os jogadores devem ser capazes de personalizar os seus mobs de estimação.

+

RF48

+

RF49 - Deve haver um sistema de crafting automático, que permita aos jogadores automatizar processos.

+

RF49

+

RF50 - Deve haver diferentes tipos de minérios e recursos

+

RF50

+

RF51 - Deve haver diferentes tipos de mobs de animais.

+

RF51

+

RF52 - Deve haver eventos e desafios temporários com recompensas exclusivas

+

RF52

+

RF53 - O jogador deve ser capaz de criar novos mundos no minecraft

+

RF53

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Elicitacoes/AnaliseProtocolo/index.html b/Elicitacoes/AnaliseProtocolo/index.html new file mode 100644 index 0000000..815df4c --- /dev/null +++ b/Elicitacoes/AnaliseProtocolo/index.html @@ -0,0 +1,2109 @@ + + + + + + + + + + + + + + + + + + + + + + + Análise de Protocolo - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Análise de Protocolo

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
31/07/20240.1Criação do documento inicial e adição da introduçãoPatrícia Helena
31/07/20240.2Analise de Protocolo 1 e 2Samara Letícia
31/07/20240.3Analise de Protocolo 3 e 4Patrícia Helena
01/08/20241.0Aplicação de MoSCoW em todas as análisesPatrícia Helena
+

Introdução

+

Trata-se de um método onde o usuário é solicitado a realizar uma tarefa enquanto, simultaneamente, explica em voz alta o processo que está seguindo. Analisamos diferentes modos de jogo do minecraft.

+

Metodologia

+

Todas as descrições e ações do usuário são feitas em voz alta para que o Analisador consiga acompanhar cada passo e classifica-los por prioridades.

+

Vídeo da Analise do modo sobrevivência, Hardcore e multiplayer

+ +

+

Vídeo da Analise do criativo

+ +

+

AP01

+

Análise de Protocolo 1

+

Relator: Patrícia Helena
+Analisador: Samara Letícia
+Modo de jogo : Sobrevivência

+

O método foi realizado com uma pessoa que já conhecia o minecraft, os objetivos eram explorar um pouco o mapa, conseguir recursos, descobrir estruturas e interagir com os mobs.

+

Resumo da Narração

+

Ela entra no Minecraft Launcher com sua conta já logada e cria o mundo no modo Sobrevivência. Anda pelo mapa através do teclado com as teclas w, a, s e d. Coleta um pouco de madeira e usa a ferramenta crafting do jogo para criar uma mesa de trabalho. Cria uma ferramenta com ela e a usa para coletar carvão e pedra. Ela explora outras partes do mapa como o rio, e após minerar um pouco chega a uma caverna. Após explorar um pouco a caverna ela encontra um mob e tem um combate com ele, que após ser derrotado, libera drops usuária. Após explorar um pouco a caverna a usuária encontra um minério raro e uma nova estrutura da atualização, chamada de Trial Chamber. Após explorar um pouco essa estrutura, o personagem da usuária morre após ser espetado por um cacto e volta no local de início do jogo.

+

AP01 Requisitos Elicitados

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CódigoRequisitoDescriçãoPrioridade
AP1.1CadastroUsuário ter conta no minecraftC
AP1.2Uso do TecladoO usuário se locomove através do tecladoM
AP1.3MouseO usuário interage com o mundo através do mouseS
AP1.4InventárioOs recursos ficam no inventário do usuárioM
AP1.5Dicionário de ItensRecurso com explicação de todos os itens ja descobertosM
AP1.6Mesa de trabalhoO usuário precisa dela para fazer ferramentas eficientesS
AP1.7MinériosAtravés dos minérios é possível conseguir novas ferramentasS
AP1.8AlimentoO jogo oferece diferentes tipos de alimento para o personagem do usuário não morrer de fomeM
+

Legenda - técnica de priorização:

+
    +
  • M: Must have; S: Should have; C: Could have; W: Would have.
  • +
+

AP02

+

Análise de Protocolo 2

+

Relator: Patrícia Helena
+Analisador: Samara Letícia
+Modo de jogo : Hardcore

+

O método foi realizado com uma pessoa já familiarizada com Minecraft, tendo experimentado anteriormente todos os recursos do modo [sobrevivência]. Desta vez, a usuária explorou as características únicas do modo Hardcore.

+

Resumo da Narração

+

Após criar um novo mundo, ela notou imediatamente a diferença na interface de vida do modo Hardcore. Para explorar a mecânica de vida única desse modo, ela subiu em uma colina alta e deliberadamente caiu, esvaziando sua barra de vida. Ao fazer isso, ela percebeu que não podia retornar ao jogo no mesmo local, sendo forçada a entrar no modo espectador. Assim, sua jornada naquele mapa chegou ao fim, destacando a intensidade das consequências no modo Hardcore.

+

AP02 Requisitos Elicitados

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CódigoRequisitoDescriçãoPrioridade
AP2.1Vida únicaO usuário tem apenas uma vida, tornando o jogo mais desafiador e definitivoS
AP2.2Modo espectador após a morteApós a morte, o usuário só pode entrar no modo espectador e não pode interagir mais com o mundoM
AP2.3Dificuldade FixaO jogo é automaticamente definido na dificuldade mais alta e não pode ser alteradoM
AP2.4Sem cheatsOs comandos de cheats são desabilitados, garantindo a integridade do desafioS
+

Legenda - técnica de priorização:

+
    +
  • M: Must have; S: Should have; C: Could have; W: Would have.
  • +
+

AP03

+

Análise de Protocolo 3

+

Relator: Samara Letícia +Analisador: Patícia Helena
+Modo de jogo : Criativo

+

O método foi realizado com uma pessoa que já conhecia o minecraft, com objetivo de Criatividade e contrução

+

Resumo da Narração

+

A usuária, já experiente no jogo e com cadastro feito na plataforma, entrou no modo Criativo e [criou um novo mundo] do zero. Imediatamente, notou as diferenças da HUB em relação aos outros modos de jogo. Aproveitando a principal característica do modo Criativo, que é a capacidade de voar, ele explorou o ambiente. Ao acessar o inventário, que contém todos os itens disponíveis no jogo, decidiu iniciar um dos diversos objetivos possíveis: a construção de estruturas. Utilizando os recursos ilimitados do inventário(diferencial do modo Criativo), o usuário construiu uma casa simples como demonstração.

+

AP03 Requisitos Elicitados

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CódigoRequisitoDescriçãoPrioridade
AP3.1Inventário criativoNeste modo o inventario possui TODOS os itens do jogoM
AP3.2Locomoção eficienteO usuário consegue sobrevoar com rapidez pelo mapa, facilitando as criaçõesS
AP3.3Blocos com mesma resistênciaO usuário consegue colocar blocos e quebra-los com apenas um comandoS
AP3.4Inventário completoNeste modo o inventario possui TODOS os itens do jogoM
AP3.5ImortalidadeO usuário não precisa se preocupar com vida nem com barra de fome neste modo, focando assim na criatividade e nao sobrevivênciaM
AP3.6Ambiente PacificoMobs hóstis ignoram a presença do usuárioS
AP3.7Clima e hora do dia ajustáveisO usuário pode alterar o clima e a hora do dia conforme necessário para suas criaçõesS
+

Legenda - técnica de priorização:

+
    +
  • M: Must have; S: Should have; C: Could have; W: Would have.
  • +
+

AP04

+

Análise de Protocolo 4

+

Relator: Patrícia Helena +Analisador: Samara Letícia
+Modo de jogo : multiplayer

+

O método foi realizado com uma pessoa que já conhecia o minecraft, com objetivo de socialização e cooperação

+

Resumo da Narração

+

A usuária, já experiente no jogo e com cadastro feito na plataforma, clicou na aba de multiplayer e selecionou a opção de adicionar um novo servidor. Ela inseriu o IP do servidor e rapidamente se conectou. Dentro do servidor privado, notou a quantidade de jogadores e novos recursos disponíveis, como um chat repleto de comandos e vários modos de jogos personalizados. Para testar essas funcionalidades, ela entrou em uma competição de construção, onde competiu com outros jogadores. O objetivo era escolher um tema e construir algo relacionado; a melhor construção ganhava a rodada. No início da rodada, percebeu que o modo de jogo era criativo para melhor fluidez da construção. Após alguns minutos construindo, a rodada terminou e começou a votação das construções, onde nossa usuária ficou em oitavo lugar.

+

AP04 Requisitos Elicitados

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CódigoRequisitoDescriçãoPrioridade
AP4.1Suporte para Vários JogadoresO servidor deve suportar a conexão simultânea de múltiplos jogadores sem queda de desempenhoM
AP4.2Sistema de chatDeve haver um sistema de chat integrado para comunicação entre jogadores, com suporte a comandos especiaisS
AP4.3Modos de jogos personalizadosO servidor deve permitir a criação e personalização de diversos modos de jogo, como construção, sobrevivência e PvPS
AP4.4Sistema de votaçãoDurante competições, deve haver um sistema de votação justo e intuitivo para escolher as melhores construções ou desempenhosS
AP4.5Eventos ProgramadosO servidor deve permitir a criação e agendamento de eventos e competições especiais para os jogadoresS
+

Legenda - técnica de priorização:

+
    +
  • M: Must have; S: Should have; C: Could have; W: Would have.
  • +
+
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Elicitacoes/Brainstorming/index.html b/Elicitacoes/Brainstorming/index.html new file mode 100644 index 0000000..b4780f1 --- /dev/null +++ b/Elicitacoes/Brainstorming/index.html @@ -0,0 +1,1676 @@ + + + + + + + + + + + + + + + + + + + + + + + Brainstorming - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Brainstorming

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
29/07/20240.1Criação do documentoDanilo Melo, Carlos Eduardo, Patricia Helena
+
+

Introdução

+

O brainstorming é uma técnica de geração de ideias que estimula a criatividade e a inovação em ambientes colaborativos, promovendo a liberdade de expressão e a ausência de críticas durante a fase inicial de propostas. Entre as abordagens, destacam-se o Brainwriting, onde os participantes escrevem suas ideias em papel, favorecendo os mais introvertidos, e o Brainstorming em Grupo, guiado por um facilitador que garante a participação equitativa de todos. Ambas as técnicas visam criar um ambiente seguro e colaborativo, onde as ideias podem ser livremente compartilhadas e desenvolvidas, resultando em soluções mais inovadoras.

+

Metodologia

+

Na primeira etapa, utilizamos a técnica de Brainwriting por meio de um board no Miro, que foi dividido em quatro categorias: Elementos do Jogo, Modos de Jogo, Mecânica de Jogo e Comunidade e Multiplayer. Cada participante foi incentivado a contribuir com suas ideias em cada uma dessas categorias. A atividade foi realizada durante uma chamada no Google Meet, permitindo a colaboração em tempo real e garantindo que todos os participantes pudessem interagir e desenvolver as ideias uns dos outros.

+

Brainwriting

+

Brainwriting

+

Transcrição

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Elementos do JogoModos de JogoMecânicas de JogoComunidade e Multiplayer
FerramentasEspectadorExploraçãoCooperação
CriaturasCriativoTrocasEntretenimento
NetherAventuraCriar MundoSocialização
BiomasSobrevivênciaMineraçãoServidores
AnimaisHardcoreCraftChat
MinériosConstruçãoEventos
ArmadurasRedstoneSkins
ChefesCombateCompetições
ItensAgriculturaMissões
PoçõesEncantamentosMods
AlimentosCriar Animal
EstruturasInventário
EndFarms
Overworld
Blocos
Barcos
Clima
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Elicitacoes/Introspeccao/index.html b/Elicitacoes/Introspeccao/index.html new file mode 100644 index 0000000..716d17a --- /dev/null +++ b/Elicitacoes/Introspeccao/index.html @@ -0,0 +1,2173 @@ + + + + + + + + + + + + + + + + + + + + + + + Introspecção - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Introspecção

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
31/07/20240.1Criação do documentoDanilo Melo
01/08/20240.2Classificação dos requisitosDanilo Melo
06/09/20240.3Correção de duplicataCarlos Eduardo
+
+

Introdução

+

Introspecção é uma técnica muito rica e profunda. Consiste em entender quais propriedades o sistema deve possuir para que seja um sucesso. Demanda o Engenheiro de Requisitos imaginar o que ele gostaria, se ele tivesse que desempenhar uma dada tarefa, com os equipamentos disponíveis e demais recursos.

+

Metodologia

+

Foi feita uma introspecção ao visualizar diferentes fluxos de usuários na plataforma, com base nas definições estabelecidas após o Brainstorming e definição de personas. A introspecção foi estruturada em formato de storytelling, focando nos diversos tipos de usuários da aplicação.

+

Introspecção 1

+

1.1 Contexto

+

Sarah deseja poder criar construções impressionantes no jogo para compartilhar com seus seguidores. Seu plano é erguer um castelo extremamente realista, um projeto que demanda uma atenção meticulosa aos detalhes e uma ampla gama de recursos do jogo. No entanto, Sarah enfrenta um desafio: sua agenda está bastante apertada, deixando-a com pouco tempo livre para se dedicar ao processo de coleta de materiais, que pode ser um dos aspectos mais demorados e tediosos da construção. Portanto, ela busca uma solução que permita a realização do projeto sem a necessidade de passar por essa fase de coleta extensiva.

+

1.2 Necessidades Técnicas

+
    +
  • Um modo com recursos ilimitados
  • +
  • Possibilidade de construir coisas
  • +
  • Movimentação facilitada
  • +
  • Opção de salvar o progresso
  • +
+

1.3 Necessidades Individuais

+
    +
  • Controle do tempo
  • +
  • Uso da criatividade
  • +
+

1.4 Necessidades Sociais

+
    +
  • Poder exibir suas construções para os seus seguidores
  • +
  • Poder compartilhar os seus mapas com outras pessoas
  • +
+

1.5 Requisitos Elicitados

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CódigoDescriçãoPrioridadeClassificação
INT1.1Deve existir um modo de jogo onde o jogador possuí recursos ilimitados (Modo Criativo)MustFuncional
INT1.2O jogador deve ser capaz de voar no Modo CriativoMustFuncional
INT1.3O jogador deve ser capaz de remover blocosMustFuncional
INT1.4O jogo deve ter um sistema de salvamento automáticoMustNão funcional
INT1.5O jogador deve ter acesso a todos os itens de forma práticaMustFuncional
INT1.6O jogador dever ser capaz de colocar alguns blocos na hotbarMustFuncional
INT1.7O jogador deve ser capaz de compartilhar o seu mapa com outro jogadorCouldFuncional
+
+

Introspecção 2

+

2.1 Contexto

+

Após explorar diversos jogos de exploração, Arthur está em busca de uma nova experiência que combine exploração da natureza com desafios moderados. Ele deseja jogar um jogo que permita enfrentar esses desafios de maneira cooperativa com seus amigos, criando uma experiência de jogo mais envolvente e colaborativa. Além disso ele espera encontrar alguma forma de melhorar os seus itens para ficar mais forte durante sua jornada.

+

2.2 Necessidades Técnicas

+
    +
  • Um modo que desafie o jogador
  • +
  • Inimigos para o jogador enfrentar
  • +
  • Sistema de biomas
  • +
  • Multiplayer
  • +
  • Diferentes materiais
  • +
  • Sistema de encantamentos
  • +
  • Ajuste de dificuldade
  • +
  • Sistema de chat
  • +
+

2.3 Necessidades Individuais

+
    +
  • Nível de habilidade
  • +
+

2.4 Necessidades Sociais

+
    +
  • Conexão com internet
  • +
  • Comunicação entre os jogadores
  • +
+

2.5 Requisitos Elicitados

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CódigoDescriçãoPrioridadeClassificação
INT2.1Deve existir um modo de jogo onde o jogador pode morrer (sobrevivência)MustFuncional
INT2.2O jogador deve ter uma quantidade limitada de vidaMustFuncional
INT2.3O jogador deve ser capaz de criar ferramentasMustFuncional
INT2.4O jogador deve ser capaz de atacar os inimigosMustFuncional
INT2.5O jogador deve ser capaz de escolher a dificuldade do jogoShouldFuncional
INT2.6Um jogador deve ser capaz de entrar no mundo de outro jogadorShouldFuncional
INT2.7O jogador deve ser capaz de acessar o chatShouldFuncional
INT2.8O mundo deve ser gerado com diversos biomasMustFuncional
INT2.9O jogador deve ser capaz de melhorar o material dos seus itensMustFuncional
INT2.10O jogador deve ser capaz de encantar os seus itensShouldFuncional
INT2.11Quando um inimigo morrer ele deve deixar um dropMustFuncional
INT2.12O jogador deve ter uma barra de fomeMustFuncional
+

Introspecção 3

+

3.1 Contexto

+

Victor é apaixonado por jogos que oferecem um alto nível de dificuldade, sempre buscando se desafiar ao conquistar todas as conquistas disponíveis. Por isso, ele espera que o jogo ofereça um modo mais desafiador, com inimigos progressivamente mais poderosos. Além disso, ele deseja um sistema de conquistas robusto, que torne os desafios ainda mais dinâmicos e estimulantes.

+

3.2 Necessidades Técnicas

+ +

3.3 Necessidades Individuais

+
    +
  • Habilidade
  • +
  • Conhecimento sobre o jogo
  • +
+

3.4 Necessidades Sociais

+
    +
  • Compartilhar as suas conquistas com outras pessoas
  • +
+

3.5 Requisitos Elicitados

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CódigoDescriçãoPrioridadeClassificação
INT3.1Deve existir um modo de jogo onde o jogador pode morrer permanentemente(Hardcore)ShouldFuncional
INT3.2Cada dimensão deve ter diferentes inimigosMustFuncional
INT3.3Devem existir inimigos de diferentes dificuldadesShouldFuncional
INT3.4O jogo deve apresentar um sistema de conquistasShouldFuncional
INT3.5O jogador deve poder acessar o sistema de conquistas a qualquer momentoShouldFuncional
INT3.6O jogador deve ser capaz de compartilhar suas conquistas com outras pessoasWon'tFuncional
INT3.7O jogo deve possuir chefesMustFuncional
+

Referências

+

Slide Requisitos Aula 7 - Milene Serrano e Maurício Serrano

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Elicitacoes/Moscow/index.html b/Elicitacoes/Moscow/index.html new file mode 100644 index 0000000..24a6928 --- /dev/null +++ b/Elicitacoes/Moscow/index.html @@ -0,0 +1,1656 @@ + + + + + + + + + + + + + + + + + + + + + + + MoSCoW - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

MoSCoW

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
26/07/20240.1Criação do documentoDanilo Melo, Patricia Helena, Carlos Eduardo
01/08/20240.2Adição da transcriçãoDanilo Melo
+
+

Introdução

+

A técnica MoSCoW é uma metodologia de priorização utilizada em gerenciamento de projetos, especialmente em desenvolvimento de software. MoSCoW é um acrônimo que representa quatro categorias de priorização:

+
    +
  • Must have (Deve ter): Requisitos essenciais para o sucesso do projeto. Sem esses itens, o projeto não pode ser considerado um sucesso.
  • +
  • Should have (Deveria ter): Requisitos importantes, mas não essenciais. Eles podem ser adiados se houver limitações de tempo ou recursos, mas são altamente desejáveis.
  • +
  • Could have (Poderia ter): Requisitos que são desejáveis, mas menos críticos. Sua ausência não afetará significativamente o sucesso do projeto.
  • +
  • Won't have (Não terá): Requisitos que foram acordados como não prioritários no momento. Podem ser considerados para versões futuras do projeto.
  • +
+

Objetivos

+

A técnica MoSCoW ajuda equipes a gerenciar recursos de forma eficaz, assegurando que as partes mais críticas do projeto sejam concluídas primeiro e proporcionando uma forma clara de comunicar prioridades aos stakeholders.

+

Metodologia

+

Para aplicar essa técnica, utilizamos um quadro na ferramenta Miro e realizamos uma reunião via Google Meet. Em seguida, usamos as informações obtidas durante o brainstorming para dividir os elementos nas quatro categorias do MoSCoW.

+

Quadro MoSCoW

+

MoSCoW

+

Transcrição

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Must HaveShould HaveCould HaveWon't Have
Modo sobrevivênciaDimensõesMini-gamesCarros
Blocos básicosSistema de redstoneSkinsEstações do ano
Sistema de inventárioDiversidade de mobsModsNarrativa extensa
ConstruçãoDiversidade de MinériosShadersPay to win
Criação de mundosEncantamentosSistemas AutomáticosRealismo excessivo
Mobs básicosBiomasAtualizações temáticasConteúdo Violento
Sistema de craftChefesInteração com os NPCsLinearidade
ExploraçãoAgriculturaMóveisConteúdos pagos exclusivos
+

Referências

+

https://rockcontent.com/br/blog/metodo-moscow/

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Elicitacoes/SWOT/index.html b/Elicitacoes/SWOT/index.html new file mode 100644 index 0000000..bc204e5 --- /dev/null +++ b/Elicitacoes/SWOT/index.html @@ -0,0 +1,1854 @@ + + + + + + + + + + + + + + + + + + + + + + + SWOT - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

SWOT

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
01/08/20240.1Criação do documento inicial e adição da introdução e SWOT do modo SobrevivênciaPatrícia Helena
01/08/20240.2SWOT do modo SobrevivênciaPatrícia Helena
01/08/20240.3SWOT do modo HardcorePatrícia Helena
01/08/20240.4SWOT do modo CriativoPatrícia Helena
01/08/20241.0SWOT do modo MultiplayerPatrícia Helena
+

Introdução

+

A análise SWOT ajuda a desenvolver estratégias eficazes ao fornecer uma visão clara dos pontos fortes e fracos internos, bem como das oportunidades e ameaças externas.

+

Metodologia

+

A análise SWOT é uma ferramenta de planejamento estratégico usada para identificar e avaliar os aspectos internos e externos que podem impactar um projeto, negócio ou iniciativa. O termo "SWOT" é um acrônimo que representa quatro elementos:

+
    +
  • Strengths (Forças): Aspectos internos positivos que a organização ou projeto faz bem e que podem ser alavancados.
  • +
  • Weaknesses (Fraquezas): Aspectos internos negativos que representam áreas de melhoria ou desafios.
  • +
  • Opportunities (Oportunidades): Fatores externos positivos que a organização ou projeto pode explorar para seu benefício.
  • +
  • Threats (Ameaças): Fatores externos negativos que podem causar problemas ou desafios.
  • +
+

SWOT do Modo Multiplayer

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InternoExterno
PositivoForçasOportunidades
- Comunidade ampla- Crescente popularidade dos jogos online
- Alta personalização e mods- Expansão em mercados emergentes
- Facilidade de criação de servidores- Colaborações e parcerias com outras marcas
- Grande variedade de modos de jogo- Desenvolvimento de novas tecnologias de jogo
NegativoFraquezasAmeaças
- Problemas de latência em servidores- Concorrência de outros jogos multiplayer
- Complexidade na configuração inicial- Problemas de segurança e hacking
- Necessidade de moderação ativa- Mudanças nas preferências dos jogadores
- Dependência de terceiros para servidores
+

SWOT do Modo Survival

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InternoExterno
PositivoForçasOportunidades
- Experiência de jogo desafiadora- Crescente interesse em jogos de sobrevivência
- Grande sensação de progresso- Potencial para novas expansões e DLCs
- Diversidade de biomas e recursos- Desenvolvimento de novas mecânicas de jogo
- Sistema de crafting profundo
NegativoFraquezasAmeaças
- Pode ser frustrante para novatos- Concorrência de outros jogos de sobrevivência
- Dependência de tempo para progresso- Problemas técnicos e bugs
- Repetitividade a longo prazo- Cair na monotonia
- Necessidade de gerenciamento de recursos- Possíveis problemas de balanceamento
+

SWOT do Modo Hardcore

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InternoExterno
PositivoForçasOportunidades
- Alta intensidade e desafio- Comunidade de jogadores hardcore crescente
- Grande senso de realização- Torneios e competições de sobrevivência
- Modo de jogo para jogadores experientes- Desenvolvimento de novas mecânicas extremas
- Permanente, aumenta a tensão
NegativoFraquezasAmeaças
- Alto risco de frustração- Perda de jogadores devido à dificuldade
- Menor acessibilidade para iniciantes- Bugs ou problemas técnicos que podem prejudicar a experiência
- Falta de novos objetivos a longo prazo- Concorrência com outros jogos de alta dificuldade
- Alto impacto de erros ou falhas- Mudanças nas preferências de jogos dos jogadores
+

SWOT do Modo Criativo

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
InternoExterno
PositivoForçasOportunidades
- Liberdade total para criação- Expansão em plataformas educacionais
- Acesso a todos os recursos do jogo- Potencial para colaborações com artistas e designers
- Ideal para construção e design- Desenvolvimento de novas ferramentas de construção
- Ambiente pacífico e sem hostilidade
NegativoFraquezasAmeaças
- Pode ser menos desafiador- Concorrência com outras plataformas de construção
- Falta de objetivos específicos- Possíveis problemas de direitos autorais com criações
- Dependência de criatividade do jogador- Mudanças nas tendências e preferências dos jogadores
- Potencial para tédio a longo prazo- Problemas técnicos que afetam a construção
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Elicitacoes/questionarios-e-pesquisas/index.html b/Elicitacoes/questionarios-e-pesquisas/index.html new file mode 100644 index 0000000..77cddaa --- /dev/null +++ b/Elicitacoes/questionarios-e-pesquisas/index.html @@ -0,0 +1,1804 @@ + + + + + + + + + + + + + + + + + + + + + + + Questionários e pesquisas - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Questionários e pesquisas

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
20/08/20240.0.1Criação e divulgação do questionárioCarlos Eduardo e Samara Letícia
21/08/20240.1Pesquisa e criação do documentoCarlos Eduardo
+

Introdução

+

Este documento tem como objetivo apresentar os resultados de uma pesquisa exploratória realizada tanto na internet quanto através de questionários aplicados aos jogadores. A finalidade principal foi conduzir uma engenharia reversa, visando identificar funcionalidades recentemente adicionadas ao jogo, além de entender as percepções e opiniões dos jogadores sobre essas novas atualizações.

+

A pesquisa foi divulgada em grupos de jogadores de minecraft no Discord e facebook.

+

Pesquisas

+

As pesquisas realizadas permitiram identificar diversas atualizações que foram bastante aguardadas pela comunidade e que introduziram novas funcionalidades ao jogo.

+

Atualização Villager & Pillager (1.10)

+

Os aldeões receberam uma reformulação, com novas dinâmicas e profissões. Além disso, foram introduzidos os Pillagers, inimigos dos Villagers, que representam uma nova ameaça às vilas.

+

Atualização Aquática (1.13)

+

Muito solicitada pela comunidade, a Atualização Aquática trouxe novos biomas oceânicos, introduziu novas dinâmicas e desafios, e adicionou vida marinha ao jogo. Novos mobs, um novo Boss, e o Templo do Oceano foram implementados, criando um desafio novo para os jogadores.

+

Update do Nether (1.16)

+

Esta atualização introduziu novos mobs, estruturas, e três novos biomas ao Nether. A exploração do submundo se tornou mais frequente com a introdução de novas mecânicas e desafios.

+

Atualização Caves & Cliffs: Part I (1.17)

+

Trouxe várias novidades, principalmente focadas em novas funcionalidades e blocos relacionados a cavernas e montanhas. Algumas das novidades:

+
    +
  • Ametista e Geodos: Foram adicionados geodos de ametista, usados para criar telescópios e blocos decorativos.
  • +
  • Cobre: Um novo minério que pode ser minerado e usado para criar blocos de cobre, usado para fabricar itens como o para-raios e o telescópio.
  • +
  • Moss Block: blocos de musgo que pode ser usado para decoração e jardinagem.
  • +
  • Líquen brilhante: Uma fonte de luz natural encontrada raramente em cavernas, crescendo em qualquer face de um blocos.
  • +
  • Azaleia: Planta que inclui arbustos e árvores para decoração.
  • +
  • Axolote: Mob aquático encontrado em cavernas de água. Pode ser capturado com baldes e auxilia os jogadores em combates subaquáticos. (primeiro anfíbio a ser adicionado ao Minecraft)
  • +
  • Cabra: Mob encontrado em montanhas. Elas podem saltar grandes distâncias e eventualmente chifrar jogadores e outros mobs.
  • +
  • Lula-brilhante: Uma variante brilhante do lula normal, que solta bolsa de tinta brilhante ao ser derrotada, usada para criar itens que brilham, como placas iluminadas.
  • +
  • Telescópio: Um item novo que permite que os jogadores dêem zoom para ver objetos distantes.
  • +
  • Para-raios: Usado para proteger estruturas de serem incendiadas por raios, redirecionando os raios para o para-raios.
  • +
+

Tricky Trials (1.21)

+

Uma das adições desta atualização foi a Câmara do Julgamento, onde os jogadores enfrentam hordas temporárias de inimigos gerados por spawners. Ao superar esse novo tipo de desafio, os jogadores são recompensados.

+

Outras importantes adições:

+
    +
  • Armadura de Lobo: Armadura protetora que pode ser equipada nos lobos do jogador, melhorando sua defesa e permitindo que sejam tingidas com diferentes cores.
  • +
  • Mace: Uma nova arma poderosa que causa dano em área e é ideal para combates em masmorras.
  • +
  • Novos mobs: Breeze e Bogged Skeleton: O Breeze utiliza poderosas rajadas de ar​ nos jogadores, enquanto o Bogged Skeleton dispara flechas envenenadas.
  • +
  • Crafter: Um novo blocos automatizado movido a Redstone que facilita a criação de itens.
  • +
  • Trial Chambers: Novas masmorras subterrâneas com desafios, armadilhas e mobs únicos para os jogadores enfrentarem.
  • +
+

Questionário

+

Sabemos que muitas pessoas não gostam de responder questionários, especialmente quando são longos. Com isso em mente, foi criado um questionário curto, com apenas três perguntas, mas que o grupo julgou ser suficientes para o propósito.

+

O formulário foi divido em duas seções:

+
    +
  • Atualizações Recentes: Visa identificar quais atualizações recentes do Minecraft geraram mais expectativa entre os jogadores.
  • +
  • Funcionalidades Futuras: Busca saber quais funcionalidades ou melhorias os jogadores gostariam de ver nas próximas atualizações do Minecraft.
  • +
+

Confira as respostas do questionário aqui.

+

Requisitos Elicitados

+

Com base no questionário e na pesquisa realizada, abaixo estão os requisitos identificados.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CódigoDescrição
QP1Deve haver novos blocos decorativos para expandir as opções de construção e paisagismo.
QP2Devem ser adicionados novos biomas e ruínas para exploração.
QP3Deve haver armaduras para que possam proteger os lobos durante o jogo.
QP4Deve ser adicionada uma nova arma de dano em área para facilitar combates enfrentando múltiplos inimigos de uma só vez
QP5Deve haver a inclusão de novos biomas do Nether, adicionando desafios para incentivar a exploração do submundo.
QP6Deve ser introduzido um telescópio, permitindo aos jogadores maior alcance de visão.
QP7Deve ser melhorada a dinâmica de interação com aldeões, com novas profissões e comportamentos
QP8Deve haver mais opções de personalização para mobs de estimação.
QP9Deve haver um sistema de crafting automático, que permita aos jogadores automatizar processos.
QP10Deve haver vida marinha, incluindo novos mobs desafiadores.
QP11Deve haver mais atualizações focadas em cavernas e montanhas, expandindo os blocos e recursos disponíveis.
QP12Deve haver a inclusão do minério de cobre.
QP13Nova mecânica de defesa contra raios, com a introdução de blocos como o para-raios.
QP14Deve ser incluídos novos mobs de animais.
QP15Novo sistema de iluminação, com lâmpadas de cobre.
QP16Deve haver novas estruturas geradas como masmorras subterrâneas, com novos desafios e recompensas.
QP17Deve haver novos inimigos
QP18Novos eventos e desafios temporários com recompensas exclusivas
+
+

Referências:

+

Adegilson. Minecraft: Seria a atualização 1.21 a maior desde o update do Nether?. Acesso em: ago de 2024. Disponível em: https://nationpop.com.br/seria-a-atualizacao-1-21-a-maior-desde-o-update-do-nether/ +

+

Boddy, ZACHARY. The Minecraft 1.21 update is official, with automated crafting, trial dungeons, and a brand-new mob. Acesso em: ago de 2024. Disponível em: https://www.windowscentral.com/gaming/minecraft/the-minecraft-121-update-is-official-with-automated-crafting-trial-dungeons-and-a-brand-new-mob + +

+

Boddy, ZACHARY. Minecraft 1.21 'Tricky Trials Update' FAQ: Release date, features, mobs, snapshots, and other questions answered. Acesso em: ago de 2024. Disponível em: https://www.windowscentral.com/gaming/minecraft/minecraft-1-21-update-faq + +

+

Minecraft Wiki. Edição Java 1.17. Acesso em: ago de 2024. Disponível em: https://minecraft.fandom.com/pt/wiki/Edi%C3%A7%C3%A3o_Java_1.17 + +

+
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Elicitacoes/requisitos-nao-funcionais/index.html b/Elicitacoes/requisitos-nao-funcionais/index.html new file mode 100644 index 0000000..3355ff2 --- /dev/null +++ b/Elicitacoes/requisitos-nao-funcionais/index.html @@ -0,0 +1,1610 @@ + + + + + + + + + + + + + + + + + + + + + + + Requisitos não funcionais - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Observação dos Requisitos não funcionais

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
21/08/20240.1Criação do documentoCarlos Eduardo
08/09/20240.2Atualizando a tabelaDanilo Melo
+

Introdução

+

Abaixo estão reunidos os requisitos que foram observados no minecraft a respeito da qualidade do sistema, como desempenho, segurança e usabilidade. Estes requisitos ajudam a garantir que o jogo ofereça uma experiência de usuário satisfatória.

+

Requisitos Elicitados

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CategoriaCódigoRequisito
DesempenhoRNF1O jogo deve ter um tempo de resposta rápido para ações dos jogadores, como movimentação e interação com blocos.
DesempenhoRNF2O jogo deve minimizar a latência de rede para garantir uma experiência de jogo suave em modos multiplayer.
DesempenhoRNF3O chat deve funcionar de forma fluida e sem atrasos perceptíveis.
DesempenhoRNF4Deve haver opções para ajustar a qualidade gráfica, incluindo resolução, distância de renderização e efeitos visuais.
SegurançaRNF5O jogo deve ter mecanismos para proteger as contas dos jogadores contra acessos não autorizados.
UsabilidadeRNF6A interface do usuário deve ser intuitiva e fácil de navegar.
UsabilidadeRNF7O jogo deve fornecer feedback visual e auditivo claro para as ações dos jogadores.
UsabilidadeRNF8O jogador deve ser capaz de personalizar atalhos de teclado e controles.
UsabilidadeRNF9O jogo deve incluir um sistema de ajuda relevante durante a gameplay.
CompatibilidadeRNF10O jogo deve ser compatível com diferentes plataformas como PC, consoles e dispositivos móveis.
CompatibilidadeRNF11Deve haver suporte para diferentes resoluções e configurações de gráficos.
CompatibilidadeRNF12O jogo deve oferecer suporte a mods e plugins em diferentes plataformas.
Requisitos AdicionaisRNF13O jogo deve suportar múltiplos idiomas.
Requisitos AdicionaisRNF14O jogo deve permitir a personalização de skins e pacotes de textura.
Requisitos AdicionaisRNF15O menu de pausa deve ser acessível durante o jogo e deve permitir que os jogadores acessem as configurações ou saiam do jogo facilmente.
Requisitos AdicionaisRNF16O jogo deve permitir que os jogadores personalizem os controles de entrada de acordo com suas preferências.
Requisitos AdicionaisRNF17O jogo deve permitir aos jogadores ajustar o volume do som e da música separadamente.
Requisitos AdicionaisRNF18O jogo deve ter um sistema de salvamento automático para evitar perda de progresso.
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/Elicitacoes/resultados/index.html b/Elicitacoes/resultados/index.html new file mode 100644 index 0000000..0b14ed3 --- /dev/null +++ b/Elicitacoes/resultados/index.html @@ -0,0 +1,1810 @@ + + + + + + + + + + + + + + + + + + + + + + + Resultados das elicitações - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + + + Ir para o conteúdo + + +
+
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Resultado das técnicas de elicitação

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
06/09/20240.1Criação do documento inicial e adição dos RF1 a RF23 e RNF1Carlos Eduardo Rodrigues
07/09/20240.2Adição RF24 a RF52 e RNF2Carlos Eduardo Rodrigues
08/09/20240.3Adição RF53Carlos Eduardo Rodrigues
+

Requisitos Funcionais

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CódigoRequisitoTécnica(s)
RF1O usuário deve ser capaz de criar, entrar e gerenciar uma conta no Minecraft.Análise de Protocolo
RF2O usuário deve ser capaz de se locomover utilizando o teclado.Análise de Protocolo
RF3O usuário deve ser capaz de interagir com o mundo utilizando o mouse.Análise de Protocolo
RF4Os recursos devem ser armazenados no inventário do usuário.Análise de Protocolo, Brainstorming, MoSCoW, Introspeccao
RF5O jogo deve possuir um dicionário com a explicação de todos os itens descobertos pelo usuário.Análise de Protocolo
RF6O usuário deve precisar de uma mesa de trabalho para fabricar ferramentas eficientes.Análise de Protocolo
RF7O jogo deve permitir que, através de minérios, o usuário crie novas ferramentas.Análise de Protocolo, Brainstorming, MoSCoW
RF8O jogo deve oferecer diferentes tipos de alimentos para evitar que o personagem do usuário morra de fome.Análise de Protocolo, Brainstorming
RF9No modo hardcore, o usuário deve ter apenas uma vida, tornando o jogo mais desafiador e definitivo.Análise de Protocolo, Introspeccao
RF10No modo hardcore, após a morte, o usuário deve ser capaz de entrar apenas no modo espectador, sem interagir com o mundo.Análise de Protocolo
RF11No modo hardcore, o jogo deve ser definido automaticamente na dificuldade mais alta e não pode ser alterado.Análise de Protocolo
RF12No modo hardcore, os comandos de cheats devem estar desabilitados para garantir a integridade do desafio.Análise de Protocolo
RF13Deve existir um modo de jogo onde o jogador pode exercitar a sua criatividadeAnálise de protocolo
RF14No modo criativo, o usuário deve ser capaz de sobrevoar rapidamente pelo mapa para facilitar as criações.Análise de Protocolo, Introspeccao
RF15O usuário deve ser capaz de colocar e quebrar blocos com apenas um comando no modo criativo.Análise de Protocolo, Introspeccao
RF16O usuário deve ter acesso a todos os itens do jogo no modo criativo.Análise de Protocolo, Introspeccao
RF17O usuário não deve precisar se preocupar com vida ou barra de fome no modo criativo, focando apenas em criar.Análise de Protocolo
RF18Mobs hostis devem ignorar a presença do usuário no modo criativo.Análise de Protocolo
RF19No modo criativo, usuário deve ser capaz de alterar o clima e a hora do dia conforme necessário para suas criações.Análise de Protocolo
RF20Deve haver um sistema de chat para comunicação entre os jogadores, com suporte a comandos especiais.Análise de Protocolo, Brainstorming, Introspeccao
RF21Jogos multiplayer devem permitir a criação e personalização de diversos modos de jogo, como construção, sobrevivência e PvP.Análise de Protocolo, Brainstorming
RF22Jogos multiplayer devem fornecer um sistema de votação justo e intuitivo durante competições para escolher as melhores construções ou desempenhos.Análise de Protocolo, Brainstorming
RF23Em Jogos multiplayer deve ser possível a criação e agendamento de eventos e competições especiais para os jogadores.Análise de Protocolo
RF24O jogador dever ser capaz de colocar alguns blocos na hotbar.Introspeccao
RF25O jogador deve ser capaz de compartilhar o seu mapa com outro jogador.Introspeccao
RF26Deve existir um modo de jogo onde o jogador pode morrer (sobrevivência)Introspeccao, Brainstorming, MoSCoW
RF27Com exceção dos modos Criativo e Espectador, o jogador deve ter uma quantidade limitada de vidaIntrospeccao
RF28O jogador deve ser capaz de criar ferramentasIntrospeccao
RF29O jogador deve ser capaz de atacar os inimigosIntrospeccao
RF30Com exceção do modo hardcore, o jogador deve ser capaz de escolher a dificuldade do jogoIntrospeccao
RF31O mundo deve ser gerado com diversos biomasIntrospeccao
RF32O jogador deve ser capaz de melhorar o material dos seus itensIntrospeccao
RF33O jogador deve ser capaz de encantar os seus itensIntrospeccao
RF34Quando um inimigo morrer ele deve deixar um dropIntrospeccao
RF35O jogador deve ter uma barra de fomeIntrospeccao
RF36Cada dimensão deve ter diferentes inimigosIntrospeccao, Questionário
RF37Devem existir inimigos de diferentes dificuldadesIntrospeccao
RF38O jogo deve apresentar um sistema de conquistasIntrospeccao
RF39O jogador deve poder acessar o sistema de conquistas a qualquer momentoIntrospeccao
RF40O jogador deve ser capaz de compartilhar suas conquistas com outros jogadoresIntrospeccao
RF41O jogo deve possuir chefesIntrospeccao
RF42Deve haver blocos decorativos para expandir as opções de construção e paisagismo.Questionário
RF43Deve haver ruínas, cavernas, montanhas e masmorras subterrâneas, com desafios e recompensas para que os jogadores realizem explorações.Questionário
RF44Deve haver armaduras para os jogadores e seus animais de combate.Questionário
RF45Deve haver armas de dano em área para facilitar combates enfrentando múltiplos inimigos de uma só vezQuestionário
RF46Os biomas do Nether, devem possuir desafios e recompensas únicas para incentivar a exploração do submundo.Questionário
RF47Deve haver mobs pacíficos com profissõesQuestionário
RF48Os jogadores devem ser capazes de personalizar os seus mobs de estimação.Questionário
RF49Deve haver um sistema de crafting automático, que permita aos jogadores automatizar processos.Questionário
RF50Deve haver diferentes tipos de minérios e recursosQuestionário
RF51Deve haver diferentes tipos de mobs de animais.Questionário
RF52Deve haver eventos e desafios temporários com recompensas exclusivasQuestionário
RF53O jogador deve ser capaz de criar novos mundos no minecraftBrainstorming, Análise de protocolo
+

Requisitos Não Funcionais

+ + + + + + + + + + + + + + + + + + + + +
CódigoRequisitoTécnica(s)
RNF1O servidor deve suportar a conexão simultânea de múltiplos jogadores sem queda de desempenho.Análise de Protocolo
RNF2O jogo deve ter um sistema de salvamento automáticoIntrospeccao
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/assets/css/style.css b/assets/css/style.css new file mode 100644 index 0000000..717a71e --- /dev/null +++ b/assets/css/style.css @@ -0,0 +1,189 @@ + @font-face { + font-family: 'Minecraft-ten'; + src: url('../fonts/minecraft-ten.ttf') format('truetype'); + } + + @font-face { + font-family: 'Minecraft-seven'; + src: url('../fonts/Minecraft.otf') format('truetype'); + } + + h1, + h2 { + font-family: 'Minecraft-ten', sans-serif; + } + + .row { + display: inline-block; + } + + .col-7 { + width: 65%; + display: inline-block; + } + + .col-sm { + width: 30%; + display: inline-block; + text-align: center; + } + + @media(max-width: 800px) { + .row { + display: block; + } + .col-7 { + width: 100%; + display: block; + } + .col-sm { + width: 100%; + display: block; + text-align: center; + } + .img-personagens { + width: 50%!important; + } + } + + header, + footer { + background: url(https://www.minecraft.net/content/dam/minecraft/backgrounds/bg-wool-dark.png); + } + + .md-logo img { + height: 30px!important; + } + + thead { + font-family: 'Minecraft-seven'; + border-style: none; + box-shadow: inset 0px 0px 0 #111, inset 0px 6px 0 #555; + font-size: .75rem; + background: #252525; + color: #fff; + } + + iframe { + width: 100%; + height: 405px; + border: none; + background: #252422; + padding: 20px; + } + + .img-iframe { + margin-top: -25px; + width: 100%; + } + + :root, + [data-md-color-scheme=default] { + --md-hue: 225deg; + --md-default-fg-color: #000000de; + --md-default-fg-color--light: #000000; + --md-default-fg-color--lighter: #00000052; + --md-default-fg-color--lightest: #00000012; + --md-default-bg-color: #fff; + --md-default-bg-color--light: #ffffffb3; + --md-default-bg-color--lighter: #ffffff4d; + --md-default-bg-color--lightest: #ffffff1f; + --md-code-fg-color: #36464e; + --md-code-bg-color: #f5f5f5; + --md-code-hl-color: #4287ff; + --md-code-hl-color--light: #4287ff1a; + --md-code-hl-number-color: #d52a2a; + --md-code-hl-special-color: #db1457; + --md-code-hl-function-color: #a846b9; + --md-code-hl-constant-color: #6e59d9; + --md-code-hl-keyword-color: #3f6ec6; + --md-code-hl-string-color: #1c7d4d; + --md-code-hl-name-color: var(--md-code-fg-color); + --md-code-hl-operator-color: var(--md-default-fg-color--light); + --md-code-hl-punctuation-color: var(--md-default-fg-color--light); + --md-code-hl-comment-color: var(--md-default-fg-color--light); + --md-code-hl-generic-color: var(--md-default-fg-color--light); + --md-code-hl-variable-color: var(--md-default-fg-color--light); + --md-typeset-color: var(--md-default-fg-color); + --md-typeset-a-color: var(--md-primary-fg-color); + --md-typeset-del-color: #f5503d26; + --md-typeset-ins-color: #0bd57026; + --md-typeset-kbd-color: #fafafa; + --md-typeset-kbd-accent-color: #fff; + --md-typeset-kbd-border-color: #b8b8b8; + --md-typeset-mark-color: #ffff0080; + --md-typeset-table-color: #0000001f; + --md-typeset-table-color--light: rgba(0, 0, 0, .035); + --md-admonition-fg-color: var(--md-default-fg-color); + --md-admonition-bg-color: var(--md-default-bg-color); + --md-warning-fg-color: #000000de; + --md-warning-bg-color: #ff9; + --md-footer-fg-color: #fff; + --md-footer-fg-color--light: #ffffffb3; + --md-footer-fg-color--lighter: #ffffff73; + --md-footer-bg-color: #000000de; + --md-footer-bg-color--dark: #00000052; + --md-shadow-z1: 0 0.2rem 0.5rem #0000000d, 0 0 0.05rem #0000001a; + --md-shadow-z2: 0 0.2rem 0.5rem #0000001a, 0 0 0.05rem #00000040; + --md-shadow-z3: 0 0.2rem 0.5rem #0003, 0 0 0.05rem #00000059; + } + + [data-md-color-scheme=slate] { + --md-default-fg-color: hsla(var(--md-hue), 15%, 90%, 0.82); + --md-default-fg-color--light: #fff; + --md-default-fg-color--lighter: hsla(var(--md-hue), 15%, 90%, 0.32); + --md-default-fg-color--lightest: hsla(var(--md-hue), 15%, 90%, 0.12); + --md-default-bg-color: hsla(var(--md-hue), 15%, 14%, 1); + --md-default-bg-color--light: hsla(var(--md-hue), 15%, 14%, 0.54); + --md-default-bg-color--lighter: hsla(var(--md-hue), 15%, 14%, 0.26); + --md-default-bg-color--lightest: hsla(var(--md-hue), 15%, 14%, 0.07); + --md-code-fg-color: hsla(var(--md-hue), 18%, 86%, 0.82); + --md-code-bg-color: hsla(var(--md-hue), 15%, 18%, 1); + --md-code-hl-color: #2977ff; + --md-code-hl-color--light: #2977ff1a; + --md-code-hl-number-color: #e6695b; + --md-code-hl-special-color: #f06090; + --md-code-hl-function-color: #c973d9; + --md-code-hl-constant-color: #9383e2; + --md-code-hl-keyword-color: #6791e0; + --md-code-hl-string-color: #2fb170; + --md-code-hl-name-color: var(--md-code-fg-color); + --md-code-hl-operator-color: var(--md-default-fg-color--light); + --md-code-hl-punctuation-color: var(--md-default-fg-color--light); + --md-code-hl-comment-color: var(--md-default-fg-color--light); + --md-code-hl-generic-color: var(--md-default-fg-color--light); + --md-code-hl-variable-color: var(--md-default-fg-color--light); + --md-typeset-color: var(--md-default-fg-color); + --md-typeset-a-color: var(--md-primary-fg-color); + --md-typeset-kbd-color: hsla(var(--md-hue), 15%, 90%, 0.12); + --md-typeset-kbd-accent-color: hsla(var(--md-hue), 15%, 90%, 0.2); + --md-typeset-kbd-border-color: hsla(var(--md-hue), 15%, 14%, 1); + --md-typeset-mark-color: #4287ff4d; + --md-typeset-table-color: hsla(var(--md-hue), 15%, 95%, 0.12); + --md-typeset-table-color--light: hsla(var(--md-hue), 15%, 95%, 0.035); + --md-admonition-fg-color: var(--md-default-fg-color); + --md-admonition-bg-color: var(--md-default-bg-color); + --md-footer-bg-color: hsla(var(--md-hue), 15%, 10%, 0.87); + --md-footer-bg-color--dark: hsla(var(--md-hue), 15%, 8%, 1); + --md-shadow-z1: 0 0.2rem 0.5rem #0000000d, 0 0 0.05rem #0000001a; + --md-shadow-z2: 0 0.2rem 0.5rem #00000040, 0 0 0.05rem #00000040; + --md-shadow-z3: 0 0.2rem 0.5rem #0006, 0 0 0.05rem #00000059; + color-scheme: dark; + } + + [data-md-color-primary=black] { + --md-primary-fg-color: hsla(var(--md-hue), 15%, 9%, 1); + --md-primary-fg-color--light: hsla(var(--md-hue), 15%, 9%, 0.54); + --md-primary-fg-color--dark: hsla(var(--md-hue), 15%, 9%, 1); + --md-primary-bg-color: hsla(var(--md-hue), 15%, 100%, 1); + --md-primary-bg-color--light: hsla(var(--md-hue), 15%, 100%, 0.7); + --md-typeset-a-color: #4051b5; + } + + body { + cursor: url("../imgs/cursor.png"), auto; + } + + .md-typeset table:not([class]) th { + min-width: auto; + } \ No newline at end of file diff --git a/assets/fonts/Minecraft.otf b/assets/fonts/Minecraft.otf new file mode 100644 index 0000000..6904fc1 Binary files /dev/null and b/assets/fonts/Minecraft.otf differ diff --git a/assets/fonts/minecraft-seven-2.ttf b/assets/fonts/minecraft-seven-2.ttf new file mode 100644 index 0000000..ba2c52d Binary files /dev/null and b/assets/fonts/minecraft-seven-2.ttf differ diff --git a/assets/fonts/minecraft-ten.ttf b/assets/fonts/minecraft-ten.ttf new file mode 100644 index 0000000..28444b4 Binary files /dev/null and b/assets/fonts/minecraft-ten.ttf differ diff --git a/assets/images/favicon.png b/assets/images/favicon.png new file mode 100644 index 0000000..1cf13b9 Binary files /dev/null and b/assets/images/favicon.png differ diff --git a/assets/imgs/Brainwriting.jpg b/assets/imgs/Brainwriting.jpg new file mode 100644 index 0000000..e580d88 Binary files /dev/null and b/assets/imgs/Brainwriting.jpg differ diff --git a/assets/imgs/Caso de uso.jpg b/assets/imgs/Caso de uso.jpg new file mode 100644 index 0000000..34b3306 Binary files /dev/null and b/assets/imgs/Caso de uso.jpg differ diff --git a/assets/imgs/Moscow.jpg b/assets/imgs/Moscow.jpg new file mode 100644 index 0000000..f1221fe Binary files /dev/null and b/assets/imgs/Moscow.jpg differ diff --git a/assets/imgs/NFR-Desempenho.png b/assets/imgs/NFR-Desempenho.png new file mode 100644 index 0000000..aba21ff Binary files /dev/null and b/assets/imgs/NFR-Desempenho.png differ diff --git a/assets/imgs/NFR-Usabilidade.png b/assets/imgs/NFR-Usabilidade.png new file mode 100644 index 0000000..28e74e9 Binary files /dev/null and b/assets/imgs/NFR-Usabilidade.png differ diff --git a/assets/imgs/Personas.png b/assets/imgs/Personas.png new file mode 100644 index 0000000..60385b3 Binary files /dev/null and b/assets/imgs/Personas.png differ diff --git "a/assets/imgs/RichPicture - Cria\303\247\303\243o de mundo.jpg" "b/assets/imgs/RichPicture - Cria\303\247\303\243o de mundo.jpg" new file mode 100644 index 0000000..b70aa83 Binary files /dev/null and "b/assets/imgs/RichPicture - Cria\303\247\303\243o de mundo.jpg" differ diff --git "a/assets/imgs/RichPicture - Explora\303\247\303\243o.jpg" "b/assets/imgs/RichPicture - Explora\303\247\303\243o.jpg" new file mode 100644 index 0000000..9b3c2d9 Binary files /dev/null and "b/assets/imgs/RichPicture - Explora\303\247\303\243o.jpg" differ diff --git a/assets/imgs/RichPicture - Personagem.jpg b/assets/imgs/RichPicture - Personagem.jpg new file mode 100644 index 0000000..27c3f54 Binary files /dev/null and b/assets/imgs/RichPicture - Personagem.jpg differ diff --git "a/assets/imgs/RichPicture - Vis\303\243o geral.jpg" "b/assets/imgs/RichPicture - Vis\303\243o geral.jpg" new file mode 100644 index 0000000..e4e481d Binary files /dev/null and "b/assets/imgs/RichPicture - Vis\303\243o geral.jpg" differ diff --git a/assets/imgs/arg1.png b/assets/imgs/arg1.png new file mode 100644 index 0000000..0a145f2 Binary files /dev/null and b/assets/imgs/arg1.png differ diff --git a/assets/imgs/arg2.png b/assets/imgs/arg2.png new file mode 100644 index 0000000..16ded2e Binary files /dev/null and b/assets/imgs/arg2.png differ diff --git a/assets/imgs/criar_mundo.jpg b/assets/imgs/criar_mundo.jpg new file mode 100644 index 0000000..9f69bbd Binary files /dev/null and b/assets/imgs/criar_mundo.jpg differ diff --git a/assets/imgs/cursor.png b/assets/imgs/cursor.png new file mode 100644 index 0000000..288b3d1 Binary files /dev/null and b/assets/imgs/cursor.png differ diff --git a/assets/imgs/exploracao.png b/assets/imgs/exploracao.png new file mode 100644 index 0000000..1cf0fdb Binary files /dev/null and b/assets/imgs/exploracao.png differ diff --git a/assets/imgs/icone.png b/assets/imgs/icone.png new file mode 100644 index 0000000..023925c Binary files /dev/null and b/assets/imgs/icone.png differ diff --git a/assets/imgs/logo-minecraft.png b/assets/imgs/logo-minecraft.png new file mode 100644 index 0000000..8c643a9 Binary files /dev/null and b/assets/imgs/logo-minecraft.png differ diff --git a/assets/imgs/modos_de_jogo.png b/assets/imgs/modos_de_jogo.png new file mode 100644 index 0000000..9f92f38 Binary files /dev/null and b/assets/imgs/modos_de_jogo.png differ diff --git a/assets/imgs/personaarthur.jpg b/assets/imgs/personaarthur.jpg new file mode 100644 index 0000000..44b993f Binary files /dev/null and b/assets/imgs/personaarthur.jpg differ diff --git a/assets/imgs/personasarah.jpg b/assets/imgs/personasarah.jpg new file mode 100644 index 0000000..af24e64 Binary files /dev/null and b/assets/imgs/personasarah.jpg differ diff --git a/assets/imgs/personavictor.jpg b/assets/imgs/personavictor.jpg new file mode 100644 index 0000000..3415d66 Binary files /dev/null and b/assets/imgs/personavictor.jpg differ diff --git a/assets/imgs/transition-grey-6.png b/assets/imgs/transition-grey-6.png new file mode 100644 index 0000000..dd21cd3 Binary files /dev/null and b/assets/imgs/transition-grey-6.png differ diff --git a/assets/javascripts/bundle.56dfad97.min.js b/assets/javascripts/bundle.56dfad97.min.js new file mode 100644 index 0000000..1df62cd --- /dev/null +++ b/assets/javascripts/bundle.56dfad97.min.js @@ -0,0 +1,16 @@ +"use strict";(()=>{var Fi=Object.create;var gr=Object.defineProperty;var Wi=Object.getOwnPropertyDescriptor;var Ui=Object.getOwnPropertyNames,Vt=Object.getOwnPropertySymbols,Di=Object.getPrototypeOf,yr=Object.prototype.hasOwnProperty,io=Object.prototype.propertyIsEnumerable;var no=(e,t,r)=>t in e?gr(e,t,{enumerable:!0,configurable:!0,writable:!0,value:r}):e[t]=r,$=(e,t)=>{for(var r in t||(t={}))yr.call(t,r)&&no(e,r,t[r]);if(Vt)for(var r of Vt(t))io.call(t,r)&&no(e,r,t[r]);return e};var ao=(e,t)=>{var r={};for(var o in e)yr.call(e,o)&&t.indexOf(o)<0&&(r[o]=e[o]);if(e!=null&&Vt)for(var o of Vt(e))t.indexOf(o)<0&&io.call(e,o)&&(r[o]=e[o]);return r};var xr=(e,t)=>()=>(t||e((t={exports:{}}).exports,t),t.exports);var Vi=(e,t,r,o)=>{if(t&&typeof t=="object"||typeof t=="function")for(let n of Ui(t))!yr.call(e,n)&&n!==r&&gr(e,n,{get:()=>t[n],enumerable:!(o=Wi(t,n))||o.enumerable});return e};var Lt=(e,t,r)=>(r=e!=null?Fi(Di(e)):{},Vi(t||!e||!e.__esModule?gr(r,"default",{value:e,enumerable:!0}):r,e));var so=(e,t,r)=>new Promise((o,n)=>{var i=p=>{try{s(r.next(p))}catch(c){n(c)}},a=p=>{try{s(r.throw(p))}catch(c){n(c)}},s=p=>p.done?o(p.value):Promise.resolve(p.value).then(i,a);s((r=r.apply(e,t)).next())});var po=xr((Er,co)=>{(function(e,t){typeof Er=="object"&&typeof co!="undefined"?t():typeof define=="function"&&define.amd?define(t):t()})(Er,function(){"use strict";function e(r){var o=!0,n=!1,i=null,a={text:!0,search:!0,url:!0,tel:!0,email:!0,password:!0,number:!0,date:!0,month:!0,week:!0,time:!0,datetime:!0,"datetime-local":!0};function s(k){return!!(k&&k!==document&&k.nodeName!=="HTML"&&k.nodeName!=="BODY"&&"classList"in k&&"contains"in k.classList)}function p(k){var ft=k.type,qe=k.tagName;return!!(qe==="INPUT"&&a[ft]&&!k.readOnly||qe==="TEXTAREA"&&!k.readOnly||k.isContentEditable)}function c(k){k.classList.contains("focus-visible")||(k.classList.add("focus-visible"),k.setAttribute("data-focus-visible-added",""))}function l(k){k.hasAttribute("data-focus-visible-added")&&(k.classList.remove("focus-visible"),k.removeAttribute("data-focus-visible-added"))}function f(k){k.metaKey||k.altKey||k.ctrlKey||(s(r.activeElement)&&c(r.activeElement),o=!0)}function u(k){o=!1}function d(k){s(k.target)&&(o||p(k.target))&&c(k.target)}function y(k){s(k.target)&&(k.target.classList.contains("focus-visible")||k.target.hasAttribute("data-focus-visible-added"))&&(n=!0,window.clearTimeout(i),i=window.setTimeout(function(){n=!1},100),l(k.target))}function M(k){document.visibilityState==="hidden"&&(n&&(o=!0),X())}function X(){document.addEventListener("mousemove",J),document.addEventListener("mousedown",J),document.addEventListener("mouseup",J),document.addEventListener("pointermove",J),document.addEventListener("pointerdown",J),document.addEventListener("pointerup",J),document.addEventListener("touchmove",J),document.addEventListener("touchstart",J),document.addEventListener("touchend",J)}function te(){document.removeEventListener("mousemove",J),document.removeEventListener("mousedown",J),document.removeEventListener("mouseup",J),document.removeEventListener("pointermove",J),document.removeEventListener("pointerdown",J),document.removeEventListener("pointerup",J),document.removeEventListener("touchmove",J),document.removeEventListener("touchstart",J),document.removeEventListener("touchend",J)}function J(k){k.target.nodeName&&k.target.nodeName.toLowerCase()==="html"||(o=!1,te())}document.addEventListener("keydown",f,!0),document.addEventListener("mousedown",u,!0),document.addEventListener("pointerdown",u,!0),document.addEventListener("touchstart",u,!0),document.addEventListener("visibilitychange",M,!0),X(),r.addEventListener("focus",d,!0),r.addEventListener("blur",y,!0),r.nodeType===Node.DOCUMENT_FRAGMENT_NODE&&r.host?r.host.setAttribute("data-js-focus-visible",""):r.nodeType===Node.DOCUMENT_NODE&&(document.documentElement.classList.add("js-focus-visible"),document.documentElement.setAttribute("data-js-focus-visible",""))}if(typeof window!="undefined"&&typeof document!="undefined"){window.applyFocusVisiblePolyfill=e;var t;try{t=new CustomEvent("focus-visible-polyfill-ready")}catch(r){t=document.createEvent("CustomEvent"),t.initCustomEvent("focus-visible-polyfill-ready",!1,!1,{})}window.dispatchEvent(t)}typeof document!="undefined"&&e(document)})});var qr=xr((ly,Sn)=>{"use strict";/*! + * escape-html + * Copyright(c) 2012-2013 TJ Holowaychuk + * Copyright(c) 2015 Andreas Lubbe + * Copyright(c) 2015 Tiancheng "Timothy" Gu + * MIT Licensed + */var ka=/["'&<>]/;Sn.exports=Ha;function Ha(e){var t=""+e,r=ka.exec(t);if(!r)return t;var o,n="",i=0,a=0;for(i=r.index;i{/*! + * clipboard.js v2.0.11 + * https://clipboardjs.com/ + * + * Licensed MIT © Zeno Rocha + */(function(t,r){typeof It=="object"&&typeof Yr=="object"?Yr.exports=r():typeof define=="function"&&define.amd?define([],r):typeof It=="object"?It.ClipboardJS=r():t.ClipboardJS=r()})(It,function(){return function(){var e={686:function(o,n,i){"use strict";i.d(n,{default:function(){return ji}});var a=i(279),s=i.n(a),p=i(370),c=i.n(p),l=i(817),f=i.n(l);function u(V){try{return document.execCommand(V)}catch(A){return!1}}var d=function(A){var L=f()(A);return u("cut"),L},y=d;function M(V){var A=document.documentElement.getAttribute("dir")==="rtl",L=document.createElement("textarea");L.style.fontSize="12pt",L.style.border="0",L.style.padding="0",L.style.margin="0",L.style.position="absolute",L.style[A?"right":"left"]="-9999px";var F=window.pageYOffset||document.documentElement.scrollTop;return L.style.top="".concat(F,"px"),L.setAttribute("readonly",""),L.value=V,L}var X=function(A,L){var F=M(A);L.container.appendChild(F);var D=f()(F);return u("copy"),F.remove(),D},te=function(A){var L=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body},F="";return typeof A=="string"?F=X(A,L):A instanceof HTMLInputElement&&!["text","search","url","tel","password"].includes(A==null?void 0:A.type)?F=X(A.value,L):(F=f()(A),u("copy")),F},J=te;function k(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?k=function(L){return typeof L}:k=function(L){return L&&typeof Symbol=="function"&&L.constructor===Symbol&&L!==Symbol.prototype?"symbol":typeof L},k(V)}var ft=function(){var A=arguments.length>0&&arguments[0]!==void 0?arguments[0]:{},L=A.action,F=L===void 0?"copy":L,D=A.container,Y=A.target,$e=A.text;if(F!=="copy"&&F!=="cut")throw new Error('Invalid "action" value, use either "copy" or "cut"');if(Y!==void 0)if(Y&&k(Y)==="object"&&Y.nodeType===1){if(F==="copy"&&Y.hasAttribute("disabled"))throw new Error('Invalid "target" attribute. Please use "readonly" instead of "disabled" attribute');if(F==="cut"&&(Y.hasAttribute("readonly")||Y.hasAttribute("disabled")))throw new Error(`Invalid "target" attribute. You can't cut text from elements with "readonly" or "disabled" attributes`)}else throw new Error('Invalid "target" value, use a valid Element');if($e)return J($e,{container:D});if(Y)return F==="cut"?y(Y):J(Y,{container:D})},qe=ft;function Fe(V){"@babel/helpers - typeof";return typeof Symbol=="function"&&typeof Symbol.iterator=="symbol"?Fe=function(L){return typeof L}:Fe=function(L){return L&&typeof Symbol=="function"&&L.constructor===Symbol&&L!==Symbol.prototype?"symbol":typeof L},Fe(V)}function Ai(V,A){if(!(V instanceof A))throw new TypeError("Cannot call a class as a function")}function oo(V,A){for(var L=0;L0&&arguments[0]!==void 0?arguments[0]:{};this.action=typeof D.action=="function"?D.action:this.defaultAction,this.target=typeof D.target=="function"?D.target:this.defaultTarget,this.text=typeof D.text=="function"?D.text:this.defaultText,this.container=Fe(D.container)==="object"?D.container:document.body}},{key:"listenClick",value:function(D){var Y=this;this.listener=c()(D,"click",function($e){return Y.onClick($e)})}},{key:"onClick",value:function(D){var Y=D.delegateTarget||D.currentTarget,$e=this.action(Y)||"copy",Dt=qe({action:$e,container:this.container,target:this.target(Y),text:this.text(Y)});this.emit(Dt?"success":"error",{action:$e,text:Dt,trigger:Y,clearSelection:function(){Y&&Y.focus(),window.getSelection().removeAllRanges()}})}},{key:"defaultAction",value:function(D){return vr("action",D)}},{key:"defaultTarget",value:function(D){var Y=vr("target",D);if(Y)return document.querySelector(Y)}},{key:"defaultText",value:function(D){return vr("text",D)}},{key:"destroy",value:function(){this.listener.destroy()}}],[{key:"copy",value:function(D){var Y=arguments.length>1&&arguments[1]!==void 0?arguments[1]:{container:document.body};return J(D,Y)}},{key:"cut",value:function(D){return y(D)}},{key:"isSupported",value:function(){var D=arguments.length>0&&arguments[0]!==void 0?arguments[0]:["copy","cut"],Y=typeof D=="string"?[D]:D,$e=!!document.queryCommandSupported;return Y.forEach(function(Dt){$e=$e&&!!document.queryCommandSupported(Dt)}),$e}}]),L}(s()),ji=Ii},828:function(o){var n=9;if(typeof Element!="undefined"&&!Element.prototype.matches){var i=Element.prototype;i.matches=i.matchesSelector||i.mozMatchesSelector||i.msMatchesSelector||i.oMatchesSelector||i.webkitMatchesSelector}function a(s,p){for(;s&&s.nodeType!==n;){if(typeof s.matches=="function"&&s.matches(p))return s;s=s.parentNode}}o.exports=a},438:function(o,n,i){var a=i(828);function s(l,f,u,d,y){var M=c.apply(this,arguments);return l.addEventListener(u,M,y),{destroy:function(){l.removeEventListener(u,M,y)}}}function p(l,f,u,d,y){return typeof l.addEventListener=="function"?s.apply(null,arguments):typeof u=="function"?s.bind(null,document).apply(null,arguments):(typeof l=="string"&&(l=document.querySelectorAll(l)),Array.prototype.map.call(l,function(M){return s(M,f,u,d,y)}))}function c(l,f,u,d){return function(y){y.delegateTarget=a(y.target,f),y.delegateTarget&&d.call(l,y)}}o.exports=p},879:function(o,n){n.node=function(i){return i!==void 0&&i instanceof HTMLElement&&i.nodeType===1},n.nodeList=function(i){var a=Object.prototype.toString.call(i);return i!==void 0&&(a==="[object NodeList]"||a==="[object HTMLCollection]")&&"length"in i&&(i.length===0||n.node(i[0]))},n.string=function(i){return typeof i=="string"||i instanceof String},n.fn=function(i){var a=Object.prototype.toString.call(i);return a==="[object Function]"}},370:function(o,n,i){var a=i(879),s=i(438);function p(u,d,y){if(!u&&!d&&!y)throw new Error("Missing required arguments");if(!a.string(d))throw new TypeError("Second argument must be a String");if(!a.fn(y))throw new TypeError("Third argument must be a Function");if(a.node(u))return c(u,d,y);if(a.nodeList(u))return l(u,d,y);if(a.string(u))return f(u,d,y);throw new TypeError("First argument must be a String, HTMLElement, HTMLCollection, or NodeList")}function c(u,d,y){return u.addEventListener(d,y),{destroy:function(){u.removeEventListener(d,y)}}}function l(u,d,y){return Array.prototype.forEach.call(u,function(M){M.addEventListener(d,y)}),{destroy:function(){Array.prototype.forEach.call(u,function(M){M.removeEventListener(d,y)})}}}function f(u,d,y){return s(document.body,u,d,y)}o.exports=p},817:function(o){function n(i){var a;if(i.nodeName==="SELECT")i.focus(),a=i.value;else if(i.nodeName==="INPUT"||i.nodeName==="TEXTAREA"){var s=i.hasAttribute("readonly");s||i.setAttribute("readonly",""),i.select(),i.setSelectionRange(0,i.value.length),s||i.removeAttribute("readonly"),a=i.value}else{i.hasAttribute("contenteditable")&&i.focus();var p=window.getSelection(),c=document.createRange();c.selectNodeContents(i),p.removeAllRanges(),p.addRange(c),a=p.toString()}return a}o.exports=n},279:function(o){function n(){}n.prototype={on:function(i,a,s){var p=this.e||(this.e={});return(p[i]||(p[i]=[])).push({fn:a,ctx:s}),this},once:function(i,a,s){var p=this;function c(){p.off(i,c),a.apply(s,arguments)}return c._=a,this.on(i,c,s)},emit:function(i){var a=[].slice.call(arguments,1),s=((this.e||(this.e={}))[i]||[]).slice(),p=0,c=s.length;for(p;p0&&i[i.length-1])&&(c[0]===6||c[0]===2)){r=0;continue}if(c[0]===3&&(!i||c[1]>i[0]&&c[1]=e.length&&(e=void 0),{value:e&&e[o++],done:!e}}};throw new TypeError(t?"Object is not iterable.":"Symbol.iterator is not defined.")}function N(e,t){var r=typeof Symbol=="function"&&e[Symbol.iterator];if(!r)return e;var o=r.call(e),n,i=[],a;try{for(;(t===void 0||t-- >0)&&!(n=o.next()).done;)i.push(n.value)}catch(s){a={error:s}}finally{try{n&&!n.done&&(r=o.return)&&r.call(o)}finally{if(a)throw a.error}}return i}function q(e,t,r){if(r||arguments.length===2)for(var o=0,n=t.length,i;o1||p(d,M)})},y&&(n[d]=y(n[d])))}function p(d,y){try{c(o[d](y))}catch(M){u(i[0][3],M)}}function c(d){d.value instanceof nt?Promise.resolve(d.value.v).then(l,f):u(i[0][2],d)}function l(d){p("next",d)}function f(d){p("throw",d)}function u(d,y){d(y),i.shift(),i.length&&p(i[0][0],i[0][1])}}function fo(e){if(!Symbol.asyncIterator)throw new TypeError("Symbol.asyncIterator is not defined.");var t=e[Symbol.asyncIterator],r;return t?t.call(e):(e=typeof he=="function"?he(e):e[Symbol.iterator](),r={},o("next"),o("throw"),o("return"),r[Symbol.asyncIterator]=function(){return this},r);function o(i){r[i]=e[i]&&function(a){return new Promise(function(s,p){a=e[i](a),n(s,p,a.done,a.value)})}}function n(i,a,s,p){Promise.resolve(p).then(function(c){i({value:c,done:s})},a)}}function H(e){return typeof e=="function"}function ut(e){var t=function(o){Error.call(o),o.stack=new Error().stack},r=e(t);return r.prototype=Object.create(Error.prototype),r.prototype.constructor=r,r}var zt=ut(function(e){return function(r){e(this),this.message=r?r.length+` errors occurred during unsubscription: +`+r.map(function(o,n){return n+1+") "+o.toString()}).join(` + `):"",this.name="UnsubscriptionError",this.errors=r}});function Qe(e,t){if(e){var r=e.indexOf(t);0<=r&&e.splice(r,1)}}var We=function(){function e(t){this.initialTeardown=t,this.closed=!1,this._parentage=null,this._finalizers=null}return e.prototype.unsubscribe=function(){var t,r,o,n,i;if(!this.closed){this.closed=!0;var a=this._parentage;if(a)if(this._parentage=null,Array.isArray(a))try{for(var s=he(a),p=s.next();!p.done;p=s.next()){var c=p.value;c.remove(this)}}catch(M){t={error:M}}finally{try{p&&!p.done&&(r=s.return)&&r.call(s)}finally{if(t)throw t.error}}else a.remove(this);var l=this.initialTeardown;if(H(l))try{l()}catch(M){i=M instanceof zt?M.errors:[M]}var f=this._finalizers;if(f){this._finalizers=null;try{for(var u=he(f),d=u.next();!d.done;d=u.next()){var y=d.value;try{uo(y)}catch(M){i=i!=null?i:[],M instanceof zt?i=q(q([],N(i)),N(M.errors)):i.push(M)}}}catch(M){o={error:M}}finally{try{d&&!d.done&&(n=u.return)&&n.call(u)}finally{if(o)throw o.error}}}if(i)throw new zt(i)}},e.prototype.add=function(t){var r;if(t&&t!==this)if(this.closed)uo(t);else{if(t instanceof e){if(t.closed||t._hasParent(this))return;t._addParent(this)}(this._finalizers=(r=this._finalizers)!==null&&r!==void 0?r:[]).push(t)}},e.prototype._hasParent=function(t){var r=this._parentage;return r===t||Array.isArray(r)&&r.includes(t)},e.prototype._addParent=function(t){var r=this._parentage;this._parentage=Array.isArray(r)?(r.push(t),r):r?[r,t]:t},e.prototype._removeParent=function(t){var r=this._parentage;r===t?this._parentage=null:Array.isArray(r)&&Qe(r,t)},e.prototype.remove=function(t){var r=this._finalizers;r&&Qe(r,t),t instanceof e&&t._removeParent(this)},e.EMPTY=function(){var t=new e;return t.closed=!0,t}(),e}();var Tr=We.EMPTY;function qt(e){return e instanceof We||e&&"closed"in e&&H(e.remove)&&H(e.add)&&H(e.unsubscribe)}function uo(e){H(e)?e():e.unsubscribe()}var Pe={onUnhandledError:null,onStoppedNotification:null,Promise:void 0,useDeprecatedSynchronousErrorHandling:!1,useDeprecatedNextContext:!1};var dt={setTimeout:function(e,t){for(var r=[],o=2;o0},enumerable:!1,configurable:!0}),t.prototype._trySubscribe=function(r){return this._throwIfClosed(),e.prototype._trySubscribe.call(this,r)},t.prototype._subscribe=function(r){return this._throwIfClosed(),this._checkFinalizedStatuses(r),this._innerSubscribe(r)},t.prototype._innerSubscribe=function(r){var o=this,n=this,i=n.hasError,a=n.isStopped,s=n.observers;return i||a?Tr:(this.currentObservers=null,s.push(r),new We(function(){o.currentObservers=null,Qe(s,r)}))},t.prototype._checkFinalizedStatuses=function(r){var o=this,n=o.hasError,i=o.thrownError,a=o.isStopped;n?r.error(i):a&&r.complete()},t.prototype.asObservable=function(){var r=new j;return r.source=this,r},t.create=function(r,o){return new wo(r,o)},t}(j);var wo=function(e){oe(t,e);function t(r,o){var n=e.call(this)||this;return n.destination=r,n.source=o,n}return t.prototype.next=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.next)===null||n===void 0||n.call(o,r)},t.prototype.error=function(r){var o,n;(n=(o=this.destination)===null||o===void 0?void 0:o.error)===null||n===void 0||n.call(o,r)},t.prototype.complete=function(){var r,o;(o=(r=this.destination)===null||r===void 0?void 0:r.complete)===null||o===void 0||o.call(r)},t.prototype._subscribe=function(r){var o,n;return(n=(o=this.source)===null||o===void 0?void 0:o.subscribe(r))!==null&&n!==void 0?n:Tr},t}(g);var _r=function(e){oe(t,e);function t(r){var o=e.call(this)||this;return o._value=r,o}return Object.defineProperty(t.prototype,"value",{get:function(){return this.getValue()},enumerable:!1,configurable:!0}),t.prototype._subscribe=function(r){var o=e.prototype._subscribe.call(this,r);return!o.closed&&r.next(this._value),o},t.prototype.getValue=function(){var r=this,o=r.hasError,n=r.thrownError,i=r._value;if(o)throw n;return this._throwIfClosed(),i},t.prototype.next=function(r){e.prototype.next.call(this,this._value=r)},t}(g);var At={now:function(){return(At.delegate||Date).now()},delegate:void 0};var Ct=function(e){oe(t,e);function t(r,o,n){r===void 0&&(r=1/0),o===void 0&&(o=1/0),n===void 0&&(n=At);var i=e.call(this)||this;return i._bufferSize=r,i._windowTime=o,i._timestampProvider=n,i._buffer=[],i._infiniteTimeWindow=!0,i._infiniteTimeWindow=o===1/0,i._bufferSize=Math.max(1,r),i._windowTime=Math.max(1,o),i}return t.prototype.next=function(r){var o=this,n=o.isStopped,i=o._buffer,a=o._infiniteTimeWindow,s=o._timestampProvider,p=o._windowTime;n||(i.push(r),!a&&i.push(s.now()+p)),this._trimBuffer(),e.prototype.next.call(this,r)},t.prototype._subscribe=function(r){this._throwIfClosed(),this._trimBuffer();for(var o=this._innerSubscribe(r),n=this,i=n._infiniteTimeWindow,a=n._buffer,s=a.slice(),p=0;p0?e.prototype.schedule.call(this,r,o):(this.delay=o,this.state=r,this.scheduler.flush(this),this)},t.prototype.execute=function(r,o){return o>0||this.closed?e.prototype.execute.call(this,r,o):this._execute(r,o)},t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!=null&&n>0||n==null&&this.delay>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.flush(this),0)},t}(gt);var Oo=function(e){oe(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t}(yt);var kr=new Oo(So);var Mo=function(e){oe(t,e);function t(r,o){var n=e.call(this,r,o)||this;return n.scheduler=r,n.work=o,n}return t.prototype.requestAsyncId=function(r,o,n){return n===void 0&&(n=0),n!==null&&n>0?e.prototype.requestAsyncId.call(this,r,o,n):(r.actions.push(this),r._scheduled||(r._scheduled=vt.requestAnimationFrame(function(){return r.flush(void 0)})))},t.prototype.recycleAsyncId=function(r,o,n){var i;if(n===void 0&&(n=0),n!=null?n>0:this.delay>0)return e.prototype.recycleAsyncId.call(this,r,o,n);var a=r.actions;o!=null&&((i=a[a.length-1])===null||i===void 0?void 0:i.id)!==o&&(vt.cancelAnimationFrame(o),r._scheduled=void 0)},t}(gt);var Lo=function(e){oe(t,e);function t(){return e!==null&&e.apply(this,arguments)||this}return t.prototype.flush=function(r){this._active=!0;var o=this._scheduled;this._scheduled=void 0;var n=this.actions,i;r=r||n.shift();do if(i=r.execute(r.state,r.delay))break;while((r=n[0])&&r.id===o&&n.shift());if(this._active=!1,i){for(;(r=n[0])&&r.id===o&&n.shift();)r.unsubscribe();throw i}},t}(yt);var me=new Lo(Mo);var S=new j(function(e){return e.complete()});function Yt(e){return e&&H(e.schedule)}function Hr(e){return e[e.length-1]}function Xe(e){return H(Hr(e))?e.pop():void 0}function ke(e){return Yt(Hr(e))?e.pop():void 0}function Bt(e,t){return typeof Hr(e)=="number"?e.pop():t}var xt=function(e){return e&&typeof e.length=="number"&&typeof e!="function"};function Gt(e){return H(e==null?void 0:e.then)}function Jt(e){return H(e[bt])}function Xt(e){return Symbol.asyncIterator&&H(e==null?void 0:e[Symbol.asyncIterator])}function Zt(e){return new TypeError("You provided "+(e!==null&&typeof e=="object"?"an invalid object":"'"+e+"'")+" where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.")}function Ji(){return typeof Symbol!="function"||!Symbol.iterator?"@@iterator":Symbol.iterator}var er=Ji();function tr(e){return H(e==null?void 0:e[er])}function rr(e){return mo(this,arguments,function(){var r,o,n,i;return Nt(this,function(a){switch(a.label){case 0:r=e.getReader(),a.label=1;case 1:a.trys.push([1,,9,10]),a.label=2;case 2:return[4,nt(r.read())];case 3:return o=a.sent(),n=o.value,i=o.done,i?[4,nt(void 0)]:[3,5];case 4:return[2,a.sent()];case 5:return[4,nt(n)];case 6:return[4,a.sent()];case 7:return a.sent(),[3,2];case 8:return[3,10];case 9:return r.releaseLock(),[7];case 10:return[2]}})})}function or(e){return H(e==null?void 0:e.getReader)}function W(e){if(e instanceof j)return e;if(e!=null){if(Jt(e))return Xi(e);if(xt(e))return Zi(e);if(Gt(e))return ea(e);if(Xt(e))return _o(e);if(tr(e))return ta(e);if(or(e))return ra(e)}throw Zt(e)}function Xi(e){return new j(function(t){var r=e[bt]();if(H(r.subscribe))return r.subscribe(t);throw new TypeError("Provided object does not correctly implement Symbol.observable")})}function Zi(e){return new j(function(t){for(var r=0;r=2;return function(o){return o.pipe(e?b(function(n,i){return e(n,i,o)}):le,Te(1),r?De(t):qo(function(){return new ir}))}}function jr(e){return e<=0?function(){return S}:E(function(t,r){var o=[];t.subscribe(T(r,function(n){o.push(n),e=2,!0))}function pe(e){e===void 0&&(e={});var t=e.connector,r=t===void 0?function(){return new g}:t,o=e.resetOnError,n=o===void 0?!0:o,i=e.resetOnComplete,a=i===void 0?!0:i,s=e.resetOnRefCountZero,p=s===void 0?!0:s;return function(c){var l,f,u,d=0,y=!1,M=!1,X=function(){f==null||f.unsubscribe(),f=void 0},te=function(){X(),l=u=void 0,y=M=!1},J=function(){var k=l;te(),k==null||k.unsubscribe()};return E(function(k,ft){d++,!M&&!y&&X();var qe=u=u!=null?u:r();ft.add(function(){d--,d===0&&!M&&!y&&(f=Wr(J,p))}),qe.subscribe(ft),!l&&d>0&&(l=new at({next:function(Fe){return qe.next(Fe)},error:function(Fe){M=!0,X(),f=Wr(te,n,Fe),qe.error(Fe)},complete:function(){y=!0,X(),f=Wr(te,a),qe.complete()}}),W(k).subscribe(l))})(c)}}function Wr(e,t){for(var r=[],o=2;oe.next(document)),e}function P(e,t=document){return Array.from(t.querySelectorAll(e))}function R(e,t=document){let r=fe(e,t);if(typeof r=="undefined")throw new ReferenceError(`Missing element: expected "${e}" to be present`);return r}function fe(e,t=document){return t.querySelector(e)||void 0}function Ie(){var e,t,r,o;return(o=(r=(t=(e=document.activeElement)==null?void 0:e.shadowRoot)==null?void 0:t.activeElement)!=null?r:document.activeElement)!=null?o:void 0}var xa=O(h(document.body,"focusin"),h(document.body,"focusout")).pipe(_e(1),Q(void 0),m(()=>Ie()||document.body),G(1));function et(e){return xa.pipe(m(t=>e.contains(t)),K())}function $t(e,t){return C(()=>O(h(e,"mouseenter").pipe(m(()=>!0)),h(e,"mouseleave").pipe(m(()=>!1))).pipe(t?Ht(r=>Me(+!r*t)):le,Q(e.matches(":hover"))))}function Go(e,t){if(typeof t=="string"||typeof t=="number")e.innerHTML+=t.toString();else if(t instanceof Node)e.appendChild(t);else if(Array.isArray(t))for(let r of t)Go(e,r)}function x(e,t,...r){let o=document.createElement(e);if(t)for(let n of Object.keys(t))typeof t[n]!="undefined"&&(typeof t[n]!="boolean"?o.setAttribute(n,t[n]):o.setAttribute(n,""));for(let n of r)Go(o,n);return o}function sr(e){if(e>999){let t=+((e-950)%1e3>99);return`${((e+1e-6)/1e3).toFixed(t)}k`}else return e.toString()}function Tt(e){let t=x("script",{src:e});return C(()=>(document.head.appendChild(t),O(h(t,"load"),h(t,"error").pipe(v(()=>$r(()=>new ReferenceError(`Invalid script: ${e}`))))).pipe(m(()=>{}),_(()=>document.head.removeChild(t)),Te(1))))}var Jo=new g,Ea=C(()=>typeof ResizeObserver=="undefined"?Tt("https://unpkg.com/resize-observer-polyfill"):I(void 0)).pipe(m(()=>new ResizeObserver(e=>e.forEach(t=>Jo.next(t)))),v(e=>O(Ye,I(e)).pipe(_(()=>e.disconnect()))),G(1));function ce(e){return{width:e.offsetWidth,height:e.offsetHeight}}function ge(e){let t=e;for(;t.clientWidth===0&&t.parentElement;)t=t.parentElement;return Ea.pipe(w(r=>r.observe(t)),v(r=>Jo.pipe(b(o=>o.target===t),_(()=>r.unobserve(t)))),m(()=>ce(e)),Q(ce(e)))}function St(e){return{width:e.scrollWidth,height:e.scrollHeight}}function cr(e){let t=e.parentElement;for(;t&&(e.scrollWidth<=t.scrollWidth&&e.scrollHeight<=t.scrollHeight);)t=(e=t).parentElement;return t?e:void 0}function Xo(e){let t=[],r=e.parentElement;for(;r;)(e.clientWidth>r.clientWidth||e.clientHeight>r.clientHeight)&&t.push(r),r=(e=r).parentElement;return t.length===0&&t.push(document.documentElement),t}function Ve(e){return{x:e.offsetLeft,y:e.offsetTop}}function Zo(e){let t=e.getBoundingClientRect();return{x:t.x+window.scrollX,y:t.y+window.scrollY}}function en(e){return O(h(window,"load"),h(window,"resize")).pipe(Le(0,me),m(()=>Ve(e)),Q(Ve(e)))}function pr(e){return{x:e.scrollLeft,y:e.scrollTop}}function Ne(e){return O(h(e,"scroll"),h(window,"scroll"),h(window,"resize")).pipe(Le(0,me),m(()=>pr(e)),Q(pr(e)))}var tn=new g,wa=C(()=>I(new IntersectionObserver(e=>{for(let t of e)tn.next(t)},{threshold:0}))).pipe(v(e=>O(Ye,I(e)).pipe(_(()=>e.disconnect()))),G(1));function tt(e){return wa.pipe(w(t=>t.observe(e)),v(t=>tn.pipe(b(({target:r})=>r===e),_(()=>t.unobserve(e)),m(({isIntersecting:r})=>r))))}function rn(e,t=16){return Ne(e).pipe(m(({y:r})=>{let o=ce(e),n=St(e);return r>=n.height-o.height-t}),K())}var lr={drawer:R("[data-md-toggle=drawer]"),search:R("[data-md-toggle=search]")};function on(e){return lr[e].checked}function Je(e,t){lr[e].checked!==t&&lr[e].click()}function ze(e){let t=lr[e];return h(t,"change").pipe(m(()=>t.checked),Q(t.checked))}function Ta(e,t){switch(e.constructor){case HTMLInputElement:return e.type==="radio"?/^Arrow/.test(t):!0;case HTMLSelectElement:case HTMLTextAreaElement:return!0;default:return e.isContentEditable}}function Sa(){return O(h(window,"compositionstart").pipe(m(()=>!0)),h(window,"compositionend").pipe(m(()=>!1))).pipe(Q(!1))}function nn(){let e=h(window,"keydown").pipe(b(t=>!(t.metaKey||t.ctrlKey)),m(t=>({mode:on("search")?"search":"global",type:t.key,claim(){t.preventDefault(),t.stopPropagation()}})),b(({mode:t,type:r})=>{if(t==="global"){let o=Ie();if(typeof o!="undefined")return!Ta(o,r)}return!0}),pe());return Sa().pipe(v(t=>t?S:e))}function ye(){return new URL(location.href)}function lt(e,t=!1){if(B("navigation.instant")&&!t){let r=x("a",{href:e.href});document.body.appendChild(r),r.click(),r.remove()}else location.href=e.href}function an(){return new g}function sn(){return location.hash.slice(1)}function cn(e){let t=x("a",{href:e});t.addEventListener("click",r=>r.stopPropagation()),t.click()}function Oa(e){return O(h(window,"hashchange"),e).pipe(m(sn),Q(sn()),b(t=>t.length>0),G(1))}function pn(e){return Oa(e).pipe(m(t=>fe(`[id="${t}"]`)),b(t=>typeof t!="undefined"))}function Pt(e){let t=matchMedia(e);return ar(r=>t.addListener(()=>r(t.matches))).pipe(Q(t.matches))}function ln(){let e=matchMedia("print");return O(h(window,"beforeprint").pipe(m(()=>!0)),h(window,"afterprint").pipe(m(()=>!1))).pipe(Q(e.matches))}function Nr(e,t){return e.pipe(v(r=>r?t():S))}function zr(e,t){return new j(r=>{let o=new XMLHttpRequest;return o.open("GET",`${e}`),o.responseType="blob",o.addEventListener("load",()=>{o.status>=200&&o.status<300?(r.next(o.response),r.complete()):r.error(new Error(o.statusText))}),o.addEventListener("error",()=>{r.error(new Error("Network error"))}),o.addEventListener("abort",()=>{r.complete()}),typeof(t==null?void 0:t.progress$)!="undefined"&&(o.addEventListener("progress",n=>{var i;if(n.lengthComputable)t.progress$.next(n.loaded/n.total*100);else{let a=(i=o.getResponseHeader("Content-Length"))!=null?i:0;t.progress$.next(n.loaded/+a*100)}}),t.progress$.next(5)),o.send(),()=>o.abort()})}function je(e,t){return zr(e,t).pipe(v(r=>r.text()),m(r=>JSON.parse(r)),G(1))}function mn(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/html")),G(1))}function fn(e,t){let r=new DOMParser;return zr(e,t).pipe(v(o=>o.text()),m(o=>r.parseFromString(o,"text/xml")),G(1))}function un(){return{x:Math.max(0,scrollX),y:Math.max(0,scrollY)}}function dn(){return O(h(window,"scroll",{passive:!0}),h(window,"resize",{passive:!0})).pipe(m(un),Q(un()))}function hn(){return{width:innerWidth,height:innerHeight}}function bn(){return h(window,"resize",{passive:!0}).pipe(m(hn),Q(hn()))}function vn(){return z([dn(),bn()]).pipe(m(([e,t])=>({offset:e,size:t})),G(1))}function mr(e,{viewport$:t,header$:r}){let o=t.pipe(ee("size")),n=z([o,r]).pipe(m(()=>Ve(e)));return z([r,t,n]).pipe(m(([{height:i},{offset:a,size:s},{x:p,y:c}])=>({offset:{x:a.x-p,y:a.y-c+i},size:s})))}function Ma(e){return h(e,"message",t=>t.data)}function La(e){let t=new g;return t.subscribe(r=>e.postMessage(r)),t}function gn(e,t=new Worker(e)){let r=Ma(t),o=La(t),n=new g;n.subscribe(o);let i=o.pipe(Z(),ie(!0));return n.pipe(Z(),Re(r.pipe(U(i))),pe())}var _a=R("#__config"),Ot=JSON.parse(_a.textContent);Ot.base=`${new URL(Ot.base,ye())}`;function xe(){return Ot}function B(e){return Ot.features.includes(e)}function Ee(e,t){return typeof t!="undefined"?Ot.translations[e].replace("#",t.toString()):Ot.translations[e]}function Se(e,t=document){return R(`[data-md-component=${e}]`,t)}function ae(e,t=document){return P(`[data-md-component=${e}]`,t)}function Aa(e){let t=R(".md-typeset > :first-child",e);return h(t,"click",{once:!0}).pipe(m(()=>R(".md-typeset",e)),m(r=>({hash:__md_hash(r.innerHTML)})))}function yn(e){if(!B("announce.dismiss")||!e.childElementCount)return S;if(!e.hidden){let t=R(".md-typeset",e);__md_hash(t.innerHTML)===__md_get("__announce")&&(e.hidden=!0)}return C(()=>{let t=new g;return t.subscribe(({hash:r})=>{e.hidden=!0,__md_set("__announce",r)}),Aa(e).pipe(w(r=>t.next(r)),_(()=>t.complete()),m(r=>$({ref:e},r)))})}function Ca(e,{target$:t}){return t.pipe(m(r=>({hidden:r!==e})))}function xn(e,t){let r=new g;return r.subscribe(({hidden:o})=>{e.hidden=o}),Ca(e,t).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))}function Rt(e,t){return t==="inline"?x("div",{class:"md-tooltip md-tooltip--inline",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"})):x("div",{class:"md-tooltip",id:e,role:"tooltip"},x("div",{class:"md-tooltip__inner md-typeset"}))}function En(...e){return x("div",{class:"md-tooltip2",role:"tooltip"},x("div",{class:"md-tooltip2__inner md-typeset"},e))}function wn(e,t){if(t=t?`${t}_annotation_${e}`:void 0,t){let r=t?`#${t}`:void 0;return x("aside",{class:"md-annotation",tabIndex:0},Rt(t),x("a",{href:r,class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}else return x("aside",{class:"md-annotation",tabIndex:0},Rt(t),x("span",{class:"md-annotation__index",tabIndex:-1},x("span",{"data-md-annotation-id":e})))}function Tn(e){return x("button",{class:"md-clipboard md-icon",title:Ee("clipboard.copy"),"data-clipboard-target":`#${e} > code`})}var On=Lt(qr());function Qr(e,t){let r=t&2,o=t&1,n=Object.keys(e.terms).filter(p=>!e.terms[p]).reduce((p,c)=>[...p,x("del",null,(0,On.default)(c))," "],[]).slice(0,-1),i=xe(),a=new URL(e.location,i.base);B("search.highlight")&&a.searchParams.set("h",Object.entries(e.terms).filter(([,p])=>p).reduce((p,[c])=>`${p} ${c}`.trim(),""));let{tags:s}=xe();return x("a",{href:`${a}`,class:"md-search-result__link",tabIndex:-1},x("article",{class:"md-search-result__article md-typeset","data-md-score":e.score.toFixed(2)},r>0&&x("div",{class:"md-search-result__icon md-icon"}),r>0&&x("h1",null,e.title),r<=0&&x("h2",null,e.title),o>0&&e.text.length>0&&e.text,e.tags&&e.tags.map(p=>{let c=s?p in s?`md-tag-icon md-tag--${s[p]}`:"md-tag-icon":"";return x("span",{class:`md-tag ${c}`},p)}),o>0&&n.length>0&&x("p",{class:"md-search-result__terms"},Ee("search.result.term.missing"),": ",...n)))}function Mn(e){let t=e[0].score,r=[...e],o=xe(),n=r.findIndex(l=>!`${new URL(l.location,o.base)}`.includes("#")),[i]=r.splice(n,1),a=r.findIndex(l=>l.scoreQr(l,1)),...p.length?[x("details",{class:"md-search-result__more"},x("summary",{tabIndex:-1},x("div",null,p.length>0&&p.length===1?Ee("search.result.more.one"):Ee("search.result.more.other",p.length))),...p.map(l=>Qr(l,1)))]:[]];return x("li",{class:"md-search-result__item"},c)}function Ln(e){return x("ul",{class:"md-source__facts"},Object.entries(e).map(([t,r])=>x("li",{class:`md-source__fact md-source__fact--${t}`},typeof r=="number"?sr(r):r)))}function Kr(e){let t=`tabbed-control tabbed-control--${e}`;return x("div",{class:t,hidden:!0},x("button",{class:"tabbed-button",tabIndex:-1,"aria-hidden":"true"}))}function _n(e){return x("div",{class:"md-typeset__scrollwrap"},x("div",{class:"md-typeset__table"},e))}function $a(e){var o;let t=xe(),r=new URL(`../${e.version}/`,t.base);return x("li",{class:"md-version__item"},x("a",{href:`${r}`,class:"md-version__link"},e.title,((o=t.version)==null?void 0:o.alias)&&e.aliases.length>0&&x("span",{class:"md-version__alias"},e.aliases[0])))}function An(e,t){var o;let r=xe();return e=e.filter(n=>{var i;return!((i=n.properties)!=null&&i.hidden)}),x("div",{class:"md-version"},x("button",{class:"md-version__current","aria-label":Ee("select.version")},t.title,((o=r.version)==null?void 0:o.alias)&&t.aliases.length>0&&x("span",{class:"md-version__alias"},t.aliases[0])),x("ul",{class:"md-version__list"},e.map($a)))}var Pa=0;function Ra(e){let t=z([et(e),$t(e)]).pipe(m(([o,n])=>o||n),K()),r=C(()=>Xo(e)).pipe(ne(Ne),pt(1),He(t),m(()=>Zo(e)));return t.pipe(Ae(o=>o),v(()=>z([t,r])),m(([o,n])=>({active:o,offset:n})),pe())}function Ia(e,t){let{content$:r,viewport$:o}=t,n=`__tooltip2_${Pa++}`;return C(()=>{let i=new g,a=new _r(!1);i.pipe(Z(),ie(!1)).subscribe(a);let s=a.pipe(Ht(c=>Me(+!c*250,kr)),K(),v(c=>c?r:S),w(c=>c.id=n),pe());z([i.pipe(m(({active:c})=>c)),s.pipe(v(c=>$t(c,250)),Q(!1))]).pipe(m(c=>c.some(l=>l))).subscribe(a);let p=a.pipe(b(c=>c),re(s,o),m(([c,l,{size:f}])=>{let u=e.getBoundingClientRect(),d=u.width/2;if(l.role==="tooltip")return{x:d,y:8+u.height};if(u.y>=f.height/2){let{height:y}=ce(l);return{x:d,y:-16-y}}else return{x:d,y:16+u.height}}));return z([s,i,p]).subscribe(([c,{offset:l},f])=>{c.style.setProperty("--md-tooltip-host-x",`${l.x}px`),c.style.setProperty("--md-tooltip-host-y",`${l.y}px`),c.style.setProperty("--md-tooltip-x",`${f.x}px`),c.style.setProperty("--md-tooltip-y",`${f.y}px`),c.classList.toggle("md-tooltip2--top",f.y<0),c.classList.toggle("md-tooltip2--bottom",f.y>=0)}),a.pipe(b(c=>c),re(s,(c,l)=>l),b(c=>c.role==="tooltip")).subscribe(c=>{let l=ce(R(":scope > *",c));c.style.setProperty("--md-tooltip-width",`${l.width}px`),c.style.setProperty("--md-tooltip-tail","0px")}),a.pipe(K(),ve(me),re(s)).subscribe(([c,l])=>{l.classList.toggle("md-tooltip2--active",c)}),z([a.pipe(b(c=>c)),s]).subscribe(([c,l])=>{l.role==="dialog"?(e.setAttribute("aria-controls",n),e.setAttribute("aria-haspopup","dialog")):e.setAttribute("aria-describedby",n)}),a.pipe(b(c=>!c)).subscribe(()=>{e.removeAttribute("aria-controls"),e.removeAttribute("aria-describedby"),e.removeAttribute("aria-haspopup")}),Ra(e).pipe(w(c=>i.next(c)),_(()=>i.complete()),m(c=>$({ref:e},c)))})}function mt(e,{viewport$:t},r=document.body){return Ia(e,{content$:new j(o=>{let n=e.title,i=En(n);return o.next(i),e.removeAttribute("title"),r.append(i),()=>{i.remove(),e.setAttribute("title",n)}}),viewport$:t})}function ja(e,t){let r=C(()=>z([en(e),Ne(t)])).pipe(m(([{x:o,y:n},i])=>{let{width:a,height:s}=ce(e);return{x:o-i.x+a/2,y:n-i.y+s/2}}));return et(e).pipe(v(o=>r.pipe(m(n=>({active:o,offset:n})),Te(+!o||1/0))))}function Cn(e,t,{target$:r}){let[o,n]=Array.from(e.children);return C(()=>{let i=new g,a=i.pipe(Z(),ie(!0));return i.subscribe({next({offset:s}){e.style.setProperty("--md-tooltip-x",`${s.x}px`),e.style.setProperty("--md-tooltip-y",`${s.y}px`)},complete(){e.style.removeProperty("--md-tooltip-x"),e.style.removeProperty("--md-tooltip-y")}}),tt(e).pipe(U(a)).subscribe(s=>{e.toggleAttribute("data-md-visible",s)}),O(i.pipe(b(({active:s})=>s)),i.pipe(_e(250),b(({active:s})=>!s))).subscribe({next({active:s}){s?e.prepend(o):o.remove()},complete(){e.prepend(o)}}),i.pipe(Le(16,me)).subscribe(({active:s})=>{o.classList.toggle("md-tooltip--active",s)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:s})=>s)).subscribe({next(s){s?e.style.setProperty("--md-tooltip-0",`${-s}px`):e.style.removeProperty("--md-tooltip-0")},complete(){e.style.removeProperty("--md-tooltip-0")}}),h(n,"click").pipe(U(a),b(s=>!(s.metaKey||s.ctrlKey))).subscribe(s=>{s.stopPropagation(),s.preventDefault()}),h(n,"mousedown").pipe(U(a),re(i)).subscribe(([s,{active:p}])=>{var c;if(s.button!==0||s.metaKey||s.ctrlKey)s.preventDefault();else if(p){s.preventDefault();let l=e.parentElement.closest(".md-annotation");l instanceof HTMLElement?l.focus():(c=Ie())==null||c.blur()}}),r.pipe(U(a),b(s=>s===o),Ge(125)).subscribe(()=>e.focus()),ja(e,t).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))})}function Fa(e){return e.tagName==="CODE"?P(".c, .c1, .cm",e):[e]}function Wa(e){let t=[];for(let r of Fa(e)){let o=[],n=document.createNodeIterator(r,NodeFilter.SHOW_TEXT);for(let i=n.nextNode();i;i=n.nextNode())o.push(i);for(let i of o){let a;for(;a=/(\(\d+\))(!)?/.exec(i.textContent);){let[,s,p]=a;if(typeof p=="undefined"){let c=i.splitText(a.index);i=c.splitText(s.length),t.push(c)}else{i.textContent=s,t.push(i);break}}}}return t}function kn(e,t){t.append(...Array.from(e.childNodes))}function fr(e,t,{target$:r,print$:o}){let n=t.closest("[id]"),i=n==null?void 0:n.id,a=new Map;for(let s of Wa(t)){let[,p]=s.textContent.match(/\((\d+)\)/);fe(`:scope > li:nth-child(${p})`,e)&&(a.set(p,wn(p,i)),s.replaceWith(a.get(p)))}return a.size===0?S:C(()=>{let s=new g,p=s.pipe(Z(),ie(!0)),c=[];for(let[l,f]of a)c.push([R(".md-typeset",f),R(`:scope > li:nth-child(${l})`,e)]);return o.pipe(U(p)).subscribe(l=>{e.hidden=!l,e.classList.toggle("md-annotation-list",l);for(let[f,u]of c)l?kn(f,u):kn(u,f)}),O(...[...a].map(([,l])=>Cn(l,t,{target$:r}))).pipe(_(()=>s.complete()),pe())})}function Hn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Hn(t)}}function $n(e,t){return C(()=>{let r=Hn(e);return typeof r!="undefined"?fr(r,e,t):S})}var Pn=Lt(Br());var Ua=0;function Rn(e){if(e.nextElementSibling){let t=e.nextElementSibling;if(t.tagName==="OL")return t;if(t.tagName==="P"&&!t.children.length)return Rn(t)}}function Da(e){return ge(e).pipe(m(({width:t})=>({scrollable:St(e).width>t})),ee("scrollable"))}function In(e,t){let{matches:r}=matchMedia("(hover)"),o=C(()=>{let n=new g,i=n.pipe(jr(1));n.subscribe(({scrollable:c})=>{c&&r?e.setAttribute("tabindex","0"):e.removeAttribute("tabindex")});let a=[];if(Pn.default.isSupported()&&(e.closest(".copy")||B("content.code.copy")&&!e.closest(".no-copy"))){let c=e.closest("pre");c.id=`__code_${Ua++}`;let l=Tn(c.id);c.insertBefore(l,e),B("content.tooltips")&&a.push(mt(l,{viewport$}))}let s=e.closest(".highlight");if(s instanceof HTMLElement){let c=Rn(s);if(typeof c!="undefined"&&(s.classList.contains("annotate")||B("content.code.annotate"))){let l=fr(c,e,t);a.push(ge(s).pipe(U(i),m(({width:f,height:u})=>f&&u),K(),v(f=>f?l:S)))}}return P(":scope > span[id]",e).length&&e.classList.add("md-code__content"),Da(e).pipe(w(c=>n.next(c)),_(()=>n.complete()),m(c=>$({ref:e},c)),Re(...a))});return B("content.lazy")?tt(e).pipe(b(n=>n),Te(1),v(()=>o)):o}function Va(e,{target$:t,print$:r}){let o=!0;return O(t.pipe(m(n=>n.closest("details:not([open])")),b(n=>e===n),m(()=>({action:"open",reveal:!0}))),r.pipe(b(n=>n||!o),w(()=>o=e.open),m(n=>({action:n?"open":"close"}))))}function jn(e,t){return C(()=>{let r=new g;return r.subscribe(({action:o,reveal:n})=>{e.toggleAttribute("open",o==="open"),n&&e.scrollIntoView()}),Va(e,t).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}var Fn=".node circle,.node ellipse,.node path,.node polygon,.node rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}marker{fill:var(--md-mermaid-edge-color)!important}.edgeLabel .label rect{fill:#0000}.label{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.label foreignObject{line-height:normal;overflow:visible}.label div .edgeLabel{color:var(--md-mermaid-label-fg-color)}.edgeLabel,.edgeLabel p,.label div .edgeLabel{background-color:var(--md-mermaid-label-bg-color)}.edgeLabel,.edgeLabel p{fill:var(--md-mermaid-label-bg-color);color:var(--md-mermaid-edge-color)}.edgePath .path,.flowchart-link{stroke:var(--md-mermaid-edge-color);stroke-width:.05rem}.edgePath .arrowheadPath{fill:var(--md-mermaid-edge-color);stroke:none}.cluster rect{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}.cluster span{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}g #flowchart-circleEnd,g #flowchart-circleStart,g #flowchart-crossEnd,g #flowchart-crossStart,g #flowchart-pointEnd,g #flowchart-pointStart{stroke:none}g.classGroup line,g.classGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.classGroup text{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.classLabel .box{fill:var(--md-mermaid-label-bg-color);background-color:var(--md-mermaid-label-bg-color);opacity:1}.classLabel .label{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.node .divider{stroke:var(--md-mermaid-node-fg-color)}.relation{stroke:var(--md-mermaid-edge-color)}.cardinality{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.cardinality text{fill:inherit!important}defs #classDiagram-compositionEnd,defs #classDiagram-compositionStart,defs #classDiagram-dependencyEnd,defs #classDiagram-dependencyStart,defs #classDiagram-extensionEnd,defs #classDiagram-extensionStart{fill:var(--md-mermaid-edge-color)!important;stroke:var(--md-mermaid-edge-color)!important}defs #classDiagram-aggregationEnd,defs #classDiagram-aggregationStart{fill:var(--md-mermaid-label-bg-color)!important;stroke:var(--md-mermaid-edge-color)!important}g.stateGroup rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}g.stateGroup .state-title{fill:var(--md-mermaid-label-fg-color)!important;font-family:var(--md-mermaid-font-family)}g.stateGroup .composit{fill:var(--md-mermaid-label-bg-color)}.nodeLabel,.nodeLabel p{color:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}a .nodeLabel{text-decoration:underline}.node circle.state-end,.node circle.state-start,.start-state{fill:var(--md-mermaid-edge-color);stroke:none}.end-state-inner,.end-state-outer{fill:var(--md-mermaid-edge-color)}.end-state-inner,.node circle.state-end{stroke:var(--md-mermaid-label-bg-color)}.transition{stroke:var(--md-mermaid-edge-color)}[id^=state-fork] rect,[id^=state-join] rect{fill:var(--md-mermaid-edge-color)!important;stroke:none!important}.statediagram-cluster.statediagram-cluster .inner{fill:var(--md-default-bg-color)}.statediagram-cluster rect{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.statediagram-state rect.divider{fill:var(--md-default-fg-color--lightest);stroke:var(--md-default-fg-color--lighter)}defs #statediagram-barbEnd{stroke:var(--md-mermaid-edge-color)}.attributeBoxEven,.attributeBoxOdd{fill:var(--md-mermaid-node-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityBox{fill:var(--md-mermaid-label-bg-color);stroke:var(--md-mermaid-node-fg-color)}.entityLabel{fill:var(--md-mermaid-label-fg-color);font-family:var(--md-mermaid-font-family)}.relationshipLabelBox{fill:var(--md-mermaid-label-bg-color);fill-opacity:1;background-color:var(--md-mermaid-label-bg-color);opacity:1}.relationshipLabel{fill:var(--md-mermaid-label-fg-color)}.relationshipLine{stroke:var(--md-mermaid-edge-color)}defs #ONE_OR_MORE_END *,defs #ONE_OR_MORE_START *,defs #ONLY_ONE_END *,defs #ONLY_ONE_START *,defs #ZERO_OR_MORE_END *,defs #ZERO_OR_MORE_START *,defs #ZERO_OR_ONE_END *,defs #ZERO_OR_ONE_START *{stroke:var(--md-mermaid-edge-color)!important}defs #ZERO_OR_MORE_END circle,defs #ZERO_OR_MORE_START circle{fill:var(--md-mermaid-label-bg-color)}.actor{fill:var(--md-mermaid-sequence-actor-bg-color);stroke:var(--md-mermaid-sequence-actor-border-color)}text.actor>tspan{fill:var(--md-mermaid-sequence-actor-fg-color);font-family:var(--md-mermaid-font-family)}line{stroke:var(--md-mermaid-sequence-actor-line-color)}.actor-man circle,.actor-man line{fill:var(--md-mermaid-sequence-actorman-bg-color);stroke:var(--md-mermaid-sequence-actorman-line-color)}.messageLine0,.messageLine1{stroke:var(--md-mermaid-sequence-message-line-color)}.note{fill:var(--md-mermaid-sequence-note-bg-color);stroke:var(--md-mermaid-sequence-note-border-color)}.loopText,.loopText>tspan,.messageText,.noteText>tspan{stroke:none;font-family:var(--md-mermaid-font-family)!important}.messageText{fill:var(--md-mermaid-sequence-message-fg-color)}.loopText,.loopText>tspan{fill:var(--md-mermaid-sequence-loop-fg-color)}.noteText>tspan{fill:var(--md-mermaid-sequence-note-fg-color)}#arrowhead path{fill:var(--md-mermaid-sequence-message-line-color);stroke:none}.loopLine{fill:var(--md-mermaid-sequence-loop-bg-color);stroke:var(--md-mermaid-sequence-loop-border-color)}.labelBox{fill:var(--md-mermaid-sequence-label-bg-color);stroke:none}.labelText,.labelText>span{fill:var(--md-mermaid-sequence-label-fg-color);font-family:var(--md-mermaid-font-family)}.sequenceNumber{fill:var(--md-mermaid-sequence-number-fg-color)}rect.rect{fill:var(--md-mermaid-sequence-box-bg-color);stroke:none}rect.rect+text.text{fill:var(--md-mermaid-sequence-box-fg-color)}defs #sequencenumber{fill:var(--md-mermaid-sequence-number-bg-color)!important}";var Gr,za=0;function qa(){return typeof mermaid=="undefined"||mermaid instanceof Element?Tt("https://unpkg.com/mermaid@11/dist/mermaid.min.js"):I(void 0)}function Wn(e){return e.classList.remove("mermaid"),Gr||(Gr=qa().pipe(w(()=>mermaid.initialize({startOnLoad:!1,themeCSS:Fn,sequence:{actorFontSize:"16px",messageFontSize:"16px",noteFontSize:"16px"}})),m(()=>{}),G(1))),Gr.subscribe(()=>so(this,null,function*(){e.classList.add("mermaid");let t=`__mermaid_${za++}`,r=x("div",{class:"mermaid"}),o=e.textContent,{svg:n,fn:i}=yield mermaid.render(t,o),a=r.attachShadow({mode:"closed"});a.innerHTML=n,e.replaceWith(r),i==null||i(a)})),Gr.pipe(m(()=>({ref:e})))}var Un=x("table");function Dn(e){return e.replaceWith(Un),Un.replaceWith(_n(e)),I({ref:e})}function Qa(e){let t=e.find(r=>r.checked)||e[0];return O(...e.map(r=>h(r,"change").pipe(m(()=>R(`label[for="${r.id}"]`))))).pipe(Q(R(`label[for="${t.id}"]`)),m(r=>({active:r})))}function Vn(e,{viewport$:t,target$:r}){let o=R(".tabbed-labels",e),n=P(":scope > input",e),i=Kr("prev");e.append(i);let a=Kr("next");return e.append(a),C(()=>{let s=new g,p=s.pipe(Z(),ie(!0));z([s,ge(e),tt(e)]).pipe(U(p),Le(1,me)).subscribe({next([{active:c},l]){let f=Ve(c),{width:u}=ce(c);e.style.setProperty("--md-indicator-x",`${f.x}px`),e.style.setProperty("--md-indicator-width",`${u}px`);let d=pr(o);(f.xd.x+l.width)&&o.scrollTo({left:Math.max(0,f.x-16),behavior:"smooth"})},complete(){e.style.removeProperty("--md-indicator-x"),e.style.removeProperty("--md-indicator-width")}}),z([Ne(o),ge(o)]).pipe(U(p)).subscribe(([c,l])=>{let f=St(o);i.hidden=c.x<16,a.hidden=c.x>f.width-l.width-16}),O(h(i,"click").pipe(m(()=>-1)),h(a,"click").pipe(m(()=>1))).pipe(U(p)).subscribe(c=>{let{width:l}=ce(o);o.scrollBy({left:l*c,behavior:"smooth"})}),r.pipe(U(p),b(c=>n.includes(c))).subscribe(c=>c.click()),o.classList.add("tabbed-labels--linked");for(let c of n){let l=R(`label[for="${c.id}"]`);l.replaceChildren(x("a",{href:`#${l.htmlFor}`,tabIndex:-1},...Array.from(l.childNodes))),h(l.firstElementChild,"click").pipe(U(p),b(f=>!(f.metaKey||f.ctrlKey)),w(f=>{f.preventDefault(),f.stopPropagation()})).subscribe(()=>{history.replaceState({},"",`#${l.htmlFor}`),l.click()})}return B("content.tabs.link")&&s.pipe(Ce(1),re(t)).subscribe(([{active:c},{offset:l}])=>{let f=c.innerText.trim();if(c.hasAttribute("data-md-switching"))c.removeAttribute("data-md-switching");else{let u=e.offsetTop-l.y;for(let y of P("[data-tabs]"))for(let M of P(":scope > input",y)){let X=R(`label[for="${M.id}"]`);if(X!==c&&X.innerText.trim()===f){X.setAttribute("data-md-switching",""),M.click();break}}window.scrollTo({top:e.offsetTop-u});let d=__md_get("__tabs")||[];__md_set("__tabs",[...new Set([f,...d])])}}),s.pipe(U(p)).subscribe(()=>{for(let c of P("audio, video",e))c.pause()}),Qa(n).pipe(w(c=>s.next(c)),_(()=>s.complete()),m(c=>$({ref:e},c)))}).pipe(Ke(se))}function Nn(e,{viewport$:t,target$:r,print$:o}){return O(...P(".annotate:not(.highlight)",e).map(n=>$n(n,{target$:r,print$:o})),...P("pre:not(.mermaid) > code",e).map(n=>In(n,{target$:r,print$:o})),...P("pre.mermaid",e).map(n=>Wn(n)),...P("table:not([class])",e).map(n=>Dn(n)),...P("details",e).map(n=>jn(n,{target$:r,print$:o})),...P("[data-tabs]",e).map(n=>Vn(n,{viewport$:t,target$:r})),...P("[title]",e).filter(()=>B("content.tooltips")).map(n=>mt(n,{viewport$:t})))}function Ka(e,{alert$:t}){return t.pipe(v(r=>O(I(!0),I(!1).pipe(Ge(2e3))).pipe(m(o=>({message:r,active:o})))))}function zn(e,t){let r=R(".md-typeset",e);return C(()=>{let o=new g;return o.subscribe(({message:n,active:i})=>{e.classList.toggle("md-dialog--active",i),r.textContent=n}),Ka(e,t).pipe(w(n=>o.next(n)),_(()=>o.complete()),m(n=>$({ref:e},n)))})}var Ya=0;function Ba(e,t){document.body.append(e);let{width:r}=ce(e);e.style.setProperty("--md-tooltip-width",`${r}px`),e.remove();let o=cr(t),n=typeof o!="undefined"?Ne(o):I({x:0,y:0}),i=O(et(t),$t(t)).pipe(K());return z([i,n]).pipe(m(([a,s])=>{let{x:p,y:c}=Ve(t),l=ce(t),f=t.closest("table");return f&&t.parentElement&&(p+=f.offsetLeft+t.parentElement.offsetLeft,c+=f.offsetTop+t.parentElement.offsetTop),{active:a,offset:{x:p-s.x+l.width/2-r/2,y:c-s.y+l.height+8}}}))}function qn(e){let t=e.title;if(!t.length)return S;let r=`__tooltip_${Ya++}`,o=Rt(r,"inline"),n=R(".md-typeset",o);return n.innerHTML=t,C(()=>{let i=new g;return i.subscribe({next({offset:a}){o.style.setProperty("--md-tooltip-x",`${a.x}px`),o.style.setProperty("--md-tooltip-y",`${a.y}px`)},complete(){o.style.removeProperty("--md-tooltip-x"),o.style.removeProperty("--md-tooltip-y")}}),O(i.pipe(b(({active:a})=>a)),i.pipe(_e(250),b(({active:a})=>!a))).subscribe({next({active:a}){a?(e.insertAdjacentElement("afterend",o),e.setAttribute("aria-describedby",r),e.removeAttribute("title")):(o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t))},complete(){o.remove(),e.removeAttribute("aria-describedby"),e.setAttribute("title",t)}}),i.pipe(Le(16,me)).subscribe(({active:a})=>{o.classList.toggle("md-tooltip--active",a)}),i.pipe(pt(125,me),b(()=>!!e.offsetParent),m(()=>e.offsetParent.getBoundingClientRect()),m(({x:a})=>a)).subscribe({next(a){a?o.style.setProperty("--md-tooltip-0",`${-a}px`):o.style.removeProperty("--md-tooltip-0")},complete(){o.style.removeProperty("--md-tooltip-0")}}),Ba(o,e).pipe(w(a=>i.next(a)),_(()=>i.complete()),m(a=>$({ref:e},a)))}).pipe(Ke(se))}function Ga({viewport$:e}){if(!B("header.autohide"))return I(!1);let t=e.pipe(m(({offset:{y:n}})=>n),Be(2,1),m(([n,i])=>[nMath.abs(i-n.y)>100),m(([,[n]])=>n),K()),o=ze("search");return z([e,o]).pipe(m(([{offset:n},i])=>n.y>400&&!i),K(),v(n=>n?r:I(!1)),Q(!1))}function Qn(e,t){return C(()=>z([ge(e),Ga(t)])).pipe(m(([{height:r},o])=>({height:r,hidden:o})),K((r,o)=>r.height===o.height&&r.hidden===o.hidden),G(1))}function Kn(e,{header$:t,main$:r}){return C(()=>{let o=new g,n=o.pipe(Z(),ie(!0));o.pipe(ee("active"),He(t)).subscribe(([{active:a},{hidden:s}])=>{e.classList.toggle("md-header--shadow",a&&!s),e.hidden=s});let i=ue(P("[title]",e)).pipe(b(()=>B("content.tooltips")),ne(a=>qn(a)));return r.subscribe(o),t.pipe(U(n),m(a=>$({ref:e},a)),Re(i.pipe(U(n))))})}function Ja(e,{viewport$:t,header$:r}){return mr(e,{viewport$:t,header$:r}).pipe(m(({offset:{y:o}})=>{let{height:n}=ce(e);return{active:o>=n}}),ee("active"))}function Yn(e,t){return C(()=>{let r=new g;r.subscribe({next({active:n}){e.classList.toggle("md-header__title--active",n)},complete(){e.classList.remove("md-header__title--active")}});let o=fe(".md-content h1");return typeof o=="undefined"?S:Ja(o,t).pipe(w(n=>r.next(n)),_(()=>r.complete()),m(n=>$({ref:e},n)))})}function Bn(e,{viewport$:t,header$:r}){let o=r.pipe(m(({height:i})=>i),K()),n=o.pipe(v(()=>ge(e).pipe(m(({height:i})=>({top:e.offsetTop,bottom:e.offsetTop+i})),ee("bottom"))));return z([o,n,t]).pipe(m(([i,{top:a,bottom:s},{offset:{y:p},size:{height:c}}])=>(c=Math.max(0,c-Math.max(0,a-p,i)-Math.max(0,c+p-s)),{offset:a-i,height:c,active:a-i<=p})),K((i,a)=>i.offset===a.offset&&i.height===a.height&&i.active===a.active))}function Xa(e){let t=__md_get("__palette")||{index:e.findIndex(o=>matchMedia(o.getAttribute("data-md-color-media")).matches)},r=Math.max(0,Math.min(t.index,e.length-1));return I(...e).pipe(ne(o=>h(o,"change").pipe(m(()=>o))),Q(e[r]),m(o=>({index:e.indexOf(o),color:{media:o.getAttribute("data-md-color-media"),scheme:o.getAttribute("data-md-color-scheme"),primary:o.getAttribute("data-md-color-primary"),accent:o.getAttribute("data-md-color-accent")}})),G(1))}function Gn(e){let t=P("input",e),r=x("meta",{name:"theme-color"});document.head.appendChild(r);let o=x("meta",{name:"color-scheme"});document.head.appendChild(o);let n=Pt("(prefers-color-scheme: light)");return C(()=>{let i=new g;return i.subscribe(a=>{if(document.body.setAttribute("data-md-color-switching",""),a.color.media==="(prefers-color-scheme)"){let s=matchMedia("(prefers-color-scheme: light)"),p=document.querySelector(s.matches?"[data-md-color-media='(prefers-color-scheme: light)']":"[data-md-color-media='(prefers-color-scheme: dark)']");a.color.scheme=p.getAttribute("data-md-color-scheme"),a.color.primary=p.getAttribute("data-md-color-primary"),a.color.accent=p.getAttribute("data-md-color-accent")}for(let[s,p]of Object.entries(a.color))document.body.setAttribute(`data-md-color-${s}`,p);for(let s=0;sa.key==="Enter"),re(i,(a,s)=>s)).subscribe(({index:a})=>{a=(a+1)%t.length,t[a].click(),t[a].focus()}),i.pipe(m(()=>{let a=Se("header"),s=window.getComputedStyle(a);return o.content=s.colorScheme,s.backgroundColor.match(/\d+/g).map(p=>(+p).toString(16).padStart(2,"0")).join("")})).subscribe(a=>r.content=`#${a}`),i.pipe(ve(se)).subscribe(()=>{document.body.removeAttribute("data-md-color-switching")}),Xa(t).pipe(U(n.pipe(Ce(1))),ct(),w(a=>i.next(a)),_(()=>i.complete()),m(a=>$({ref:e},a)))})}function Jn(e,{progress$:t}){return C(()=>{let r=new g;return r.subscribe(({value:o})=>{e.style.setProperty("--md-progress-value",`${o}`)}),t.pipe(w(o=>r.next({value:o})),_(()=>r.complete()),m(o=>({ref:e,value:o})))})}var Jr=Lt(Br());function Za(e){e.setAttribute("data-md-copying","");let t=e.closest("[data-copy]"),r=t?t.getAttribute("data-copy"):e.innerText;return e.removeAttribute("data-md-copying"),r.trimEnd()}function Xn({alert$:e}){Jr.default.isSupported()&&new j(t=>{new Jr.default("[data-clipboard-target], [data-clipboard-text]",{text:r=>r.getAttribute("data-clipboard-text")||Za(R(r.getAttribute("data-clipboard-target")))}).on("success",r=>t.next(r))}).pipe(w(t=>{t.trigger.focus()}),m(()=>Ee("clipboard.copied"))).subscribe(e)}function Zn(e,t){return e.protocol=t.protocol,e.hostname=t.hostname,e}function es(e,t){let r=new Map;for(let o of P("url",e)){let n=R("loc",o),i=[Zn(new URL(n.textContent),t)];r.set(`${i[0]}`,i);for(let a of P("[rel=alternate]",o)){let s=a.getAttribute("href");s!=null&&i.push(Zn(new URL(s),t))}}return r}function ur(e){return fn(new URL("sitemap.xml",e)).pipe(m(t=>es(t,new URL(e))),de(()=>I(new Map)))}function ts(e,t){if(!(e.target instanceof Element))return S;let r=e.target.closest("a");if(r===null)return S;if(r.target||e.metaKey||e.ctrlKey)return S;let o=new URL(r.href);return o.search=o.hash="",t.has(`${o}`)?(e.preventDefault(),I(new URL(r.href))):S}function ei(e){let t=new Map;for(let r of P(":scope > *",e.head))t.set(r.outerHTML,r);return t}function ti(e){for(let t of P("[href], [src]",e))for(let r of["href","src"]){let o=t.getAttribute(r);if(o&&!/^(?:[a-z]+:)?\/\//i.test(o)){t[r]=t[r];break}}return I(e)}function rs(e){for(let o of["[data-md-component=announce]","[data-md-component=container]","[data-md-component=header-topic]","[data-md-component=outdated]","[data-md-component=logo]","[data-md-component=skip]",...B("navigation.tabs.sticky")?["[data-md-component=tabs]"]:[]]){let n=fe(o),i=fe(o,e);typeof n!="undefined"&&typeof i!="undefined"&&n.replaceWith(i)}let t=ei(document);for(let[o,n]of ei(e))t.has(o)?t.delete(o):document.head.appendChild(n);for(let o of t.values()){let n=o.getAttribute("name");n!=="theme-color"&&n!=="color-scheme"&&o.remove()}let r=Se("container");return Ue(P("script",r)).pipe(v(o=>{let n=e.createElement("script");if(o.src){for(let i of o.getAttributeNames())n.setAttribute(i,o.getAttribute(i));return o.replaceWith(n),new j(i=>{n.onload=()=>i.complete()})}else return n.textContent=o.textContent,o.replaceWith(n),S}),Z(),ie(document))}function ri({location$:e,viewport$:t,progress$:r}){let o=xe();if(location.protocol==="file:")return S;let n=ur(o.base);I(document).subscribe(ti);let i=h(document.body,"click").pipe(He(n),v(([p,c])=>ts(p,c)),pe()),a=h(window,"popstate").pipe(m(ye),pe());i.pipe(re(t)).subscribe(([p,{offset:c}])=>{history.replaceState(c,""),history.pushState(null,"",p)}),O(i,a).subscribe(e);let s=e.pipe(ee("pathname"),v(p=>mn(p,{progress$:r}).pipe(de(()=>(lt(p,!0),S)))),v(ti),v(rs),pe());return O(s.pipe(re(e,(p,c)=>c)),s.pipe(v(()=>e),ee("pathname"),v(()=>e),ee("hash")),e.pipe(K((p,c)=>p.pathname===c.pathname&&p.hash===c.hash),v(()=>i),w(()=>history.back()))).subscribe(p=>{var c,l;history.state!==null||!p.hash?window.scrollTo(0,(l=(c=history.state)==null?void 0:c.y)!=null?l:0):(history.scrollRestoration="auto",cn(p.hash),history.scrollRestoration="manual")}),e.subscribe(()=>{history.scrollRestoration="manual"}),h(window,"beforeunload").subscribe(()=>{history.scrollRestoration="auto"}),t.pipe(ee("offset"),_e(100)).subscribe(({offset:p})=>{history.replaceState(p,"")}),s}var oi=Lt(qr());function ni(e){let t=e.separator.split("|").map(n=>n.replace(/(\(\?[!=<][^)]+\))/g,"").length===0?"\uFFFD":n).join("|"),r=new RegExp(t,"img"),o=(n,i,a)=>`${i}${a}`;return n=>{n=n.replace(/[\s*+\-:~^]+/g," ").trim();let i=new RegExp(`(^|${e.separator}|)(${n.replace(/[|\\{}()[\]^$+*?.-]/g,"\\$&").replace(r,"|")})`,"img");return a=>(0,oi.default)(a).replace(i,o).replace(/<\/mark>(\s+)]*>/img,"$1")}}function jt(e){return e.type===1}function dr(e){return e.type===3}function ii(e,t){let r=gn(e);return O(I(location.protocol!=="file:"),ze("search")).pipe(Ae(o=>o),v(()=>t)).subscribe(({config:o,docs:n})=>r.next({type:0,data:{config:o,docs:n,options:{suggest:B("search.suggest")}}})),r}function ai({document$:e}){let t=xe(),r=je(new URL("../versions.json",t.base)).pipe(de(()=>S)),o=r.pipe(m(n=>{let[,i]=t.base.match(/([^/]+)\/?$/);return n.find(({version:a,aliases:s})=>a===i||s.includes(i))||n[0]}));r.pipe(m(n=>new Map(n.map(i=>[`${new URL(`../${i.version}/`,t.base)}`,i]))),v(n=>h(document.body,"click").pipe(b(i=>!i.metaKey&&!i.ctrlKey),re(o),v(([i,a])=>{if(i.target instanceof Element){let s=i.target.closest("a");if(s&&!s.target&&n.has(s.href)){let p=s.href;return!i.target.closest(".md-version")&&n.get(p)===a?S:(i.preventDefault(),I(p))}}return S}),v(i=>ur(new URL(i)).pipe(m(a=>{let p=ye().href.replace(t.base,i);return a.has(p.split("#")[0])?new URL(p):new URL(i)})))))).subscribe(n=>lt(n,!0)),z([r,o]).subscribe(([n,i])=>{R(".md-header__topic").appendChild(An(n,i))}),e.pipe(v(()=>o)).subscribe(n=>{var a;let i=__md_get("__outdated",sessionStorage);if(i===null){i=!0;let s=((a=t.version)==null?void 0:a.default)||"latest";Array.isArray(s)||(s=[s]);e:for(let p of s)for(let c of n.aliases.concat(n.version))if(new RegExp(p,"i").test(c)){i=!1;break e}__md_set("__outdated",i,sessionStorage)}if(i)for(let s of ae("outdated"))s.hidden=!1})}function is(e,{worker$:t}){let{searchParams:r}=ye();r.has("q")&&(Je("search",!0),e.value=r.get("q"),e.focus(),ze("search").pipe(Ae(i=>!i)).subscribe(()=>{let i=ye();i.searchParams.delete("q"),history.replaceState({},"",`${i}`)}));let o=et(e),n=O(t.pipe(Ae(jt)),h(e,"keyup"),o).pipe(m(()=>e.value),K());return z([n,o]).pipe(m(([i,a])=>({value:i,focus:a})),G(1))}function si(e,{worker$:t}){let r=new g,o=r.pipe(Z(),ie(!0));z([t.pipe(Ae(jt)),r],(i,a)=>a).pipe(ee("value")).subscribe(({value:i})=>t.next({type:2,data:i})),r.pipe(ee("focus")).subscribe(({focus:i})=>{i&&Je("search",i)}),h(e.form,"reset").pipe(U(o)).subscribe(()=>e.focus());let n=R("header [for=__search]");return h(n,"click").subscribe(()=>e.focus()),is(e,{worker$:t}).pipe(w(i=>r.next(i)),_(()=>r.complete()),m(i=>$({ref:e},i)),G(1))}function ci(e,{worker$:t,query$:r}){let o=new g,n=rn(e.parentElement).pipe(b(Boolean)),i=e.parentElement,a=R(":scope > :first-child",e),s=R(":scope > :last-child",e);ze("search").subscribe(l=>s.setAttribute("role",l?"list":"presentation")),o.pipe(re(r),Ur(t.pipe(Ae(jt)))).subscribe(([{items:l},{value:f}])=>{switch(l.length){case 0:a.textContent=f.length?Ee("search.result.none"):Ee("search.result.placeholder");break;case 1:a.textContent=Ee("search.result.one");break;default:let u=sr(l.length);a.textContent=Ee("search.result.other",u)}});let p=o.pipe(w(()=>s.innerHTML=""),v(({items:l})=>O(I(...l.slice(0,10)),I(...l.slice(10)).pipe(Be(4),Vr(n),v(([f])=>f)))),m(Mn),pe());return p.subscribe(l=>s.appendChild(l)),p.pipe(ne(l=>{let f=fe("details",l);return typeof f=="undefined"?S:h(f,"toggle").pipe(U(o),m(()=>f))})).subscribe(l=>{l.open===!1&&l.offsetTop<=i.scrollTop&&i.scrollTo({top:l.offsetTop})}),t.pipe(b(dr),m(({data:l})=>l)).pipe(w(l=>o.next(l)),_(()=>o.complete()),m(l=>$({ref:e},l)))}function as(e,{query$:t}){return t.pipe(m(({value:r})=>{let o=ye();return o.hash="",r=r.replace(/\s+/g,"+").replace(/&/g,"%26").replace(/=/g,"%3D"),o.search=`q=${r}`,{url:o}}))}function pi(e,t){let r=new g,o=r.pipe(Z(),ie(!0));return r.subscribe(({url:n})=>{e.setAttribute("data-clipboard-text",e.href),e.href=`${n}`}),h(e,"click").pipe(U(o)).subscribe(n=>n.preventDefault()),as(e,t).pipe(w(n=>r.next(n)),_(()=>r.complete()),m(n=>$({ref:e},n)))}function li(e,{worker$:t,keyboard$:r}){let o=new g,n=Se("search-query"),i=O(h(n,"keydown"),h(n,"focus")).pipe(ve(se),m(()=>n.value),K());return o.pipe(He(i),m(([{suggest:s},p])=>{let c=p.split(/([\s-]+)/);if(s!=null&&s.length&&c[c.length-1]){let l=s[s.length-1];l.startsWith(c[c.length-1])&&(c[c.length-1]=l)}else c.length=0;return c})).subscribe(s=>e.innerHTML=s.join("").replace(/\s/g," ")),r.pipe(b(({mode:s})=>s==="search")).subscribe(s=>{switch(s.type){case"ArrowRight":e.innerText.length&&n.selectionStart===n.value.length&&(n.value=e.innerText);break}}),t.pipe(b(dr),m(({data:s})=>s)).pipe(w(s=>o.next(s)),_(()=>o.complete()),m(()=>({ref:e})))}function mi(e,{index$:t,keyboard$:r}){let o=xe();try{let n=ii(o.search,t),i=Se("search-query",e),a=Se("search-result",e);h(e,"click").pipe(b(({target:p})=>p instanceof Element&&!!p.closest("a"))).subscribe(()=>Je("search",!1)),r.pipe(b(({mode:p})=>p==="search")).subscribe(p=>{let c=Ie();switch(p.type){case"Enter":if(c===i){let l=new Map;for(let f of P(":first-child [href]",a)){let u=f.firstElementChild;l.set(f,parseFloat(u.getAttribute("data-md-score")))}if(l.size){let[[f]]=[...l].sort(([,u],[,d])=>d-u);f.click()}p.claim()}break;case"Escape":case"Tab":Je("search",!1),i.blur();break;case"ArrowUp":case"ArrowDown":if(typeof c=="undefined")i.focus();else{let l=[i,...P(":not(details) > [href], summary, details[open] [href]",a)],f=Math.max(0,(Math.max(0,l.indexOf(c))+l.length+(p.type==="ArrowUp"?-1:1))%l.length);l[f].focus()}p.claim();break;default:i!==Ie()&&i.focus()}}),r.pipe(b(({mode:p})=>p==="global")).subscribe(p=>{switch(p.type){case"f":case"s":case"/":i.focus(),i.select(),p.claim();break}});let s=si(i,{worker$:n});return O(s,ci(a,{worker$:n,query$:s})).pipe(Re(...ae("search-share",e).map(p=>pi(p,{query$:s})),...ae("search-suggest",e).map(p=>li(p,{worker$:n,keyboard$:r}))))}catch(n){return e.hidden=!0,Ye}}function fi(e,{index$:t,location$:r}){return z([t,r.pipe(Q(ye()),b(o=>!!o.searchParams.get("h")))]).pipe(m(([o,n])=>ni(o.config)(n.searchParams.get("h"))),m(o=>{var a;let n=new Map,i=document.createNodeIterator(e,NodeFilter.SHOW_TEXT);for(let s=i.nextNode();s;s=i.nextNode())if((a=s.parentElement)!=null&&a.offsetHeight){let p=s.textContent,c=o(p);c.length>p.length&&n.set(s,c)}for(let[s,p]of n){let{childNodes:c}=x("span",null,p);s.replaceWith(...Array.from(c))}return{ref:e,nodes:n}}))}function ss(e,{viewport$:t,main$:r}){let o=e.closest(".md-grid"),n=o.offsetTop-o.parentElement.offsetTop;return z([r,t]).pipe(m(([{offset:i,height:a},{offset:{y:s}}])=>(a=a+Math.min(n,Math.max(0,s-i))-n,{height:a,locked:s>=i+n})),K((i,a)=>i.height===a.height&&i.locked===a.locked))}function Xr(e,o){var n=o,{header$:t}=n,r=ao(n,["header$"]);let i=R(".md-sidebar__scrollwrap",e),{y:a}=Ve(i);return C(()=>{let s=new g,p=s.pipe(Z(),ie(!0)),c=s.pipe(Le(0,me));return c.pipe(re(t)).subscribe({next([{height:l},{height:f}]){i.style.height=`${l-2*a}px`,e.style.top=`${f}px`},complete(){i.style.height="",e.style.top=""}}),c.pipe(Ae()).subscribe(()=>{for(let l of P(".md-nav__link--active[href]",e)){if(!l.clientHeight)continue;let f=l.closest(".md-sidebar__scrollwrap");if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=ce(f);f.scrollTo({top:u-d/2})}}}),ue(P("label[tabindex]",e)).pipe(ne(l=>h(l,"click").pipe(ve(se),m(()=>l),U(p)))).subscribe(l=>{let f=R(`[id="${l.htmlFor}"]`);R(`[aria-labelledby="${l.id}"]`).setAttribute("aria-expanded",`${f.checked}`)}),ss(e,r).pipe(w(l=>s.next(l)),_(()=>s.complete()),m(l=>$({ref:e},l)))})}function ui(e,t){if(typeof t!="undefined"){let r=`https://api.github.com/repos/${e}/${t}`;return st(je(`${r}/releases/latest`).pipe(de(()=>S),m(o=>({version:o.tag_name})),De({})),je(r).pipe(de(()=>S),m(o=>({stars:o.stargazers_count,forks:o.forks_count})),De({}))).pipe(m(([o,n])=>$($({},o),n)))}else{let r=`https://api.github.com/users/${e}`;return je(r).pipe(m(o=>({repositories:o.public_repos})),De({}))}}function di(e,t){let r=`https://${e}/api/v4/projects/${encodeURIComponent(t)}`;return st(je(`${r}/releases/permalink/latest`).pipe(de(()=>S),m(({tag_name:o})=>({version:o})),De({})),je(r).pipe(de(()=>S),m(({star_count:o,forks_count:n})=>({stars:o,forks:n})),De({}))).pipe(m(([o,n])=>$($({},o),n)))}function hi(e){let t=e.match(/^.+github\.com\/([^/]+)\/?([^/]+)?/i);if(t){let[,r,o]=t;return ui(r,o)}if(t=e.match(/^.+?([^/]*gitlab[^/]+)\/(.+?)\/?$/i),t){let[,r,o]=t;return di(r,o)}return S}var cs;function ps(e){return cs||(cs=C(()=>{let t=__md_get("__source",sessionStorage);if(t)return I(t);if(ae("consent").length){let o=__md_get("__consent");if(!(o&&o.github))return S}return hi(e.href).pipe(w(o=>__md_set("__source",o,sessionStorage)))}).pipe(de(()=>S),b(t=>Object.keys(t).length>0),m(t=>({facts:t})),G(1)))}function bi(e){let t=R(":scope > :last-child",e);return C(()=>{let r=new g;return r.subscribe(({facts:o})=>{t.appendChild(Ln(o)),t.classList.add("md-source__repository--active")}),ps(e).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}function ls(e,{viewport$:t,header$:r}){return ge(document.body).pipe(v(()=>mr(e,{header$:r,viewport$:t})),m(({offset:{y:o}})=>({hidden:o>=10})),ee("hidden"))}function vi(e,t){return C(()=>{let r=new g;return r.subscribe({next({hidden:o}){e.hidden=o},complete(){e.hidden=!1}}),(B("navigation.tabs.sticky")?I({hidden:!1}):ls(e,t)).pipe(w(o=>r.next(o)),_(()=>r.complete()),m(o=>$({ref:e},o)))})}function ms(e,{viewport$:t,header$:r}){let o=new Map,n=P(".md-nav__link",e);for(let s of n){let p=decodeURIComponent(s.hash.substring(1)),c=fe(`[id="${p}"]`);typeof c!="undefined"&&o.set(s,c)}let i=r.pipe(ee("height"),m(({height:s})=>{let p=Se("main"),c=R(":scope > :first-child",p);return s+.8*(c.offsetTop-p.offsetTop)}),pe());return ge(document.body).pipe(ee("height"),v(s=>C(()=>{let p=[];return I([...o].reduce((c,[l,f])=>{for(;p.length&&o.get(p[p.length-1]).tagName>=f.tagName;)p.pop();let u=f.offsetTop;for(;!u&&f.parentElement;)f=f.parentElement,u=f.offsetTop;let d=f.offsetParent;for(;d;d=d.offsetParent)u+=d.offsetTop;return c.set([...p=[...p,l]].reverse(),u)},new Map))}).pipe(m(p=>new Map([...p].sort(([,c],[,l])=>c-l))),He(i),v(([p,c])=>t.pipe(Fr(([l,f],{offset:{y:u},size:d})=>{let y=u+d.height>=Math.floor(s.height);for(;f.length;){let[,M]=f[0];if(M-c=u&&!y)f=[l.pop(),...f];else break}return[l,f]},[[],[...p]]),K((l,f)=>l[0]===f[0]&&l[1]===f[1])))))).pipe(m(([s,p])=>({prev:s.map(([c])=>c),next:p.map(([c])=>c)})),Q({prev:[],next:[]}),Be(2,1),m(([s,p])=>s.prev.length{let i=new g,a=i.pipe(Z(),ie(!0));if(i.subscribe(({prev:s,next:p})=>{for(let[c]of p)c.classList.remove("md-nav__link--passed"),c.classList.remove("md-nav__link--active");for(let[c,[l]]of s.entries())l.classList.add("md-nav__link--passed"),l.classList.toggle("md-nav__link--active",c===s.length-1)}),B("toc.follow")){let s=O(t.pipe(_e(1),m(()=>{})),t.pipe(_e(250),m(()=>"smooth")));i.pipe(b(({prev:p})=>p.length>0),He(o.pipe(ve(se))),re(s)).subscribe(([[{prev:p}],c])=>{let[l]=p[p.length-1];if(l.offsetHeight){let f=cr(l);if(typeof f!="undefined"){let u=l.offsetTop-f.offsetTop,{height:d}=ce(f);f.scrollTo({top:u-d/2,behavior:c})}}})}return B("navigation.tracking")&&t.pipe(U(a),ee("offset"),_e(250),Ce(1),U(n.pipe(Ce(1))),ct({delay:250}),re(i)).subscribe(([,{prev:s}])=>{let p=ye(),c=s[s.length-1];if(c&&c.length){let[l]=c,{hash:f}=new URL(l.href);p.hash!==f&&(p.hash=f,history.replaceState({},"",`${p}`))}else p.hash="",history.replaceState({},"",`${p}`)}),ms(e,{viewport$:t,header$:r}).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))})}function fs(e,{viewport$:t,main$:r,target$:o}){let n=t.pipe(m(({offset:{y:a}})=>a),Be(2,1),m(([a,s])=>a>s&&s>0),K()),i=r.pipe(m(({active:a})=>a));return z([i,n]).pipe(m(([a,s])=>!(a&&s)),K(),U(o.pipe(Ce(1))),ie(!0),ct({delay:250}),m(a=>({hidden:a})))}function yi(e,{viewport$:t,header$:r,main$:o,target$:n}){let i=new g,a=i.pipe(Z(),ie(!0));return i.subscribe({next({hidden:s}){e.hidden=s,s?(e.setAttribute("tabindex","-1"),e.blur()):e.removeAttribute("tabindex")},complete(){e.style.top="",e.hidden=!0,e.removeAttribute("tabindex")}}),r.pipe(U(a),ee("height")).subscribe(({height:s})=>{e.style.top=`${s+16}px`}),h(e,"click").subscribe(s=>{s.preventDefault(),window.scrollTo({top:0})}),fs(e,{viewport$:t,main$:o,target$:n}).pipe(w(s=>i.next(s)),_(()=>i.complete()),m(s=>$({ref:e},s)))}function xi({document$:e,viewport$:t}){e.pipe(v(()=>P(".md-ellipsis")),ne(r=>tt(r).pipe(U(e.pipe(Ce(1))),b(o=>o),m(()=>r),Te(1))),b(r=>r.offsetWidth{let o=r.innerText,n=r.closest("a")||r;return n.title=o,B("content.tooltips")?mt(n,{viewport$:t}).pipe(U(e.pipe(Ce(1))),_(()=>n.removeAttribute("title"))):S})).subscribe(),B("content.tooltips")&&e.pipe(v(()=>P(".md-status")),ne(r=>mt(r,{viewport$:t}))).subscribe()}function Ei({document$:e,tablet$:t}){e.pipe(v(()=>P(".md-toggle--indeterminate")),w(r=>{r.indeterminate=!0,r.checked=!1}),ne(r=>h(r,"change").pipe(Dr(()=>r.classList.contains("md-toggle--indeterminate")),m(()=>r))),re(t)).subscribe(([r,o])=>{r.classList.remove("md-toggle--indeterminate"),o&&(r.checked=!1)})}function us(){return/(iPad|iPhone|iPod)/.test(navigator.userAgent)}function wi({document$:e}){e.pipe(v(()=>P("[data-md-scrollfix]")),w(t=>t.removeAttribute("data-md-scrollfix")),b(us),ne(t=>h(t,"touchstart").pipe(m(()=>t)))).subscribe(t=>{let r=t.scrollTop;r===0?t.scrollTop=1:r+t.offsetHeight===t.scrollHeight&&(t.scrollTop=r-1)})}function Ti({viewport$:e,tablet$:t}){z([ze("search"),t]).pipe(m(([r,o])=>r&&!o),v(r=>I(r).pipe(Ge(r?400:100))),re(e)).subscribe(([r,{offset:{y:o}}])=>{if(r)document.body.setAttribute("data-md-scrolllock",""),document.body.style.top=`-${o}px`;else{let n=-1*parseInt(document.body.style.top,10);document.body.removeAttribute("data-md-scrolllock"),document.body.style.top="",n&&window.scrollTo(0,n)}})}Object.entries||(Object.entries=function(e){let t=[];for(let r of Object.keys(e))t.push([r,e[r]]);return t});Object.values||(Object.values=function(e){let t=[];for(let r of Object.keys(e))t.push(e[r]);return t});typeof Element!="undefined"&&(Element.prototype.scrollTo||(Element.prototype.scrollTo=function(e,t){typeof e=="object"?(this.scrollLeft=e.left,this.scrollTop=e.top):(this.scrollLeft=e,this.scrollTop=t)}),Element.prototype.replaceWith||(Element.prototype.replaceWith=function(...e){let t=this.parentNode;if(t){e.length===0&&t.removeChild(this);for(let r=e.length-1;r>=0;r--){let o=e[r];typeof o=="string"?o=document.createTextNode(o):o.parentNode&&o.parentNode.removeChild(o),r?t.insertBefore(this.previousSibling,o):t.replaceChild(o,this)}}}));function ds(){return location.protocol==="file:"?Tt(`${new URL("search/search_index.js",Zr.base)}`).pipe(m(()=>__index),G(1)):je(new URL("search/search_index.json",Zr.base))}document.documentElement.classList.remove("no-js");document.documentElement.classList.add("js");var ot=Bo(),Wt=an(),Mt=pn(Wt),eo=nn(),Oe=vn(),hr=Pt("(min-width: 960px)"),Oi=Pt("(min-width: 1220px)"),Mi=ln(),Zr=xe(),Li=document.forms.namedItem("search")?ds():Ye,to=new g;Xn({alert$:to});var ro=new g;B("navigation.instant")&&ri({location$:Wt,viewport$:Oe,progress$:ro}).subscribe(ot);var Si;((Si=Zr.version)==null?void 0:Si.provider)==="mike"&&ai({document$:ot});O(Wt,Mt).pipe(Ge(125)).subscribe(()=>{Je("drawer",!1),Je("search",!1)});eo.pipe(b(({mode:e})=>e==="global")).subscribe(e=>{switch(e.type){case"p":case",":let t=fe("link[rel=prev]");typeof t!="undefined"&<(t);break;case"n":case".":let r=fe("link[rel=next]");typeof r!="undefined"&<(r);break;case"Enter":let o=Ie();o instanceof HTMLLabelElement&&o.click()}});xi({viewport$:Oe,document$:ot});Ei({document$:ot,tablet$:hr});wi({document$:ot});Ti({viewport$:Oe,tablet$:hr});var rt=Qn(Se("header"),{viewport$:Oe}),Ft=ot.pipe(m(()=>Se("main")),v(e=>Bn(e,{viewport$:Oe,header$:rt})),G(1)),hs=O(...ae("consent").map(e=>xn(e,{target$:Mt})),...ae("dialog").map(e=>zn(e,{alert$:to})),...ae("header").map(e=>Kn(e,{viewport$:Oe,header$:rt,main$:Ft})),...ae("palette").map(e=>Gn(e)),...ae("progress").map(e=>Jn(e,{progress$:ro})),...ae("search").map(e=>mi(e,{index$:Li,keyboard$:eo})),...ae("source").map(e=>bi(e))),bs=C(()=>O(...ae("announce").map(e=>yn(e)),...ae("content").map(e=>Nn(e,{viewport$:Oe,target$:Mt,print$:Mi})),...ae("content").map(e=>B("search.highlight")?fi(e,{index$:Li,location$:Wt}):S),...ae("header-title").map(e=>Yn(e,{viewport$:Oe,header$:rt})),...ae("sidebar").map(e=>e.getAttribute("data-md-type")==="navigation"?Nr(Oi,()=>Xr(e,{viewport$:Oe,header$:rt,main$:Ft})):Nr(hr,()=>Xr(e,{viewport$:Oe,header$:rt,main$:Ft}))),...ae("tabs").map(e=>vi(e,{viewport$:Oe,header$:rt})),...ae("toc").map(e=>gi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Mt})),...ae("top").map(e=>yi(e,{viewport$:Oe,header$:rt,main$:Ft,target$:Mt})))),_i=ot.pipe(v(()=>bs),Re(hs),G(1));_i.subscribe();window.document$=ot;window.location$=Wt;window.target$=Mt;window.keyboard$=eo;window.viewport$=Oe;window.tablet$=hr;window.screen$=Oi;window.print$=Mi;window.alert$=to;window.progress$=ro;window.component$=_i;})(); +//# sourceMappingURL=bundle.56dfad97.min.js.map + diff --git a/assets/javascripts/bundle.56dfad97.min.js.map b/assets/javascripts/bundle.56dfad97.min.js.map new file mode 100644 index 0000000..eb83bdb --- /dev/null +++ b/assets/javascripts/bundle.56dfad97.min.js.map @@ -0,0 +1,7 @@ +{ + "version": 3, + "sources": ["node_modules/focus-visible/dist/focus-visible.js", "node_modules/escape-html/index.js", "node_modules/clipboard/dist/clipboard.js", "src/templates/assets/javascripts/bundle.ts", "node_modules/tslib/tslib.es6.mjs", "node_modules/rxjs/src/internal/util/isFunction.ts", "node_modules/rxjs/src/internal/util/createErrorClass.ts", "node_modules/rxjs/src/internal/util/UnsubscriptionError.ts", "node_modules/rxjs/src/internal/util/arrRemove.ts", "node_modules/rxjs/src/internal/Subscription.ts", "node_modules/rxjs/src/internal/config.ts", "node_modules/rxjs/src/internal/scheduler/timeoutProvider.ts", "node_modules/rxjs/src/internal/util/reportUnhandledError.ts", "node_modules/rxjs/src/internal/util/noop.ts", "node_modules/rxjs/src/internal/NotificationFactories.ts", "node_modules/rxjs/src/internal/util/errorContext.ts", "node_modules/rxjs/src/internal/Subscriber.ts", "node_modules/rxjs/src/internal/symbol/observable.ts", "node_modules/rxjs/src/internal/util/identity.ts", "node_modules/rxjs/src/internal/util/pipe.ts", "node_modules/rxjs/src/internal/Observable.ts", "node_modules/rxjs/src/internal/util/lift.ts", "node_modules/rxjs/src/internal/operators/OperatorSubscriber.ts", "node_modules/rxjs/src/internal/scheduler/animationFrameProvider.ts", "node_modules/rxjs/src/internal/util/ObjectUnsubscribedError.ts", "node_modules/rxjs/src/internal/Subject.ts", "node_modules/rxjs/src/internal/BehaviorSubject.ts", "node_modules/rxjs/src/internal/scheduler/dateTimestampProvider.ts", "node_modules/rxjs/src/internal/ReplaySubject.ts", "node_modules/rxjs/src/internal/scheduler/Action.ts", "node_modules/rxjs/src/internal/scheduler/intervalProvider.ts", "node_modules/rxjs/src/internal/scheduler/AsyncAction.ts", "node_modules/rxjs/src/internal/Scheduler.ts", "node_modules/rxjs/src/internal/scheduler/AsyncScheduler.ts", "node_modules/rxjs/src/internal/scheduler/async.ts", "node_modules/rxjs/src/internal/scheduler/QueueAction.ts", "node_modules/rxjs/src/internal/scheduler/QueueScheduler.ts", "node_modules/rxjs/src/internal/scheduler/queue.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameAction.ts", "node_modules/rxjs/src/internal/scheduler/AnimationFrameScheduler.ts", "node_modules/rxjs/src/internal/scheduler/animationFrame.ts", "node_modules/rxjs/src/internal/observable/empty.ts", "node_modules/rxjs/src/internal/util/isScheduler.ts", "node_modules/rxjs/src/internal/util/args.ts", "node_modules/rxjs/src/internal/util/isArrayLike.ts", "node_modules/rxjs/src/internal/util/isPromise.ts", "node_modules/rxjs/src/internal/util/isInteropObservable.ts", "node_modules/rxjs/src/internal/util/isAsyncIterable.ts", "node_modules/rxjs/src/internal/util/throwUnobservableError.ts", "node_modules/rxjs/src/internal/symbol/iterator.ts", "node_modules/rxjs/src/internal/util/isIterable.ts", "node_modules/rxjs/src/internal/util/isReadableStreamLike.ts", "node_modules/rxjs/src/internal/observable/innerFrom.ts", "node_modules/rxjs/src/internal/util/executeSchedule.ts", "node_modules/rxjs/src/internal/operators/observeOn.ts", "node_modules/rxjs/src/internal/operators/subscribeOn.ts", "node_modules/rxjs/src/internal/scheduled/scheduleObservable.ts", "node_modules/rxjs/src/internal/scheduled/schedulePromise.ts", "node_modules/rxjs/src/internal/scheduled/scheduleArray.ts", "node_modules/rxjs/src/internal/scheduled/scheduleIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleAsyncIterable.ts", "node_modules/rxjs/src/internal/scheduled/scheduleReadableStreamLike.ts", "node_modules/rxjs/src/internal/scheduled/scheduled.ts", "node_modules/rxjs/src/internal/observable/from.ts", "node_modules/rxjs/src/internal/observable/of.ts", "node_modules/rxjs/src/internal/observable/throwError.ts", "node_modules/rxjs/src/internal/util/EmptyError.ts", "node_modules/rxjs/src/internal/util/isDate.ts", "node_modules/rxjs/src/internal/operators/map.ts", "node_modules/rxjs/src/internal/util/mapOneOrManyArgs.ts", "node_modules/rxjs/src/internal/util/argsArgArrayOrObject.ts", "node_modules/rxjs/src/internal/util/createObject.ts", "node_modules/rxjs/src/internal/observable/combineLatest.ts", "node_modules/rxjs/src/internal/operators/mergeInternals.ts", "node_modules/rxjs/src/internal/operators/mergeMap.ts", "node_modules/rxjs/src/internal/operators/mergeAll.ts", "node_modules/rxjs/src/internal/operators/concatAll.ts", "node_modules/rxjs/src/internal/observable/concat.ts", "node_modules/rxjs/src/internal/observable/defer.ts", "node_modules/rxjs/src/internal/observable/fromEvent.ts", "node_modules/rxjs/src/internal/observable/fromEventPattern.ts", "node_modules/rxjs/src/internal/observable/timer.ts", "node_modules/rxjs/src/internal/observable/merge.ts", "node_modules/rxjs/src/internal/observable/never.ts", "node_modules/rxjs/src/internal/util/argsOrArgArray.ts", "node_modules/rxjs/src/internal/operators/filter.ts", "node_modules/rxjs/src/internal/observable/zip.ts", "node_modules/rxjs/src/internal/operators/audit.ts", "node_modules/rxjs/src/internal/operators/auditTime.ts", "node_modules/rxjs/src/internal/operators/bufferCount.ts", "node_modules/rxjs/src/internal/operators/catchError.ts", "node_modules/rxjs/src/internal/operators/scanInternals.ts", "node_modules/rxjs/src/internal/operators/combineLatest.ts", "node_modules/rxjs/src/internal/operators/combineLatestWith.ts", "node_modules/rxjs/src/internal/operators/debounce.ts", "node_modules/rxjs/src/internal/operators/debounceTime.ts", "node_modules/rxjs/src/internal/operators/defaultIfEmpty.ts", "node_modules/rxjs/src/internal/operators/take.ts", "node_modules/rxjs/src/internal/operators/ignoreElements.ts", "node_modules/rxjs/src/internal/operators/mapTo.ts", "node_modules/rxjs/src/internal/operators/delayWhen.ts", "node_modules/rxjs/src/internal/operators/delay.ts", "node_modules/rxjs/src/internal/operators/distinctUntilChanged.ts", "node_modules/rxjs/src/internal/operators/distinctUntilKeyChanged.ts", "node_modules/rxjs/src/internal/operators/throwIfEmpty.ts", "node_modules/rxjs/src/internal/operators/endWith.ts", "node_modules/rxjs/src/internal/operators/finalize.ts", "node_modules/rxjs/src/internal/operators/first.ts", "node_modules/rxjs/src/internal/operators/takeLast.ts", "node_modules/rxjs/src/internal/operators/merge.ts", "node_modules/rxjs/src/internal/operators/mergeWith.ts", "node_modules/rxjs/src/internal/operators/repeat.ts", "node_modules/rxjs/src/internal/operators/scan.ts", "node_modules/rxjs/src/internal/operators/share.ts", "node_modules/rxjs/src/internal/operators/shareReplay.ts", "node_modules/rxjs/src/internal/operators/skip.ts", "node_modules/rxjs/src/internal/operators/skipUntil.ts", "node_modules/rxjs/src/internal/operators/startWith.ts", "node_modules/rxjs/src/internal/operators/switchMap.ts", "node_modules/rxjs/src/internal/operators/takeUntil.ts", "node_modules/rxjs/src/internal/operators/takeWhile.ts", "node_modules/rxjs/src/internal/operators/tap.ts", "node_modules/rxjs/src/internal/operators/throttle.ts", "node_modules/rxjs/src/internal/operators/throttleTime.ts", "node_modules/rxjs/src/internal/operators/withLatestFrom.ts", "node_modules/rxjs/src/internal/operators/zip.ts", "node_modules/rxjs/src/internal/operators/zipWith.ts", "src/templates/assets/javascripts/browser/document/index.ts", "src/templates/assets/javascripts/browser/element/_/index.ts", "src/templates/assets/javascripts/browser/element/focus/index.ts", "src/templates/assets/javascripts/browser/element/hover/index.ts", "src/templates/assets/javascripts/utilities/h/index.ts", "src/templates/assets/javascripts/utilities/round/index.ts", "src/templates/assets/javascripts/browser/script/index.ts", "src/templates/assets/javascripts/browser/element/size/_/index.ts", "src/templates/assets/javascripts/browser/element/size/content/index.ts", "src/templates/assets/javascripts/browser/element/offset/_/index.ts", "src/templates/assets/javascripts/browser/element/offset/content/index.ts", "src/templates/assets/javascripts/browser/element/visibility/index.ts", "src/templates/assets/javascripts/browser/toggle/index.ts", "src/templates/assets/javascripts/browser/keyboard/index.ts", "src/templates/assets/javascripts/browser/location/_/index.ts", "src/templates/assets/javascripts/browser/location/hash/index.ts", "src/templates/assets/javascripts/browser/media/index.ts", "src/templates/assets/javascripts/browser/request/index.ts", "src/templates/assets/javascripts/browser/viewport/offset/index.ts", "src/templates/assets/javascripts/browser/viewport/size/index.ts", "src/templates/assets/javascripts/browser/viewport/_/index.ts", "src/templates/assets/javascripts/browser/viewport/at/index.ts", "src/templates/assets/javascripts/browser/worker/index.ts", "src/templates/assets/javascripts/_/index.ts", "src/templates/assets/javascripts/components/_/index.ts", "src/templates/assets/javascripts/components/announce/index.ts", "src/templates/assets/javascripts/components/consent/index.ts", "src/templates/assets/javascripts/templates/tooltip/index.tsx", "src/templates/assets/javascripts/templates/annotation/index.tsx", "src/templates/assets/javascripts/templates/clipboard/index.tsx", "src/templates/assets/javascripts/templates/search/index.tsx", "src/templates/assets/javascripts/templates/source/index.tsx", "src/templates/assets/javascripts/templates/tabbed/index.tsx", "src/templates/assets/javascripts/templates/table/index.tsx", "src/templates/assets/javascripts/templates/version/index.tsx", "src/templates/assets/javascripts/components/tooltip2/index.ts", "src/templates/assets/javascripts/components/content/annotation/_/index.ts", "src/templates/assets/javascripts/components/content/annotation/list/index.ts", "src/templates/assets/javascripts/components/content/annotation/block/index.ts", "src/templates/assets/javascripts/components/content/code/_/index.ts", "src/templates/assets/javascripts/components/content/details/index.ts", "src/templates/assets/javascripts/components/content/mermaid/index.css", "src/templates/assets/javascripts/components/content/mermaid/index.ts", "src/templates/assets/javascripts/components/content/table/index.ts", "src/templates/assets/javascripts/components/content/tabs/index.ts", "src/templates/assets/javascripts/components/content/_/index.ts", "src/templates/assets/javascripts/components/dialog/index.ts", "src/templates/assets/javascripts/components/tooltip/index.ts", "src/templates/assets/javascripts/components/header/_/index.ts", "src/templates/assets/javascripts/components/header/title/index.ts", "src/templates/assets/javascripts/components/main/index.ts", "src/templates/assets/javascripts/components/palette/index.ts", "src/templates/assets/javascripts/components/progress/index.ts", "src/templates/assets/javascripts/integrations/clipboard/index.ts", "src/templates/assets/javascripts/integrations/sitemap/index.ts", "src/templates/assets/javascripts/integrations/instant/index.ts", "src/templates/assets/javascripts/integrations/search/highlighter/index.ts", "src/templates/assets/javascripts/integrations/search/worker/message/index.ts", "src/templates/assets/javascripts/integrations/search/worker/_/index.ts", "src/templates/assets/javascripts/integrations/version/index.ts", "src/templates/assets/javascripts/components/search/query/index.ts", "src/templates/assets/javascripts/components/search/result/index.ts", "src/templates/assets/javascripts/components/search/share/index.ts", "src/templates/assets/javascripts/components/search/suggest/index.ts", "src/templates/assets/javascripts/components/search/_/index.ts", "src/templates/assets/javascripts/components/search/highlight/index.ts", "src/templates/assets/javascripts/components/sidebar/index.ts", "src/templates/assets/javascripts/components/source/facts/github/index.ts", "src/templates/assets/javascripts/components/source/facts/gitlab/index.ts", "src/templates/assets/javascripts/components/source/facts/_/index.ts", "src/templates/assets/javascripts/components/source/_/index.ts", "src/templates/assets/javascripts/components/tabs/index.ts", "src/templates/assets/javascripts/components/toc/index.ts", "src/templates/assets/javascripts/components/top/index.ts", "src/templates/assets/javascripts/patches/ellipsis/index.ts", "src/templates/assets/javascripts/patches/indeterminate/index.ts", "src/templates/assets/javascripts/patches/scrollfix/index.ts", "src/templates/assets/javascripts/patches/scrolllock/index.ts", "src/templates/assets/javascripts/polyfills/index.ts"], + "sourcesContent": ["(function (global, factory) {\n typeof exports === 'object' && typeof module !== 'undefined' ? factory() :\n typeof define === 'function' && define.amd ? define(factory) :\n (factory());\n}(this, (function () { 'use strict';\n\n /**\n * Applies the :focus-visible polyfill at the given scope.\n * A scope in this case is either the top-level Document or a Shadow Root.\n *\n * @param {(Document|ShadowRoot)} scope\n * @see https://github.com/WICG/focus-visible\n */\n function applyFocusVisiblePolyfill(scope) {\n var hadKeyboardEvent = true;\n var hadFocusVisibleRecently = false;\n var hadFocusVisibleRecentlyTimeout = null;\n\n var inputTypesAllowlist = {\n text: true,\n search: true,\n url: true,\n tel: true,\n email: true,\n password: true,\n number: true,\n date: true,\n month: true,\n week: true,\n time: true,\n datetime: true,\n 'datetime-local': true\n };\n\n /**\n * Helper function for legacy browsers and iframes which sometimes focus\n * elements like document, body, and non-interactive SVG.\n * @param {Element} el\n */\n function isValidFocusTarget(el) {\n if (\n el &&\n el !== document &&\n el.nodeName !== 'HTML' &&\n el.nodeName !== 'BODY' &&\n 'classList' in el &&\n 'contains' in el.classList\n ) {\n return true;\n }\n return false;\n }\n\n /**\n * Computes whether the given element should automatically trigger the\n * `focus-visible` class being added, i.e. whether it should always match\n * `:focus-visible` when focused.\n * @param {Element} el\n * @return {boolean}\n */\n function focusTriggersKeyboardModality(el) {\n var type = el.type;\n var tagName = el.tagName;\n\n if (tagName === 'INPUT' && inputTypesAllowlist[type] && !el.readOnly) {\n return true;\n }\n\n if (tagName === 'TEXTAREA' && !el.readOnly) {\n return true;\n }\n\n if (el.isContentEditable) {\n return true;\n }\n\n return false;\n }\n\n /**\n * Add the `focus-visible` class to the given element if it was not added by\n * the author.\n * @param {Element} el\n */\n function addFocusVisibleClass(el) {\n if (el.classList.contains('focus-visible')) {\n return;\n }\n el.classList.add('focus-visible');\n el.setAttribute('data-focus-visible-added', '');\n }\n\n /**\n * Remove the `focus-visible` class from the given element if it was not\n * originally added by the author.\n * @param {Element} el\n */\n function removeFocusVisibleClass(el) {\n if (!el.hasAttribute('data-focus-visible-added')) {\n return;\n }\n el.classList.remove('focus-visible');\n el.removeAttribute('data-focus-visible-added');\n }\n\n /**\n * If the most recent user interaction was via the keyboard;\n * and the key press did not include a meta, alt/option, or control key;\n * then the modality is keyboard. Otherwise, the modality is not keyboard.\n * Apply `focus-visible` to any current active element and keep track\n * of our keyboard modality state with `hadKeyboardEvent`.\n * @param {KeyboardEvent} e\n */\n function onKeyDown(e) {\n if (e.metaKey || e.altKey || e.ctrlKey) {\n return;\n }\n\n if (isValidFocusTarget(scope.activeElement)) {\n addFocusVisibleClass(scope.activeElement);\n }\n\n hadKeyboardEvent = true;\n }\n\n /**\n * If at any point a user clicks with a pointing device, ensure that we change\n * the modality away from keyboard.\n * This avoids the situation where a user presses a key on an already focused\n * element, and then clicks on a different element, focusing it with a\n * pointing device, while we still think we're in keyboard modality.\n * @param {Event} e\n */\n function onPointerDown(e) {\n hadKeyboardEvent = false;\n }\n\n /**\n * On `focus`, add the `focus-visible` class to the target if:\n * - the target received focus as a result of keyboard navigation, or\n * - the event target is an element that will likely require interaction\n * via the keyboard (e.g. a text box)\n * @param {Event} e\n */\n function onFocus(e) {\n // Prevent IE from focusing the document or HTML element.\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (hadKeyboardEvent || focusTriggersKeyboardModality(e.target)) {\n addFocusVisibleClass(e.target);\n }\n }\n\n /**\n * On `blur`, remove the `focus-visible` class from the target.\n * @param {Event} e\n */\n function onBlur(e) {\n if (!isValidFocusTarget(e.target)) {\n return;\n }\n\n if (\n e.target.classList.contains('focus-visible') ||\n e.target.hasAttribute('data-focus-visible-added')\n ) {\n // To detect a tab/window switch, we look for a blur event followed\n // rapidly by a visibility change.\n // If we don't see a visibility change within 100ms, it's probably a\n // regular focus change.\n hadFocusVisibleRecently = true;\n window.clearTimeout(hadFocusVisibleRecentlyTimeout);\n hadFocusVisibleRecentlyTimeout = window.setTimeout(function() {\n hadFocusVisibleRecently = false;\n }, 100);\n removeFocusVisibleClass(e.target);\n }\n }\n\n /**\n * If the user changes tabs, keep track of whether or not the previously\n * focused element had .focus-visible.\n * @param {Event} e\n */\n function onVisibilityChange(e) {\n if (document.visibilityState === 'hidden') {\n // If the tab becomes active again, the browser will handle calling focus\n // on the element (Safari actually calls it twice).\n // If this tab change caused a blur on an element with focus-visible,\n // re-apply the class when the user switches back to the tab.\n if (hadFocusVisibleRecently) {\n hadKeyboardEvent = true;\n }\n addInitialPointerMoveListeners();\n }\n }\n\n /**\n * Add a group of listeners to detect usage of any pointing devices.\n * These listeners will be added when the polyfill first loads, and anytime\n * the window is blurred, so that they are active when the window regains\n * focus.\n */\n function addInitialPointerMoveListeners() {\n document.addEventListener('mousemove', onInitialPointerMove);\n document.addEventListener('mousedown', onInitialPointerMove);\n document.addEventListener('mouseup', onInitialPointerMove);\n document.addEventListener('pointermove', onInitialPointerMove);\n document.addEventListener('pointerdown', onInitialPointerMove);\n document.addEventListener('pointerup', onInitialPointerMove);\n document.addEventListener('touchmove', onInitialPointerMove);\n document.addEventListener('touchstart', onInitialPointerMove);\n document.addEventListener('touchend', onInitialPointerMove);\n }\n\n function removeInitialPointerMoveListeners() {\n document.removeEventListener('mousemove', onInitialPointerMove);\n document.removeEventListener('mousedown', onInitialPointerMove);\n document.removeEventListener('mouseup', onInitialPointerMove);\n document.removeEventListener('pointermove', onInitialPointerMove);\n document.removeEventListener('pointerdown', onInitialPointerMove);\n document.removeEventListener('pointerup', onInitialPointerMove);\n document.removeEventListener('touchmove', onInitialPointerMove);\n document.removeEventListener('touchstart', onInitialPointerMove);\n document.removeEventListener('touchend', onInitialPointerMove);\n }\n\n /**\n * When the polfyill first loads, assume the user is in keyboard modality.\n * If any event is received from a pointing device (e.g. mouse, pointer,\n * touch), turn off keyboard modality.\n * This accounts for situations where focus enters the page from the URL bar.\n * @param {Event} e\n */\n function onInitialPointerMove(e) {\n // Work around a Safari quirk that fires a mousemove on whenever the\n // window blurs, even if you're tabbing out of the page. \u00AF\\_(\u30C4)_/\u00AF\n if (e.target.nodeName && e.target.nodeName.toLowerCase() === 'html') {\n return;\n }\n\n hadKeyboardEvent = false;\n removeInitialPointerMoveListeners();\n }\n\n // For some kinds of state, we are interested in changes at the global scope\n // only. For example, global pointer input, global key presses and global\n // visibility change should affect the state at every scope:\n document.addEventListener('keydown', onKeyDown, true);\n document.addEventListener('mousedown', onPointerDown, true);\n document.addEventListener('pointerdown', onPointerDown, true);\n document.addEventListener('touchstart', onPointerDown, true);\n document.addEventListener('visibilitychange', onVisibilityChange, true);\n\n addInitialPointerMoveListeners();\n\n // For focus and blur, we specifically care about state changes in the local\n // scope. This is because focus / blur events that originate from within a\n // shadow root are not re-dispatched from the host element if it was already\n // the active element in its own scope:\n scope.addEventListener('focus', onFocus, true);\n scope.addEventListener('blur', onBlur, true);\n\n // We detect that a node is a ShadowRoot by ensuring that it is a\n // DocumentFragment and also has a host property. This check covers native\n // implementation and polyfill implementation transparently. If we only cared\n // about the native implementation, we could just check if the scope was\n // an instance of a ShadowRoot.\n if (scope.nodeType === Node.DOCUMENT_FRAGMENT_NODE && scope.host) {\n // Since a ShadowRoot is a special kind of DocumentFragment, it does not\n // have a root element to add a class to. So, we add this attribute to the\n // host element instead:\n scope.host.setAttribute('data-js-focus-visible', '');\n } else if (scope.nodeType === Node.DOCUMENT_NODE) {\n document.documentElement.classList.add('js-focus-visible');\n document.documentElement.setAttribute('data-js-focus-visible', '');\n }\n }\n\n // It is important to wrap all references to global window and document in\n // these checks to support server-side rendering use cases\n // @see https://github.com/WICG/focus-visible/issues/199\n if (typeof window !== 'undefined' && typeof document !== 'undefined') {\n // Make the polyfill helper globally available. This can be used as a signal\n // to interested libraries that wish to coordinate with the polyfill for e.g.,\n // applying the polyfill to a shadow root:\n window.applyFocusVisiblePolyfill = applyFocusVisiblePolyfill;\n\n // Notify interested libraries of the polyfill's presence, in case the\n // polyfill was loaded lazily:\n var event;\n\n try {\n event = new CustomEvent('focus-visible-polyfill-ready');\n } catch (error) {\n // IE11 does not support using CustomEvent as a constructor directly:\n event = document.createEvent('CustomEvent');\n event.initCustomEvent('focus-visible-polyfill-ready', false, false, {});\n }\n\n window.dispatchEvent(event);\n }\n\n if (typeof document !== 'undefined') {\n // Apply the polyfill to the global document, so that no JavaScript\n // coordination is required to use the polyfill in the top-level document:\n applyFocusVisiblePolyfill(document);\n }\n\n})));\n", "/*!\n * escape-html\n * Copyright(c) 2012-2013 TJ Holowaychuk\n * Copyright(c) 2015 Andreas Lubbe\n * Copyright(c) 2015 Tiancheng \"Timothy\" Gu\n * MIT Licensed\n */\n\n'use strict';\n\n/**\n * Module variables.\n * @private\n */\n\nvar matchHtmlRegExp = /[\"'&<>]/;\n\n/**\n * Module exports.\n * @public\n */\n\nmodule.exports = escapeHtml;\n\n/**\n * Escape special characters in the given string of html.\n *\n * @param {string} string The string to escape for inserting into HTML\n * @return {string}\n * @public\n */\n\nfunction escapeHtml(string) {\n var str = '' + string;\n var match = matchHtmlRegExp.exec(str);\n\n if (!match) {\n return str;\n }\n\n var escape;\n var html = '';\n var index = 0;\n var lastIndex = 0;\n\n for (index = match.index; index < str.length; index++) {\n switch (str.charCodeAt(index)) {\n case 34: // \"\n escape = '"';\n break;\n case 38: // &\n escape = '&';\n break;\n case 39: // '\n escape = ''';\n break;\n case 60: // <\n escape = '<';\n break;\n case 62: // >\n escape = '>';\n break;\n default:\n continue;\n }\n\n if (lastIndex !== index) {\n html += str.substring(lastIndex, index);\n }\n\n lastIndex = index + 1;\n html += escape;\n }\n\n return lastIndex !== index\n ? html + str.substring(lastIndex, index)\n : html;\n}\n", "/*!\n * clipboard.js v2.0.11\n * https://clipboardjs.com/\n *\n * Licensed MIT \u00A9 Zeno Rocha\n */\n(function webpackUniversalModuleDefinition(root, factory) {\n\tif(typeof exports === 'object' && typeof module === 'object')\n\t\tmodule.exports = factory();\n\telse if(typeof define === 'function' && define.amd)\n\t\tdefine([], factory);\n\telse if(typeof exports === 'object')\n\t\texports[\"ClipboardJS\"] = factory();\n\telse\n\t\troot[\"ClipboardJS\"] = factory();\n})(this, function() {\nreturn /******/ (function() { // webpackBootstrap\n/******/ \tvar __webpack_modules__ = ({\n\n/***/ 686:\n/***/ (function(__unused_webpack_module, __webpack_exports__, __webpack_require__) {\n\n\"use strict\";\n\n// EXPORTS\n__webpack_require__.d(__webpack_exports__, {\n \"default\": function() { return /* binding */ clipboard; }\n});\n\n// EXTERNAL MODULE: ./node_modules/tiny-emitter/index.js\nvar tiny_emitter = __webpack_require__(279);\nvar tiny_emitter_default = /*#__PURE__*/__webpack_require__.n(tiny_emitter);\n// EXTERNAL MODULE: ./node_modules/good-listener/src/listen.js\nvar listen = __webpack_require__(370);\nvar listen_default = /*#__PURE__*/__webpack_require__.n(listen);\n// EXTERNAL MODULE: ./node_modules/select/src/select.js\nvar src_select = __webpack_require__(817);\nvar select_default = /*#__PURE__*/__webpack_require__.n(src_select);\n;// CONCATENATED MODULE: ./src/common/command.js\n/**\n * Executes a given operation type.\n * @param {String} type\n * @return {Boolean}\n */\nfunction command(type) {\n try {\n return document.execCommand(type);\n } catch (err) {\n return false;\n }\n}\n;// CONCATENATED MODULE: ./src/actions/cut.js\n\n\n/**\n * Cut action wrapper.\n * @param {String|HTMLElement} target\n * @return {String}\n */\n\nvar ClipboardActionCut = function ClipboardActionCut(target) {\n var selectedText = select_default()(target);\n command('cut');\n return selectedText;\n};\n\n/* harmony default export */ var actions_cut = (ClipboardActionCut);\n;// CONCATENATED MODULE: ./src/common/create-fake-element.js\n/**\n * Creates a fake textarea element with a value.\n * @param {String} value\n * @return {HTMLElement}\n */\nfunction createFakeElement(value) {\n var isRTL = document.documentElement.getAttribute('dir') === 'rtl';\n var fakeElement = document.createElement('textarea'); // Prevent zooming on iOS\n\n fakeElement.style.fontSize = '12pt'; // Reset box model\n\n fakeElement.style.border = '0';\n fakeElement.style.padding = '0';\n fakeElement.style.margin = '0'; // Move element out of screen horizontally\n\n fakeElement.style.position = 'absolute';\n fakeElement.style[isRTL ? 'right' : 'left'] = '-9999px'; // Move element to the same position vertically\n\n var yPosition = window.pageYOffset || document.documentElement.scrollTop;\n fakeElement.style.top = \"\".concat(yPosition, \"px\");\n fakeElement.setAttribute('readonly', '');\n fakeElement.value = value;\n return fakeElement;\n}\n;// CONCATENATED MODULE: ./src/actions/copy.js\n\n\n\n/**\n * Create fake copy action wrapper using a fake element.\n * @param {String} target\n * @param {Object} options\n * @return {String}\n */\n\nvar fakeCopyAction = function fakeCopyAction(value, options) {\n var fakeElement = createFakeElement(value);\n options.container.appendChild(fakeElement);\n var selectedText = select_default()(fakeElement);\n command('copy');\n fakeElement.remove();\n return selectedText;\n};\n/**\n * Copy action wrapper.\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @return {String}\n */\n\n\nvar ClipboardActionCopy = function ClipboardActionCopy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n var selectedText = '';\n\n if (typeof target === 'string') {\n selectedText = fakeCopyAction(target, options);\n } else if (target instanceof HTMLInputElement && !['text', 'search', 'url', 'tel', 'password'].includes(target === null || target === void 0 ? void 0 : target.type)) {\n // If input type doesn't support `setSelectionRange`. Simulate it. https://developer.mozilla.org/en-US/docs/Web/API/HTMLInputElement/setSelectionRange\n selectedText = fakeCopyAction(target.value, options);\n } else {\n selectedText = select_default()(target);\n command('copy');\n }\n\n return selectedText;\n};\n\n/* harmony default export */ var actions_copy = (ClipboardActionCopy);\n;// CONCATENATED MODULE: ./src/actions/default.js\nfunction _typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { _typeof = function _typeof(obj) { return typeof obj; }; } else { _typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return _typeof(obj); }\n\n\n\n/**\n * Inner function which performs selection from either `text` or `target`\n * properties and then executes copy or cut operations.\n * @param {Object} options\n */\n\nvar ClipboardActionDefault = function ClipboardActionDefault() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n // Defines base properties passed from constructor.\n var _options$action = options.action,\n action = _options$action === void 0 ? 'copy' : _options$action,\n container = options.container,\n target = options.target,\n text = options.text; // Sets the `action` to be performed which can be either 'copy' or 'cut'.\n\n if (action !== 'copy' && action !== 'cut') {\n throw new Error('Invalid \"action\" value, use either \"copy\" or \"cut\"');\n } // Sets the `target` property using an element that will be have its content copied.\n\n\n if (target !== undefined) {\n if (target && _typeof(target) === 'object' && target.nodeType === 1) {\n if (action === 'copy' && target.hasAttribute('disabled')) {\n throw new Error('Invalid \"target\" attribute. Please use \"readonly\" instead of \"disabled\" attribute');\n }\n\n if (action === 'cut' && (target.hasAttribute('readonly') || target.hasAttribute('disabled'))) {\n throw new Error('Invalid \"target\" attribute. You can\\'t cut text from elements with \"readonly\" or \"disabled\" attributes');\n }\n } else {\n throw new Error('Invalid \"target\" value, use a valid Element');\n }\n } // Define selection strategy based on `text` property.\n\n\n if (text) {\n return actions_copy(text, {\n container: container\n });\n } // Defines which selection strategy based on `target` property.\n\n\n if (target) {\n return action === 'cut' ? actions_cut(target) : actions_copy(target, {\n container: container\n });\n }\n};\n\n/* harmony default export */ var actions_default = (ClipboardActionDefault);\n;// CONCATENATED MODULE: ./src/clipboard.js\nfunction clipboard_typeof(obj) { \"@babel/helpers - typeof\"; if (typeof Symbol === \"function\" && typeof Symbol.iterator === \"symbol\") { clipboard_typeof = function _typeof(obj) { return typeof obj; }; } else { clipboard_typeof = function _typeof(obj) { return obj && typeof Symbol === \"function\" && obj.constructor === Symbol && obj !== Symbol.prototype ? \"symbol\" : typeof obj; }; } return clipboard_typeof(obj); }\n\nfunction _classCallCheck(instance, Constructor) { if (!(instance instanceof Constructor)) { throw new TypeError(\"Cannot call a class as a function\"); } }\n\nfunction _defineProperties(target, props) { for (var i = 0; i < props.length; i++) { var descriptor = props[i]; descriptor.enumerable = descriptor.enumerable || false; descriptor.configurable = true; if (\"value\" in descriptor) descriptor.writable = true; Object.defineProperty(target, descriptor.key, descriptor); } }\n\nfunction _createClass(Constructor, protoProps, staticProps) { if (protoProps) _defineProperties(Constructor.prototype, protoProps); if (staticProps) _defineProperties(Constructor, staticProps); return Constructor; }\n\nfunction _inherits(subClass, superClass) { if (typeof superClass !== \"function\" && superClass !== null) { throw new TypeError(\"Super expression must either be null or a function\"); } subClass.prototype = Object.create(superClass && superClass.prototype, { constructor: { value: subClass, writable: true, configurable: true } }); if (superClass) _setPrototypeOf(subClass, superClass); }\n\nfunction _setPrototypeOf(o, p) { _setPrototypeOf = Object.setPrototypeOf || function _setPrototypeOf(o, p) { o.__proto__ = p; return o; }; return _setPrototypeOf(o, p); }\n\nfunction _createSuper(Derived) { var hasNativeReflectConstruct = _isNativeReflectConstruct(); return function _createSuperInternal() { var Super = _getPrototypeOf(Derived), result; if (hasNativeReflectConstruct) { var NewTarget = _getPrototypeOf(this).constructor; result = Reflect.construct(Super, arguments, NewTarget); } else { result = Super.apply(this, arguments); } return _possibleConstructorReturn(this, result); }; }\n\nfunction _possibleConstructorReturn(self, call) { if (call && (clipboard_typeof(call) === \"object\" || typeof call === \"function\")) { return call; } return _assertThisInitialized(self); }\n\nfunction _assertThisInitialized(self) { if (self === void 0) { throw new ReferenceError(\"this hasn't been initialised - super() hasn't been called\"); } return self; }\n\nfunction _isNativeReflectConstruct() { if (typeof Reflect === \"undefined\" || !Reflect.construct) return false; if (Reflect.construct.sham) return false; if (typeof Proxy === \"function\") return true; try { Date.prototype.toString.call(Reflect.construct(Date, [], function () {})); return true; } catch (e) { return false; } }\n\nfunction _getPrototypeOf(o) { _getPrototypeOf = Object.setPrototypeOf ? Object.getPrototypeOf : function _getPrototypeOf(o) { return o.__proto__ || Object.getPrototypeOf(o); }; return _getPrototypeOf(o); }\n\n\n\n\n\n\n/**\n * Helper function to retrieve attribute value.\n * @param {String} suffix\n * @param {Element} element\n */\n\nfunction getAttributeValue(suffix, element) {\n var attribute = \"data-clipboard-\".concat(suffix);\n\n if (!element.hasAttribute(attribute)) {\n return;\n }\n\n return element.getAttribute(attribute);\n}\n/**\n * Base class which takes one or more elements, adds event listeners to them,\n * and instantiates a new `ClipboardAction` on each click.\n */\n\n\nvar Clipboard = /*#__PURE__*/function (_Emitter) {\n _inherits(Clipboard, _Emitter);\n\n var _super = _createSuper(Clipboard);\n\n /**\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n * @param {Object} options\n */\n function Clipboard(trigger, options) {\n var _this;\n\n _classCallCheck(this, Clipboard);\n\n _this = _super.call(this);\n\n _this.resolveOptions(options);\n\n _this.listenClick(trigger);\n\n return _this;\n }\n /**\n * Defines if attributes would be resolved using internal setter functions\n * or custom functions that were passed in the constructor.\n * @param {Object} options\n */\n\n\n _createClass(Clipboard, [{\n key: \"resolveOptions\",\n value: function resolveOptions() {\n var options = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : {};\n this.action = typeof options.action === 'function' ? options.action : this.defaultAction;\n this.target = typeof options.target === 'function' ? options.target : this.defaultTarget;\n this.text = typeof options.text === 'function' ? options.text : this.defaultText;\n this.container = clipboard_typeof(options.container) === 'object' ? options.container : document.body;\n }\n /**\n * Adds a click event listener to the passed trigger.\n * @param {String|HTMLElement|HTMLCollection|NodeList} trigger\n */\n\n }, {\n key: \"listenClick\",\n value: function listenClick(trigger) {\n var _this2 = this;\n\n this.listener = listen_default()(trigger, 'click', function (e) {\n return _this2.onClick(e);\n });\n }\n /**\n * Defines a new `ClipboardAction` on each click event.\n * @param {Event} e\n */\n\n }, {\n key: \"onClick\",\n value: function onClick(e) {\n var trigger = e.delegateTarget || e.currentTarget;\n var action = this.action(trigger) || 'copy';\n var text = actions_default({\n action: action,\n container: this.container,\n target: this.target(trigger),\n text: this.text(trigger)\n }); // Fires an event based on the copy operation result.\n\n this.emit(text ? 'success' : 'error', {\n action: action,\n text: text,\n trigger: trigger,\n clearSelection: function clearSelection() {\n if (trigger) {\n trigger.focus();\n }\n\n window.getSelection().removeAllRanges();\n }\n });\n }\n /**\n * Default `action` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultAction\",\n value: function defaultAction(trigger) {\n return getAttributeValue('action', trigger);\n }\n /**\n * Default `target` lookup function.\n * @param {Element} trigger\n */\n\n }, {\n key: \"defaultTarget\",\n value: function defaultTarget(trigger) {\n var selector = getAttributeValue('target', trigger);\n\n if (selector) {\n return document.querySelector(selector);\n }\n }\n /**\n * Allow fire programmatically a copy action\n * @param {String|HTMLElement} target\n * @param {Object} options\n * @returns Text copied.\n */\n\n }, {\n key: \"defaultText\",\n\n /**\n * Default `text` lookup function.\n * @param {Element} trigger\n */\n value: function defaultText(trigger) {\n return getAttributeValue('text', trigger);\n }\n /**\n * Destroy lifecycle.\n */\n\n }, {\n key: \"destroy\",\n value: function destroy() {\n this.listener.destroy();\n }\n }], [{\n key: \"copy\",\n value: function copy(target) {\n var options = arguments.length > 1 && arguments[1] !== undefined ? arguments[1] : {\n container: document.body\n };\n return actions_copy(target, options);\n }\n /**\n * Allow fire programmatically a cut action\n * @param {String|HTMLElement} target\n * @returns Text cutted.\n */\n\n }, {\n key: \"cut\",\n value: function cut(target) {\n return actions_cut(target);\n }\n /**\n * Returns the support of the given action, or all actions if no action is\n * given.\n * @param {String} [action]\n */\n\n }, {\n key: \"isSupported\",\n value: function isSupported() {\n var action = arguments.length > 0 && arguments[0] !== undefined ? arguments[0] : ['copy', 'cut'];\n var actions = typeof action === 'string' ? [action] : action;\n var support = !!document.queryCommandSupported;\n actions.forEach(function (action) {\n support = support && !!document.queryCommandSupported(action);\n });\n return support;\n }\n }]);\n\n return Clipboard;\n}((tiny_emitter_default()));\n\n/* harmony default export */ var clipboard = (Clipboard);\n\n/***/ }),\n\n/***/ 828:\n/***/ (function(module) {\n\nvar DOCUMENT_NODE_TYPE = 9;\n\n/**\n * A polyfill for Element.matches()\n */\nif (typeof Element !== 'undefined' && !Element.prototype.matches) {\n var proto = Element.prototype;\n\n proto.matches = proto.matchesSelector ||\n proto.mozMatchesSelector ||\n proto.msMatchesSelector ||\n proto.oMatchesSelector ||\n proto.webkitMatchesSelector;\n}\n\n/**\n * Finds the closest parent that matches a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @return {Function}\n */\nfunction closest (element, selector) {\n while (element && element.nodeType !== DOCUMENT_NODE_TYPE) {\n if (typeof element.matches === 'function' &&\n element.matches(selector)) {\n return element;\n }\n element = element.parentNode;\n }\n}\n\nmodule.exports = closest;\n\n\n/***/ }),\n\n/***/ 438:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar closest = __webpack_require__(828);\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction _delegate(element, selector, type, callback, useCapture) {\n var listenerFn = listener.apply(this, arguments);\n\n element.addEventListener(type, listenerFn, useCapture);\n\n return {\n destroy: function() {\n element.removeEventListener(type, listenerFn, useCapture);\n }\n }\n}\n\n/**\n * Delegates event to a selector.\n *\n * @param {Element|String|Array} [elements]\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @param {Boolean} useCapture\n * @return {Object}\n */\nfunction delegate(elements, selector, type, callback, useCapture) {\n // Handle the regular Element usage\n if (typeof elements.addEventListener === 'function') {\n return _delegate.apply(null, arguments);\n }\n\n // Handle Element-less usage, it defaults to global delegation\n if (typeof type === 'function') {\n // Use `document` as the first parameter, then apply arguments\n // This is a short way to .unshift `arguments` without running into deoptimizations\n return _delegate.bind(null, document).apply(null, arguments);\n }\n\n // Handle Selector-based usage\n if (typeof elements === 'string') {\n elements = document.querySelectorAll(elements);\n }\n\n // Handle Array-like based usage\n return Array.prototype.map.call(elements, function (element) {\n return _delegate(element, selector, type, callback, useCapture);\n });\n}\n\n/**\n * Finds closest match and invokes callback.\n *\n * @param {Element} element\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Function}\n */\nfunction listener(element, selector, type, callback) {\n return function(e) {\n e.delegateTarget = closest(e.target, selector);\n\n if (e.delegateTarget) {\n callback.call(element, e);\n }\n }\n}\n\nmodule.exports = delegate;\n\n\n/***/ }),\n\n/***/ 879:\n/***/ (function(__unused_webpack_module, exports) {\n\n/**\n * Check if argument is a HTML element.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.node = function(value) {\n return value !== undefined\n && value instanceof HTMLElement\n && value.nodeType === 1;\n};\n\n/**\n * Check if argument is a list of HTML elements.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.nodeList = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return value !== undefined\n && (type === '[object NodeList]' || type === '[object HTMLCollection]')\n && ('length' in value)\n && (value.length === 0 || exports.node(value[0]));\n};\n\n/**\n * Check if argument is a string.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.string = function(value) {\n return typeof value === 'string'\n || value instanceof String;\n};\n\n/**\n * Check if argument is a function.\n *\n * @param {Object} value\n * @return {Boolean}\n */\nexports.fn = function(value) {\n var type = Object.prototype.toString.call(value);\n\n return type === '[object Function]';\n};\n\n\n/***/ }),\n\n/***/ 370:\n/***/ (function(module, __unused_webpack_exports, __webpack_require__) {\n\nvar is = __webpack_require__(879);\nvar delegate = __webpack_require__(438);\n\n/**\n * Validates all params and calls the right\n * listener function based on its target type.\n *\n * @param {String|HTMLElement|HTMLCollection|NodeList} target\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listen(target, type, callback) {\n if (!target && !type && !callback) {\n throw new Error('Missing required arguments');\n }\n\n if (!is.string(type)) {\n throw new TypeError('Second argument must be a String');\n }\n\n if (!is.fn(callback)) {\n throw new TypeError('Third argument must be a Function');\n }\n\n if (is.node(target)) {\n return listenNode(target, type, callback);\n }\n else if (is.nodeList(target)) {\n return listenNodeList(target, type, callback);\n }\n else if (is.string(target)) {\n return listenSelector(target, type, callback);\n }\n else {\n throw new TypeError('First argument must be a String, HTMLElement, HTMLCollection, or NodeList');\n }\n}\n\n/**\n * Adds an event listener to a HTML element\n * and returns a remove listener function.\n *\n * @param {HTMLElement} node\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNode(node, type, callback) {\n node.addEventListener(type, callback);\n\n return {\n destroy: function() {\n node.removeEventListener(type, callback);\n }\n }\n}\n\n/**\n * Add an event listener to a list of HTML elements\n * and returns a remove listener function.\n *\n * @param {NodeList|HTMLCollection} nodeList\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenNodeList(nodeList, type, callback) {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.addEventListener(type, callback);\n });\n\n return {\n destroy: function() {\n Array.prototype.forEach.call(nodeList, function(node) {\n node.removeEventListener(type, callback);\n });\n }\n }\n}\n\n/**\n * Add an event listener to a selector\n * and returns a remove listener function.\n *\n * @param {String} selector\n * @param {String} type\n * @param {Function} callback\n * @return {Object}\n */\nfunction listenSelector(selector, type, callback) {\n return delegate(document.body, selector, type, callback);\n}\n\nmodule.exports = listen;\n\n\n/***/ }),\n\n/***/ 817:\n/***/ (function(module) {\n\nfunction select(element) {\n var selectedText;\n\n if (element.nodeName === 'SELECT') {\n element.focus();\n\n selectedText = element.value;\n }\n else if (element.nodeName === 'INPUT' || element.nodeName === 'TEXTAREA') {\n var isReadOnly = element.hasAttribute('readonly');\n\n if (!isReadOnly) {\n element.setAttribute('readonly', '');\n }\n\n element.select();\n element.setSelectionRange(0, element.value.length);\n\n if (!isReadOnly) {\n element.removeAttribute('readonly');\n }\n\n selectedText = element.value;\n }\n else {\n if (element.hasAttribute('contenteditable')) {\n element.focus();\n }\n\n var selection = window.getSelection();\n var range = document.createRange();\n\n range.selectNodeContents(element);\n selection.removeAllRanges();\n selection.addRange(range);\n\n selectedText = selection.toString();\n }\n\n return selectedText;\n}\n\nmodule.exports = select;\n\n\n/***/ }),\n\n/***/ 279:\n/***/ (function(module) {\n\nfunction E () {\n // Keep this empty so it's easier to inherit from\n // (via https://github.com/lipsmack from https://github.com/scottcorgan/tiny-emitter/issues/3)\n}\n\nE.prototype = {\n on: function (name, callback, ctx) {\n var e = this.e || (this.e = {});\n\n (e[name] || (e[name] = [])).push({\n fn: callback,\n ctx: ctx\n });\n\n return this;\n },\n\n once: function (name, callback, ctx) {\n var self = this;\n function listener () {\n self.off(name, listener);\n callback.apply(ctx, arguments);\n };\n\n listener._ = callback\n return this.on(name, listener, ctx);\n },\n\n emit: function (name) {\n var data = [].slice.call(arguments, 1);\n var evtArr = ((this.e || (this.e = {}))[name] || []).slice();\n var i = 0;\n var len = evtArr.length;\n\n for (i; i < len; i++) {\n evtArr[i].fn.apply(evtArr[i].ctx, data);\n }\n\n return this;\n },\n\n off: function (name, callback) {\n var e = this.e || (this.e = {});\n var evts = e[name];\n var liveEvents = [];\n\n if (evts && callback) {\n for (var i = 0, len = evts.length; i < len; i++) {\n if (evts[i].fn !== callback && evts[i].fn._ !== callback)\n liveEvents.push(evts[i]);\n }\n }\n\n // Remove event from queue to prevent memory leak\n // Suggested by https://github.com/lazd\n // Ref: https://github.com/scottcorgan/tiny-emitter/commit/c6ebfaa9bc973b33d110a84a307742b7cf94c953#commitcomment-5024910\n\n (liveEvents.length)\n ? e[name] = liveEvents\n : delete e[name];\n\n return this;\n }\n};\n\nmodule.exports = E;\nmodule.exports.TinyEmitter = E;\n\n\n/***/ })\n\n/******/ \t});\n/************************************************************************/\n/******/ \t// The module cache\n/******/ \tvar __webpack_module_cache__ = {};\n/******/ \t\n/******/ \t// The require function\n/******/ \tfunction __webpack_require__(moduleId) {\n/******/ \t\t// Check if module is in cache\n/******/ \t\tif(__webpack_module_cache__[moduleId]) {\n/******/ \t\t\treturn __webpack_module_cache__[moduleId].exports;\n/******/ \t\t}\n/******/ \t\t// Create a new module (and put it into the cache)\n/******/ \t\tvar module = __webpack_module_cache__[moduleId] = {\n/******/ \t\t\t// no module.id needed\n/******/ \t\t\t// no module.loaded needed\n/******/ \t\t\texports: {}\n/******/ \t\t};\n/******/ \t\n/******/ \t\t// Execute the module function\n/******/ \t\t__webpack_modules__[moduleId](module, module.exports, __webpack_require__);\n/******/ \t\n/******/ \t\t// Return the exports of the module\n/******/ \t\treturn module.exports;\n/******/ \t}\n/******/ \t\n/************************************************************************/\n/******/ \t/* webpack/runtime/compat get default export */\n/******/ \t!function() {\n/******/ \t\t// getDefaultExport function for compatibility with non-harmony modules\n/******/ \t\t__webpack_require__.n = function(module) {\n/******/ \t\t\tvar getter = module && module.__esModule ?\n/******/ \t\t\t\tfunction() { return module['default']; } :\n/******/ \t\t\t\tfunction() { return module; };\n/******/ \t\t\t__webpack_require__.d(getter, { a: getter });\n/******/ \t\t\treturn getter;\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/define property getters */\n/******/ \t!function() {\n/******/ \t\t// define getter functions for harmony exports\n/******/ \t\t__webpack_require__.d = function(exports, definition) {\n/******/ \t\t\tfor(var key in definition) {\n/******/ \t\t\t\tif(__webpack_require__.o(definition, key) && !__webpack_require__.o(exports, key)) {\n/******/ \t\t\t\t\tObject.defineProperty(exports, key, { enumerable: true, get: definition[key] });\n/******/ \t\t\t\t}\n/******/ \t\t\t}\n/******/ \t\t};\n/******/ \t}();\n/******/ \t\n/******/ \t/* webpack/runtime/hasOwnProperty shorthand */\n/******/ \t!function() {\n/******/ \t\t__webpack_require__.o = function(obj, prop) { return Object.prototype.hasOwnProperty.call(obj, prop); }\n/******/ \t}();\n/******/ \t\n/************************************************************************/\n/******/ \t// module exports must be returned from runtime so entry inlining is disabled\n/******/ \t// startup\n/******/ \t// Load entry module and return exports\n/******/ \treturn __webpack_require__(686);\n/******/ })()\n.default;\n});", "/*\n * Copyright (c) 2016-2024 Martin Donath \n *\n * Permission is hereby granted, free of charge, to any person obtaining a copy\n * of this software and associated documentation files (the \"Software\"), to\n * deal in the Software without restriction, including without limitation the\n * rights to use, copy, modify, merge, publish, distribute, sublicense, and/or\n * sell copies of the Software, and to permit persons to whom the Software is\n * furnished to do so, subject to the following conditions:\n *\n * The above copyright notice and this permission notice shall be included in\n * all copies or substantial portions of the Software.\n *\n * THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR\n * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,\n * FITNESS FOR A PARTICULAR PURPOSE AND NON-INFRINGEMENT. IN NO EVENT SHALL THE\n * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER\n * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING\n * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS\n * IN THE SOFTWARE.\n */\n\nimport \"focus-visible\"\n\nimport {\n EMPTY,\n NEVER,\n Observable,\n Subject,\n defer,\n delay,\n filter,\n map,\n merge,\n mergeWith,\n shareReplay,\n switchMap\n} from \"rxjs\"\n\nimport { configuration, feature } from \"./_\"\nimport {\n at,\n getActiveElement,\n getOptionalElement,\n requestJSON,\n setLocation,\n setToggle,\n watchDocument,\n watchKeyboard,\n watchLocation,\n watchLocationTarget,\n watchMedia,\n watchPrint,\n watchScript,\n watchViewport\n} from \"./browser\"\nimport {\n getComponentElement,\n getComponentElements,\n mountAnnounce,\n mountBackToTop,\n mountConsent,\n mountContent,\n mountDialog,\n mountHeader,\n mountHeaderTitle,\n mountPalette,\n mountProgress,\n mountSearch,\n mountSearchHiglight,\n mountSidebar,\n mountSource,\n mountTableOfContents,\n mountTabs,\n watchHeader,\n watchMain\n} from \"./components\"\nimport {\n SearchIndex,\n setupClipboardJS,\n setupInstantNavigation,\n setupVersionSelector\n} from \"./integrations\"\nimport {\n patchEllipsis,\n patchIndeterminate,\n patchScrollfix,\n patchScrolllock\n} from \"./patches\"\nimport \"./polyfills\"\n\n/* ----------------------------------------------------------------------------\n * Functions - @todo refactor\n * ------------------------------------------------------------------------- */\n\n/**\n * Fetch search index\n *\n * @returns Search index observable\n */\nfunction fetchSearchIndex(): Observable {\n if (location.protocol === \"file:\") {\n return watchScript(\n `${new URL(\"search/search_index.js\", config.base)}`\n )\n .pipe(\n // @ts-ignore - @todo fix typings\n map(() => __index),\n shareReplay(1)\n )\n } else {\n return requestJSON(\n new URL(\"search/search_index.json\", config.base)\n )\n }\n}\n\n/* ----------------------------------------------------------------------------\n * Application\n * ------------------------------------------------------------------------- */\n\n/* Yay, JavaScript is available */\ndocument.documentElement.classList.remove(\"no-js\")\ndocument.documentElement.classList.add(\"js\")\n\n/* Set up navigation observables and subjects */\nconst document$ = watchDocument()\nconst location$ = watchLocation()\nconst target$ = watchLocationTarget(location$)\nconst keyboard$ = watchKeyboard()\n\n/* Set up media observables */\nconst viewport$ = watchViewport()\nconst tablet$ = watchMedia(\"(min-width: 960px)\")\nconst screen$ = watchMedia(\"(min-width: 1220px)\")\nconst print$ = watchPrint()\n\n/* Retrieve search index, if search is enabled */\nconst config = configuration()\nconst index$ = document.forms.namedItem(\"search\")\n ? fetchSearchIndex()\n : NEVER\n\n/* Set up Clipboard.js integration */\nconst alert$ = new Subject()\nsetupClipboardJS({ alert$ })\n\n/* Set up progress indicator */\nconst progress$ = new Subject()\n\n/* Set up instant navigation, if enabled */\nif (feature(\"navigation.instant\"))\n setupInstantNavigation({ location$, viewport$, progress$ })\n .subscribe(document$)\n\n/* Set up version selector */\nif (config.version?.provider === \"mike\")\n setupVersionSelector({ document$ })\n\n/* Always close drawer and search on navigation */\nmerge(location$, target$)\n .pipe(\n delay(125)\n )\n .subscribe(() => {\n setToggle(\"drawer\", false)\n setToggle(\"search\", false)\n })\n\n/* Set up global keyboard handlers */\nkeyboard$\n .pipe(\n filter(({ mode }) => mode === \"global\")\n )\n .subscribe(key => {\n switch (key.type) {\n\n /* Go to previous page */\n case \"p\":\n case \",\":\n const prev = getOptionalElement(\"link[rel=prev]\")\n if (typeof prev !== \"undefined\")\n setLocation(prev)\n break\n\n /* Go to next page */\n case \"n\":\n case \".\":\n const next = getOptionalElement(\"link[rel=next]\")\n if (typeof next !== \"undefined\")\n setLocation(next)\n break\n\n /* Expand navigation, see https://bit.ly/3ZjG5io */\n case \"Enter\":\n const active = getActiveElement()\n if (active instanceof HTMLLabelElement)\n active.click()\n }\n })\n\n/* Set up patches */\npatchEllipsis({ viewport$, document$ })\npatchIndeterminate({ document$, tablet$ })\npatchScrollfix({ document$ })\npatchScrolllock({ viewport$, tablet$ })\n\n/* Set up header and main area observable */\nconst header$ = watchHeader(getComponentElement(\"header\"), { viewport$ })\nconst main$ = document$\n .pipe(\n map(() => getComponentElement(\"main\")),\n switchMap(el => watchMain(el, { viewport$, header$ })),\n shareReplay(1)\n )\n\n/* Set up control component observables */\nconst control$ = merge(\n\n /* Consent */\n ...getComponentElements(\"consent\")\n .map(el => mountConsent(el, { target$ })),\n\n /* Dialog */\n ...getComponentElements(\"dialog\")\n .map(el => mountDialog(el, { alert$ })),\n\n /* Header */\n ...getComponentElements(\"header\")\n .map(el => mountHeader(el, { viewport$, header$, main$ })),\n\n /* Color palette */\n ...getComponentElements(\"palette\")\n .map(el => mountPalette(el)),\n\n /* Progress bar */\n ...getComponentElements(\"progress\")\n .map(el => mountProgress(el, { progress$ })),\n\n /* Search */\n ...getComponentElements(\"search\")\n .map(el => mountSearch(el, { index$, keyboard$ })),\n\n /* Repository information */\n ...getComponentElements(\"source\")\n .map(el => mountSource(el))\n)\n\n/* Set up content component observables */\nconst content$ = defer(() => merge(\n\n /* Announcement bar */\n ...getComponentElements(\"announce\")\n .map(el => mountAnnounce(el)),\n\n /* Content */\n ...getComponentElements(\"content\")\n .map(el => mountContent(el, { viewport$, target$, print$ })),\n\n /* Search highlighting */\n ...getComponentElements(\"content\")\n .map(el => feature(\"search.highlight\")\n ? mountSearchHiglight(el, { index$, location$ })\n : EMPTY\n ),\n\n /* Header title */\n ...getComponentElements(\"header-title\")\n .map(el => mountHeaderTitle(el, { viewport$, header$ })),\n\n /* Sidebar */\n ...getComponentElements(\"sidebar\")\n .map(el => el.getAttribute(\"data-md-type\") === \"navigation\"\n ? at(screen$, () => mountSidebar(el, { viewport$, header$, main$ }))\n : at(tablet$, () => mountSidebar(el, { viewport$, header$, main$ }))\n ),\n\n /* Navigation tabs */\n ...getComponentElements(\"tabs\")\n .map(el => mountTabs(el, { viewport$, header$ })),\n\n /* Table of contents */\n ...getComponentElements(\"toc\")\n .map(el => mountTableOfContents(el, {\n viewport$, header$, main$, target$\n })),\n\n /* Back-to-top button */\n ...getComponentElements(\"top\")\n .map(el => mountBackToTop(el, { viewport$, header$, main$, target$ }))\n))\n\n/* Set up component observables */\nconst component$ = document$\n .pipe(\n switchMap(() => content$),\n mergeWith(control$),\n shareReplay(1)\n )\n\n/* Subscribe to all components */\ncomponent$.subscribe()\n\n/* ----------------------------------------------------------------------------\n * Exports\n * ------------------------------------------------------------------------- */\n\nwindow.document$ = document$ /* Document observable */\nwindow.location$ = location$ /* Location subject */\nwindow.target$ = target$ /* Location target observable */\nwindow.keyboard$ = keyboard$ /* Keyboard observable */\nwindow.viewport$ = viewport$ /* Viewport observable */\nwindow.tablet$ = tablet$ /* Media tablet observable */\nwindow.screen$ = screen$ /* Media screen observable */\nwindow.print$ = print$ /* Media print observable */\nwindow.alert$ = alert$ /* Alert subject */\nwindow.progress$ = progress$ /* Progress indicator subject */\nwindow.component$ = component$ /* Component observable */\n", "/******************************************************************************\nCopyright (c) Microsoft Corporation.\n\nPermission to use, copy, modify, and/or distribute this software for any\npurpose with or without fee is hereby granted.\n\nTHE SOFTWARE IS PROVIDED \"AS IS\" AND THE AUTHOR DISCLAIMS ALL WARRANTIES WITH\nREGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF MERCHANTABILITY\nAND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT,\nINDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM\nLOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, NEGLIGENCE OR\nOTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION WITH THE USE OR\nPERFORMANCE OF THIS SOFTWARE.\n***************************************************************************** */\n/* global Reflect, Promise, SuppressedError, Symbol, Iterator */\n\nvar extendStatics = function(d, b) {\n extendStatics = Object.setPrototypeOf ||\n ({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||\n function (d, b) { for (var p in b) if (Object.prototype.hasOwnProperty.call(b, p)) d[p] = b[p]; };\n return extendStatics(d, b);\n};\n\nexport function __extends(d, b) {\n if (typeof b !== \"function\" && b !== null)\n throw new TypeError(\"Class extends value \" + String(b) + \" is not a constructor or null\");\n extendStatics(d, b);\n function __() { this.constructor = d; }\n d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());\n}\n\nexport var __assign = function() {\n __assign = Object.assign || function __assign(t) {\n for (var s, i = 1, n = arguments.length; i < n; i++) {\n s = arguments[i];\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p)) t[p] = s[p];\n }\n return t;\n }\n return __assign.apply(this, arguments);\n}\n\nexport function __rest(s, e) {\n var t = {};\n for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)\n t[p] = s[p];\n if (s != null && typeof Object.getOwnPropertySymbols === \"function\")\n for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {\n if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))\n t[p[i]] = s[p[i]];\n }\n return t;\n}\n\nexport function __decorate(decorators, target, key, desc) {\n var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;\n if (typeof Reflect === \"object\" && typeof Reflect.decorate === \"function\") r = Reflect.decorate(decorators, target, key, desc);\n else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;\n return c > 3 && r && Object.defineProperty(target, key, r), r;\n}\n\nexport function __param(paramIndex, decorator) {\n return function (target, key) { decorator(target, key, paramIndex); }\n}\n\nexport function __esDecorate(ctor, descriptorIn, decorators, contextIn, initializers, extraInitializers) {\n function accept(f) { if (f !== void 0 && typeof f !== \"function\") throw new TypeError(\"Function expected\"); return f; }\n var kind = contextIn.kind, key = kind === \"getter\" ? \"get\" : kind === \"setter\" ? \"set\" : \"value\";\n var target = !descriptorIn && ctor ? contextIn[\"static\"] ? ctor : ctor.prototype : null;\n var descriptor = descriptorIn || (target ? Object.getOwnPropertyDescriptor(target, contextIn.name) : {});\n var _, done = false;\n for (var i = decorators.length - 1; i >= 0; i--) {\n var context = {};\n for (var p in contextIn) context[p] = p === \"access\" ? {} : contextIn[p];\n for (var p in contextIn.access) context.access[p] = contextIn.access[p];\n context.addInitializer = function (f) { if (done) throw new TypeError(\"Cannot add initializers after decoration has completed\"); extraInitializers.push(accept(f || null)); };\n var result = (0, decorators[i])(kind === \"accessor\" ? { get: descriptor.get, set: descriptor.set } : descriptor[key], context);\n if (kind === \"accessor\") {\n if (result === void 0) continue;\n if (result === null || typeof result !== \"object\") throw new TypeError(\"Object expected\");\n if (_ = accept(result.get)) descriptor.get = _;\n if (_ = accept(result.set)) descriptor.set = _;\n if (_ = accept(result.init)) initializers.unshift(_);\n }\n else if (_ = accept(result)) {\n if (kind === \"field\") initializers.unshift(_);\n else descriptor[key] = _;\n }\n }\n if (target) Object.defineProperty(target, contextIn.name, descriptor);\n done = true;\n};\n\nexport function __runInitializers(thisArg, initializers, value) {\n var useValue = arguments.length > 2;\n for (var i = 0; i < initializers.length; i++) {\n value = useValue ? initializers[i].call(thisArg, value) : initializers[i].call(thisArg);\n }\n return useValue ? value : void 0;\n};\n\nexport function __propKey(x) {\n return typeof x === \"symbol\" ? x : \"\".concat(x);\n};\n\nexport function __setFunctionName(f, name, prefix) {\n if (typeof name === \"symbol\") name = name.description ? \"[\".concat(name.description, \"]\") : \"\";\n return Object.defineProperty(f, \"name\", { configurable: true, value: prefix ? \"\".concat(prefix, \" \", name) : name });\n};\n\nexport function __metadata(metadataKey, metadataValue) {\n if (typeof Reflect === \"object\" && typeof Reflect.metadata === \"function\") return Reflect.metadata(metadataKey, metadataValue);\n}\n\nexport function __awaiter(thisArg, _arguments, P, generator) {\n function adopt(value) { return value instanceof P ? value : new P(function (resolve) { resolve(value); }); }\n return new (P || (P = Promise))(function (resolve, reject) {\n function fulfilled(value) { try { step(generator.next(value)); } catch (e) { reject(e); } }\n function rejected(value) { try { step(generator[\"throw\"](value)); } catch (e) { reject(e); } }\n function step(result) { result.done ? resolve(result.value) : adopt(result.value).then(fulfilled, rejected); }\n step((generator = generator.apply(thisArg, _arguments || [])).next());\n });\n}\n\nexport function __generator(thisArg, body) {\n var _ = { label: 0, sent: function() { if (t[0] & 1) throw t[1]; return t[1]; }, trys: [], ops: [] }, f, y, t, g = Object.create((typeof Iterator === \"function\" ? Iterator : Object).prototype);\n return g.next = verb(0), g[\"throw\"] = verb(1), g[\"return\"] = verb(2), typeof Symbol === \"function\" && (g[Symbol.iterator] = function() { return this; }), g;\n function verb(n) { return function (v) { return step([n, v]); }; }\n function step(op) {\n if (f) throw new TypeError(\"Generator is already executing.\");\n while (g && (g = 0, op[0] && (_ = 0)), _) try {\n if (f = 1, y && (t = op[0] & 2 ? y[\"return\"] : op[0] ? y[\"throw\"] || ((t = y[\"return\"]) && t.call(y), 0) : y.next) && !(t = t.call(y, op[1])).done) return t;\n if (y = 0, t) op = [op[0] & 2, t.value];\n switch (op[0]) {\n case 0: case 1: t = op; break;\n case 4: _.label++; return { value: op[1], done: false };\n case 5: _.label++; y = op[1]; op = [0]; continue;\n case 7: op = _.ops.pop(); _.trys.pop(); continue;\n default:\n if (!(t = _.trys, t = t.length > 0 && t[t.length - 1]) && (op[0] === 6 || op[0] === 2)) { _ = 0; continue; }\n if (op[0] === 3 && (!t || (op[1] > t[0] && op[1] < t[3]))) { _.label = op[1]; break; }\n if (op[0] === 6 && _.label < t[1]) { _.label = t[1]; t = op; break; }\n if (t && _.label < t[2]) { _.label = t[2]; _.ops.push(op); break; }\n if (t[2]) _.ops.pop();\n _.trys.pop(); continue;\n }\n op = body.call(thisArg, _);\n } catch (e) { op = [6, e]; y = 0; } finally { f = t = 0; }\n if (op[0] & 5) throw op[1]; return { value: op[0] ? op[1] : void 0, done: true };\n }\n}\n\nexport var __createBinding = Object.create ? (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n var desc = Object.getOwnPropertyDescriptor(m, k);\n if (!desc || (\"get\" in desc ? !m.__esModule : desc.writable || desc.configurable)) {\n desc = { enumerable: true, get: function() { return m[k]; } };\n }\n Object.defineProperty(o, k2, desc);\n}) : (function(o, m, k, k2) {\n if (k2 === undefined) k2 = k;\n o[k2] = m[k];\n});\n\nexport function __exportStar(m, o) {\n for (var p in m) if (p !== \"default\" && !Object.prototype.hasOwnProperty.call(o, p)) __createBinding(o, m, p);\n}\n\nexport function __values(o) {\n var s = typeof Symbol === \"function\" && Symbol.iterator, m = s && o[s], i = 0;\n if (m) return m.call(o);\n if (o && typeof o.length === \"number\") return {\n next: function () {\n if (o && i >= o.length) o = void 0;\n return { value: o && o[i++], done: !o };\n }\n };\n throw new TypeError(s ? \"Object is not iterable.\" : \"Symbol.iterator is not defined.\");\n}\n\nexport function __read(o, n) {\n var m = typeof Symbol === \"function\" && o[Symbol.iterator];\n if (!m) return o;\n var i = m.call(o), r, ar = [], e;\n try {\n while ((n === void 0 || n-- > 0) && !(r = i.next()).done) ar.push(r.value);\n }\n catch (error) { e = { error: error }; }\n finally {\n try {\n if (r && !r.done && (m = i[\"return\"])) m.call(i);\n }\n finally { if (e) throw e.error; }\n }\n return ar;\n}\n\n/** @deprecated */\nexport function __spread() {\n for (var ar = [], i = 0; i < arguments.length; i++)\n ar = ar.concat(__read(arguments[i]));\n return ar;\n}\n\n/** @deprecated */\nexport function __spreadArrays() {\n for (var s = 0, i = 0, il = arguments.length; i < il; i++) s += arguments[i].length;\n for (var r = Array(s), k = 0, i = 0; i < il; i++)\n for (var a = arguments[i], j = 0, jl = a.length; j < jl; j++, k++)\n r[k] = a[j];\n return r;\n}\n\nexport function __spreadArray(to, from, pack) {\n if (pack || arguments.length === 2) for (var i = 0, l = from.length, ar; i < l; i++) {\n if (ar || !(i in from)) {\n if (!ar) ar = Array.prototype.slice.call(from, 0, i);\n ar[i] = from[i];\n }\n }\n return to.concat(ar || Array.prototype.slice.call(from));\n}\n\nexport function __await(v) {\n return this instanceof __await ? (this.v = v, this) : new __await(v);\n}\n\nexport function __asyncGenerator(thisArg, _arguments, generator) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var g = generator.apply(thisArg, _arguments || []), i, q = [];\n return i = Object.create((typeof AsyncIterator === \"function\" ? AsyncIterator : Object).prototype), verb(\"next\"), verb(\"throw\"), verb(\"return\", awaitReturn), i[Symbol.asyncIterator] = function () { return this; }, i;\n function awaitReturn(f) { return function (v) { return Promise.resolve(v).then(f, reject); }; }\n function verb(n, f) { if (g[n]) { i[n] = function (v) { return new Promise(function (a, b) { q.push([n, v, a, b]) > 1 || resume(n, v); }); }; if (f) i[n] = f(i[n]); } }\n function resume(n, v) { try { step(g[n](v)); } catch (e) { settle(q[0][3], e); } }\n function step(r) { r.value instanceof __await ? Promise.resolve(r.value.v).then(fulfill, reject) : settle(q[0][2], r); }\n function fulfill(value) { resume(\"next\", value); }\n function reject(value) { resume(\"throw\", value); }\n function settle(f, v) { if (f(v), q.shift(), q.length) resume(q[0][0], q[0][1]); }\n}\n\nexport function __asyncDelegator(o) {\n var i, p;\n return i = {}, verb(\"next\"), verb(\"throw\", function (e) { throw e; }), verb(\"return\"), i[Symbol.iterator] = function () { return this; }, i;\n function verb(n, f) { i[n] = o[n] ? function (v) { return (p = !p) ? { value: __await(o[n](v)), done: false } : f ? f(v) : v; } : f; }\n}\n\nexport function __asyncValues(o) {\n if (!Symbol.asyncIterator) throw new TypeError(\"Symbol.asyncIterator is not defined.\");\n var m = o[Symbol.asyncIterator], i;\n return m ? m.call(o) : (o = typeof __values === \"function\" ? __values(o) : o[Symbol.iterator](), i = {}, verb(\"next\"), verb(\"throw\"), verb(\"return\"), i[Symbol.asyncIterator] = function () { return this; }, i);\n function verb(n) { i[n] = o[n] && function (v) { return new Promise(function (resolve, reject) { v = o[n](v), settle(resolve, reject, v.done, v.value); }); }; }\n function settle(resolve, reject, d, v) { Promise.resolve(v).then(function(v) { resolve({ value: v, done: d }); }, reject); }\n}\n\nexport function __makeTemplateObject(cooked, raw) {\n if (Object.defineProperty) { Object.defineProperty(cooked, \"raw\", { value: raw }); } else { cooked.raw = raw; }\n return cooked;\n};\n\nvar __setModuleDefault = Object.create ? (function(o, v) {\n Object.defineProperty(o, \"default\", { enumerable: true, value: v });\n}) : function(o, v) {\n o[\"default\"] = v;\n};\n\nexport function __importStar(mod) {\n if (mod && mod.__esModule) return mod;\n var result = {};\n if (mod != null) for (var k in mod) if (k !== \"default\" && Object.prototype.hasOwnProperty.call(mod, k)) __createBinding(result, mod, k);\n __setModuleDefault(result, mod);\n return result;\n}\n\nexport function __importDefault(mod) {\n return (mod && mod.__esModule) ? mod : { default: mod };\n}\n\nexport function __classPrivateFieldGet(receiver, state, kind, f) {\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a getter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot read private member from an object whose class did not declare it\");\n return kind === \"m\" ? f : kind === \"a\" ? f.call(receiver) : f ? f.value : state.get(receiver);\n}\n\nexport function __classPrivateFieldSet(receiver, state, value, kind, f) {\n if (kind === \"m\") throw new TypeError(\"Private method is not writable\");\n if (kind === \"a\" && !f) throw new TypeError(\"Private accessor was defined without a setter\");\n if (typeof state === \"function\" ? receiver !== state || !f : !state.has(receiver)) throw new TypeError(\"Cannot write private member to an object whose class did not declare it\");\n return (kind === \"a\" ? f.call(receiver, value) : f ? f.value = value : state.set(receiver, value)), value;\n}\n\nexport function __classPrivateFieldIn(state, receiver) {\n if (receiver === null || (typeof receiver !== \"object\" && typeof receiver !== \"function\")) throw new TypeError(\"Cannot use 'in' operator on non-object\");\n return typeof state === \"function\" ? receiver === state : state.has(receiver);\n}\n\nexport function __addDisposableResource(env, value, async) {\n if (value !== null && value !== void 0) {\n if (typeof value !== \"object\" && typeof value !== \"function\") throw new TypeError(\"Object expected.\");\n var dispose, inner;\n if (async) {\n if (!Symbol.asyncDispose) throw new TypeError(\"Symbol.asyncDispose is not defined.\");\n dispose = value[Symbol.asyncDispose];\n }\n if (dispose === void 0) {\n if (!Symbol.dispose) throw new TypeError(\"Symbol.dispose is not defined.\");\n dispose = value[Symbol.dispose];\n if (async) inner = dispose;\n }\n if (typeof dispose !== \"function\") throw new TypeError(\"Object not disposable.\");\n if (inner) dispose = function() { try { inner.call(this); } catch (e) { return Promise.reject(e); } };\n env.stack.push({ value: value, dispose: dispose, async: async });\n }\n else if (async) {\n env.stack.push({ async: true });\n }\n return value;\n}\n\nvar _SuppressedError = typeof SuppressedError === \"function\" ? SuppressedError : function (error, suppressed, message) {\n var e = new Error(message);\n return e.name = \"SuppressedError\", e.error = error, e.suppressed = suppressed, e;\n};\n\nexport function __disposeResources(env) {\n function fail(e) {\n env.error = env.hasError ? new _SuppressedError(e, env.error, \"An error was suppressed during disposal.\") : e;\n env.hasError = true;\n }\n var r, s = 0;\n function next() {\n while (r = env.stack.pop()) {\n try {\n if (!r.async && s === 1) return s = 0, env.stack.push(r), Promise.resolve().then(next);\n if (r.dispose) {\n var result = r.dispose.call(r.value);\n if (r.async) return s |= 2, Promise.resolve(result).then(next, function(e) { fail(e); return next(); });\n }\n else s |= 1;\n }\n catch (e) {\n fail(e);\n }\n }\n if (s === 1) return env.hasError ? Promise.reject(env.error) : Promise.resolve();\n if (env.hasError) throw env.error;\n }\n return next();\n}\n\nexport default {\n __extends,\n __assign,\n __rest,\n __decorate,\n __param,\n __metadata,\n __awaiter,\n __generator,\n __createBinding,\n __exportStar,\n __values,\n __read,\n __spread,\n __spreadArrays,\n __spreadArray,\n __await,\n __asyncGenerator,\n __asyncDelegator,\n __asyncValues,\n __makeTemplateObject,\n __importStar,\n __importDefault,\n __classPrivateFieldGet,\n __classPrivateFieldSet,\n __classPrivateFieldIn,\n __addDisposableResource,\n __disposeResources,\n};\n", "/**\n * Returns true if the object is a function.\n * @param value The value to check\n */\nexport function isFunction(value: any): value is (...args: any[]) => any {\n return typeof value === 'function';\n}\n", "/**\n * Used to create Error subclasses until the community moves away from ES5.\n *\n * This is because compiling from TypeScript down to ES5 has issues with subclassing Errors\n * as well as other built-in types: https://github.com/Microsoft/TypeScript/issues/12123\n *\n * @param createImpl A factory function to create the actual constructor implementation. The returned\n * function should be a named function that calls `_super` internally.\n */\nexport function createErrorClass(createImpl: (_super: any) => any): T {\n const _super = (instance: any) => {\n Error.call(instance);\n instance.stack = new Error().stack;\n };\n\n const ctorFunc = createImpl(_super);\n ctorFunc.prototype = Object.create(Error.prototype);\n ctorFunc.prototype.constructor = ctorFunc;\n return ctorFunc;\n}\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface UnsubscriptionError extends Error {\n readonly errors: any[];\n}\n\nexport interface UnsubscriptionErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (errors: any[]): UnsubscriptionError;\n}\n\n/**\n * An error thrown when one or more errors have occurred during the\n * `unsubscribe` of a {@link Subscription}.\n */\nexport const UnsubscriptionError: UnsubscriptionErrorCtor = createErrorClass(\n (_super) =>\n function UnsubscriptionErrorImpl(this: any, errors: (Error | string)[]) {\n _super(this);\n this.message = errors\n ? `${errors.length} errors occurred during unsubscription:\n${errors.map((err, i) => `${i + 1}) ${err.toString()}`).join('\\n ')}`\n : '';\n this.name = 'UnsubscriptionError';\n this.errors = errors;\n }\n);\n", "/**\n * Removes an item from an array, mutating it.\n * @param arr The array to remove the item from\n * @param item The item to remove\n */\nexport function arrRemove(arr: T[] | undefined | null, item: T) {\n if (arr) {\n const index = arr.indexOf(item);\n 0 <= index && arr.splice(index, 1);\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { UnsubscriptionError } from './util/UnsubscriptionError';\nimport { SubscriptionLike, TeardownLogic, Unsubscribable } from './types';\nimport { arrRemove } from './util/arrRemove';\n\n/**\n * Represents a disposable resource, such as the execution of an Observable. A\n * Subscription has one important method, `unsubscribe`, that takes no argument\n * and just disposes the resource held by the subscription.\n *\n * Additionally, subscriptions may be grouped together through the `add()`\n * method, which will attach a child Subscription to the current Subscription.\n * When a Subscription is unsubscribed, all its children (and its grandchildren)\n * will be unsubscribed as well.\n *\n * @class Subscription\n */\nexport class Subscription implements SubscriptionLike {\n /** @nocollapse */\n public static EMPTY = (() => {\n const empty = new Subscription();\n empty.closed = true;\n return empty;\n })();\n\n /**\n * A flag to indicate whether this Subscription has already been unsubscribed.\n */\n public closed = false;\n\n private _parentage: Subscription[] | Subscription | null = null;\n\n /**\n * The list of registered finalizers to execute upon unsubscription. Adding and removing from this\n * list occurs in the {@link #add} and {@link #remove} methods.\n */\n private _finalizers: Exclude[] | null = null;\n\n /**\n * @param initialTeardown A function executed first as part of the finalization\n * process that is kicked off when {@link #unsubscribe} is called.\n */\n constructor(private initialTeardown?: () => void) {}\n\n /**\n * Disposes the resources held by the subscription. May, for instance, cancel\n * an ongoing Observable execution or cancel any other type of work that\n * started when the Subscription was created.\n * @return {void}\n */\n unsubscribe(): void {\n let errors: any[] | undefined;\n\n if (!this.closed) {\n this.closed = true;\n\n // Remove this from it's parents.\n const { _parentage } = this;\n if (_parentage) {\n this._parentage = null;\n if (Array.isArray(_parentage)) {\n for (const parent of _parentage) {\n parent.remove(this);\n }\n } else {\n _parentage.remove(this);\n }\n }\n\n const { initialTeardown: initialFinalizer } = this;\n if (isFunction(initialFinalizer)) {\n try {\n initialFinalizer();\n } catch (e) {\n errors = e instanceof UnsubscriptionError ? e.errors : [e];\n }\n }\n\n const { _finalizers } = this;\n if (_finalizers) {\n this._finalizers = null;\n for (const finalizer of _finalizers) {\n try {\n execFinalizer(finalizer);\n } catch (err) {\n errors = errors ?? [];\n if (err instanceof UnsubscriptionError) {\n errors = [...errors, ...err.errors];\n } else {\n errors.push(err);\n }\n }\n }\n }\n\n if (errors) {\n throw new UnsubscriptionError(errors);\n }\n }\n }\n\n /**\n * Adds a finalizer to this subscription, so that finalization will be unsubscribed/called\n * when this subscription is unsubscribed. If this subscription is already {@link #closed},\n * because it has already been unsubscribed, then whatever finalizer is passed to it\n * will automatically be executed (unless the finalizer itself is also a closed subscription).\n *\n * Closed Subscriptions cannot be added as finalizers to any subscription. Adding a closed\n * subscription to a any subscription will result in no operation. (A noop).\n *\n * Adding a subscription to itself, or adding `null` or `undefined` will not perform any\n * operation at all. (A noop).\n *\n * `Subscription` instances that are added to this instance will automatically remove themselves\n * if they are unsubscribed. Functions and {@link Unsubscribable} objects that you wish to remove\n * will need to be removed manually with {@link #remove}\n *\n * @param teardown The finalization logic to add to this subscription.\n */\n add(teardown: TeardownLogic): void {\n // Only add the finalizer if it's not undefined\n // and don't add a subscription to itself.\n if (teardown && teardown !== this) {\n if (this.closed) {\n // If this subscription is already closed,\n // execute whatever finalizer is handed to it automatically.\n execFinalizer(teardown);\n } else {\n if (teardown instanceof Subscription) {\n // We don't add closed subscriptions, and we don't add the same subscription\n // twice. Subscription unsubscribe is idempotent.\n if (teardown.closed || teardown._hasParent(this)) {\n return;\n }\n teardown._addParent(this);\n }\n (this._finalizers = this._finalizers ?? []).push(teardown);\n }\n }\n }\n\n /**\n * Checks to see if a this subscription already has a particular parent.\n * This will signal that this subscription has already been added to the parent in question.\n * @param parent the parent to check for\n */\n private _hasParent(parent: Subscription) {\n const { _parentage } = this;\n return _parentage === parent || (Array.isArray(_parentage) && _parentage.includes(parent));\n }\n\n /**\n * Adds a parent to this subscription so it can be removed from the parent if it\n * unsubscribes on it's own.\n *\n * NOTE: THIS ASSUMES THAT {@link _hasParent} HAS ALREADY BEEN CHECKED.\n * @param parent The parent subscription to add\n */\n private _addParent(parent: Subscription) {\n const { _parentage } = this;\n this._parentage = Array.isArray(_parentage) ? (_parentage.push(parent), _parentage) : _parentage ? [_parentage, parent] : parent;\n }\n\n /**\n * Called on a child when it is removed via {@link #remove}.\n * @param parent The parent to remove\n */\n private _removeParent(parent: Subscription) {\n const { _parentage } = this;\n if (_parentage === parent) {\n this._parentage = null;\n } else if (Array.isArray(_parentage)) {\n arrRemove(_parentage, parent);\n }\n }\n\n /**\n * Removes a finalizer from this subscription that was previously added with the {@link #add} method.\n *\n * Note that `Subscription` instances, when unsubscribed, will automatically remove themselves\n * from every other `Subscription` they have been added to. This means that using the `remove` method\n * is not a common thing and should be used thoughtfully.\n *\n * If you add the same finalizer instance of a function or an unsubscribable object to a `Subscription` instance\n * more than once, you will need to call `remove` the same number of times to remove all instances.\n *\n * All finalizer instances are removed to free up memory upon unsubscription.\n *\n * @param teardown The finalizer to remove from this subscription\n */\n remove(teardown: Exclude): void {\n const { _finalizers } = this;\n _finalizers && arrRemove(_finalizers, teardown);\n\n if (teardown instanceof Subscription) {\n teardown._removeParent(this);\n }\n }\n}\n\nexport const EMPTY_SUBSCRIPTION = Subscription.EMPTY;\n\nexport function isSubscription(value: any): value is Subscription {\n return (\n value instanceof Subscription ||\n (value && 'closed' in value && isFunction(value.remove) && isFunction(value.add) && isFunction(value.unsubscribe))\n );\n}\n\nfunction execFinalizer(finalizer: Unsubscribable | (() => void)) {\n if (isFunction(finalizer)) {\n finalizer();\n } else {\n finalizer.unsubscribe();\n }\n}\n", "import { Subscriber } from './Subscriber';\nimport { ObservableNotification } from './types';\n\n/**\n * The {@link GlobalConfig} object for RxJS. It is used to configure things\n * like how to react on unhandled errors.\n */\nexport const config: GlobalConfig = {\n onUnhandledError: null,\n onStoppedNotification: null,\n Promise: undefined,\n useDeprecatedSynchronousErrorHandling: false,\n useDeprecatedNextContext: false,\n};\n\n/**\n * The global configuration object for RxJS, used to configure things\n * like how to react on unhandled errors. Accessible via {@link config}\n * object.\n */\nexport interface GlobalConfig {\n /**\n * A registration point for unhandled errors from RxJS. These are errors that\n * cannot were not handled by consuming code in the usual subscription path. For\n * example, if you have this configured, and you subscribe to an observable without\n * providing an error handler, errors from that subscription will end up here. This\n * will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onUnhandledError: ((err: any) => void) | null;\n\n /**\n * A registration point for notifications that cannot be sent to subscribers because they\n * have completed, errored or have been explicitly unsubscribed. By default, next, complete\n * and error notifications sent to stopped subscribers are noops. However, sometimes callers\n * might want a different behavior. For example, with sources that attempt to report errors\n * to stopped subscribers, a caller can configure RxJS to throw an unhandled error instead.\n * This will _always_ be called asynchronously on another job in the runtime. This is because\n * we do not want errors thrown in this user-configured handler to interfere with the\n * behavior of the library.\n */\n onStoppedNotification: ((notification: ObservableNotification, subscriber: Subscriber) => void) | null;\n\n /**\n * The promise constructor used by default for {@link Observable#toPromise toPromise} and {@link Observable#forEach forEach}\n * methods.\n *\n * @deprecated As of version 8, RxJS will no longer support this sort of injection of a\n * Promise constructor. If you need a Promise implementation other than native promises,\n * please polyfill/patch Promise as you see appropriate. Will be removed in v8.\n */\n Promise?: PromiseConstructorLike;\n\n /**\n * If true, turns on synchronous error rethrowing, which is a deprecated behavior\n * in v6 and higher. This behavior enables bad patterns like wrapping a subscribe\n * call in a try/catch block. It also enables producer interference, a nasty bug\n * where a multicast can be broken for all observers by a downstream consumer with\n * an unhandled error. DO NOT USE THIS FLAG UNLESS IT'S NEEDED TO BUY TIME\n * FOR MIGRATION REASONS.\n *\n * @deprecated As of version 8, RxJS will no longer support synchronous throwing\n * of unhandled errors. All errors will be thrown on a separate call stack to prevent bad\n * behaviors described above. Will be removed in v8.\n */\n useDeprecatedSynchronousErrorHandling: boolean;\n\n /**\n * If true, enables an as-of-yet undocumented feature from v5: The ability to access\n * `unsubscribe()` via `this` context in `next` functions created in observers passed\n * to `subscribe`.\n *\n * This is being removed because the performance was severely problematic, and it could also cause\n * issues when types other than POJOs are passed to subscribe as subscribers, as they will likely have\n * their `this` context overwritten.\n *\n * @deprecated As of version 8, RxJS will no longer support altering the\n * context of next functions provided as part of an observer to Subscribe. Instead,\n * you will have access to a subscription or a signal or token that will allow you to do things like\n * unsubscribe and test closed status. Will be removed in v8.\n */\n useDeprecatedNextContext: boolean;\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetTimeoutFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearTimeoutFunction = (handle: TimerHandle) => void;\n\ninterface TimeoutProvider {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n delegate:\n | {\n setTimeout: SetTimeoutFunction;\n clearTimeout: ClearTimeoutFunction;\n }\n | undefined;\n}\n\nexport const timeoutProvider: TimeoutProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setTimeout(handler: () => void, timeout?: number, ...args) {\n const { delegate } = timeoutProvider;\n if (delegate?.setTimeout) {\n return delegate.setTimeout(handler, timeout, ...args);\n }\n return setTimeout(handler, timeout, ...args);\n },\n clearTimeout(handle) {\n const { delegate } = timeoutProvider;\n return (delegate?.clearTimeout || clearTimeout)(handle as any);\n },\n delegate: undefined,\n};\n", "import { config } from '../config';\nimport { timeoutProvider } from '../scheduler/timeoutProvider';\n\n/**\n * Handles an error on another job either with the user-configured {@link onUnhandledError},\n * or by throwing it on that new job so it can be picked up by `window.onerror`, `process.on('error')`, etc.\n *\n * This should be called whenever there is an error that is out-of-band with the subscription\n * or when an error hits a terminal boundary of the subscription and no error handler was provided.\n *\n * @param err the error to report\n */\nexport function reportUnhandledError(err: any) {\n timeoutProvider.setTimeout(() => {\n const { onUnhandledError } = config;\n if (onUnhandledError) {\n // Execute the user-configured error handler.\n onUnhandledError(err);\n } else {\n // Throw so it is picked up by the runtime's uncaught error mechanism.\n throw err;\n }\n });\n}\n", "/* tslint:disable:no-empty */\nexport function noop() { }\n", "import { CompleteNotification, NextNotification, ErrorNotification } from './types';\n\n/**\n * A completion object optimized for memory use and created to be the\n * same \"shape\" as other notifications in v8.\n * @internal\n */\nexport const COMPLETE_NOTIFICATION = (() => createNotification('C', undefined, undefined) as CompleteNotification)();\n\n/**\n * Internal use only. Creates an optimized error notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function errorNotification(error: any): ErrorNotification {\n return createNotification('E', undefined, error) as any;\n}\n\n/**\n * Internal use only. Creates an optimized next notification that is the same \"shape\"\n * as other notifications.\n * @internal\n */\nexport function nextNotification(value: T) {\n return createNotification('N', value, undefined) as NextNotification;\n}\n\n/**\n * Ensures that all notifications created internally have the same \"shape\" in v8.\n *\n * TODO: This is only exported to support a crazy legacy test in `groupBy`.\n * @internal\n */\nexport function createNotification(kind: 'N' | 'E' | 'C', value: any, error: any) {\n return {\n kind,\n value,\n error,\n };\n}\n", "import { config } from '../config';\n\nlet context: { errorThrown: boolean; error: any } | null = null;\n\n/**\n * Handles dealing with errors for super-gross mode. Creates a context, in which\n * any synchronously thrown errors will be passed to {@link captureError}. Which\n * will record the error such that it will be rethrown after the call back is complete.\n * TODO: Remove in v8\n * @param cb An immediately executed function.\n */\nexport function errorContext(cb: () => void) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n const isRoot = !context;\n if (isRoot) {\n context = { errorThrown: false, error: null };\n }\n cb();\n if (isRoot) {\n const { errorThrown, error } = context!;\n context = null;\n if (errorThrown) {\n throw error;\n }\n }\n } else {\n // This is the general non-deprecated path for everyone that\n // isn't crazy enough to use super-gross mode (useDeprecatedSynchronousErrorHandling)\n cb();\n }\n}\n\n/**\n * Captures errors only in super-gross mode.\n * @param err the error to capture\n */\nexport function captureError(err: any) {\n if (config.useDeprecatedSynchronousErrorHandling && context) {\n context.errorThrown = true;\n context.error = err;\n }\n}\n", "import { isFunction } from './util/isFunction';\nimport { Observer, ObservableNotification } from './types';\nimport { isSubscription, Subscription } from './Subscription';\nimport { config } from './config';\nimport { reportUnhandledError } from './util/reportUnhandledError';\nimport { noop } from './util/noop';\nimport { nextNotification, errorNotification, COMPLETE_NOTIFICATION } from './NotificationFactories';\nimport { timeoutProvider } from './scheduler/timeoutProvider';\nimport { captureError } from './util/errorContext';\n\n/**\n * Implements the {@link Observer} interface and extends the\n * {@link Subscription} class. While the {@link Observer} is the public API for\n * consuming the values of an {@link Observable}, all Observers get converted to\n * a Subscriber, in order to provide Subscription-like capabilities such as\n * `unsubscribe`. Subscriber is a common type in RxJS, and crucial for\n * implementing operators, but it is rarely used as a public API.\n *\n * @class Subscriber\n */\nexport class Subscriber extends Subscription implements Observer {\n /**\n * A static factory for a Subscriber, given a (potentially partial) definition\n * of an Observer.\n * @param next The `next` callback of an Observer.\n * @param error The `error` callback of an\n * Observer.\n * @param complete The `complete` callback of an\n * Observer.\n * @return A Subscriber wrapping the (partially defined)\n * Observer represented by the given arguments.\n * @nocollapse\n * @deprecated Do not use. Will be removed in v8. There is no replacement for this\n * method, and there is no reason to be creating instances of `Subscriber` directly.\n * If you have a specific use case, please file an issue.\n */\n static create(next?: (x?: T) => void, error?: (e?: any) => void, complete?: () => void): Subscriber {\n return new SafeSubscriber(next, error, complete);\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected isStopped: boolean = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n protected destination: Subscriber | Observer; // this `any` is the escape hatch to erase extra type param (e.g. R)\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * There is no reason to directly create an instance of Subscriber. This type is exported for typings reasons.\n */\n constructor(destination?: Subscriber | Observer) {\n super();\n if (destination) {\n this.destination = destination;\n // Automatically chain subscriptions together here.\n // if destination is a Subscription, then it is a Subscriber.\n if (isSubscription(destination)) {\n destination.add(this);\n }\n } else {\n this.destination = EMPTY_OBSERVER;\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `next` from\n * the Observable, with a value. The Observable may call this method 0 or more\n * times.\n * @param {T} [value] The `next` value.\n * @return {void}\n */\n next(value?: T): void {\n if (this.isStopped) {\n handleStoppedNotification(nextNotification(value), this);\n } else {\n this._next(value!);\n }\n }\n\n /**\n * The {@link Observer} callback to receive notifications of type `error` from\n * the Observable, with an attached `Error`. Notifies the Observer that\n * the Observable has experienced an error condition.\n * @param {any} [err] The `error` exception.\n * @return {void}\n */\n error(err?: any): void {\n if (this.isStopped) {\n handleStoppedNotification(errorNotification(err), this);\n } else {\n this.isStopped = true;\n this._error(err);\n }\n }\n\n /**\n * The {@link Observer} callback to receive a valueless notification of type\n * `complete` from the Observable. Notifies the Observer that the Observable\n * has finished sending push-based notifications.\n * @return {void}\n */\n complete(): void {\n if (this.isStopped) {\n handleStoppedNotification(COMPLETE_NOTIFICATION, this);\n } else {\n this.isStopped = true;\n this._complete();\n }\n }\n\n unsubscribe(): void {\n if (!this.closed) {\n this.isStopped = true;\n super.unsubscribe();\n this.destination = null!;\n }\n }\n\n protected _next(value: T): void {\n this.destination.next(value);\n }\n\n protected _error(err: any): void {\n try {\n this.destination.error(err);\n } finally {\n this.unsubscribe();\n }\n }\n\n protected _complete(): void {\n try {\n this.destination.complete();\n } finally {\n this.unsubscribe();\n }\n }\n}\n\n/**\n * This bind is captured here because we want to be able to have\n * compatibility with monoid libraries that tend to use a method named\n * `bind`. In particular, a library called Monio requires this.\n */\nconst _bind = Function.prototype.bind;\n\nfunction bind any>(fn: Fn, thisArg: any): Fn {\n return _bind.call(fn, thisArg);\n}\n\n/**\n * Internal optimization only, DO NOT EXPOSE.\n * @internal\n */\nclass ConsumerObserver implements Observer {\n constructor(private partialObserver: Partial>) {}\n\n next(value: T): void {\n const { partialObserver } = this;\n if (partialObserver.next) {\n try {\n partialObserver.next(value);\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n\n error(err: any): void {\n const { partialObserver } = this;\n if (partialObserver.error) {\n try {\n partialObserver.error(err);\n } catch (error) {\n handleUnhandledError(error);\n }\n } else {\n handleUnhandledError(err);\n }\n }\n\n complete(): void {\n const { partialObserver } = this;\n if (partialObserver.complete) {\n try {\n partialObserver.complete();\n } catch (error) {\n handleUnhandledError(error);\n }\n }\n }\n}\n\nexport class SafeSubscriber extends Subscriber {\n constructor(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((e?: any) => void) | null,\n complete?: (() => void) | null\n ) {\n super();\n\n let partialObserver: Partial>;\n if (isFunction(observerOrNext) || !observerOrNext) {\n // The first argument is a function, not an observer. The next\n // two arguments *could* be observers, or they could be empty.\n partialObserver = {\n next: (observerOrNext ?? undefined) as (((value: T) => void) | undefined),\n error: error ?? undefined,\n complete: complete ?? undefined,\n };\n } else {\n // The first argument is a partial observer.\n let context: any;\n if (this && config.useDeprecatedNextContext) {\n // This is a deprecated path that made `this.unsubscribe()` available in\n // next handler functions passed to subscribe. This only exists behind a flag\n // now, as it is *very* slow.\n context = Object.create(observerOrNext);\n context.unsubscribe = () => this.unsubscribe();\n partialObserver = {\n next: observerOrNext.next && bind(observerOrNext.next, context),\n error: observerOrNext.error && bind(observerOrNext.error, context),\n complete: observerOrNext.complete && bind(observerOrNext.complete, context),\n };\n } else {\n // The \"normal\" path. Just use the partial observer directly.\n partialObserver = observerOrNext;\n }\n }\n\n // Wrap the partial observer to ensure it's a full observer, and\n // make sure proper error handling is accounted for.\n this.destination = new ConsumerObserver(partialObserver);\n }\n}\n\nfunction handleUnhandledError(error: any) {\n if (config.useDeprecatedSynchronousErrorHandling) {\n captureError(error);\n } else {\n // Ideal path, we report this as an unhandled error,\n // which is thrown on a new call stack.\n reportUnhandledError(error);\n }\n}\n\n/**\n * An error handler used when no error handler was supplied\n * to the SafeSubscriber -- meaning no error handler was supplied\n * do the `subscribe` call on our observable.\n * @param err The error to handle\n */\nfunction defaultErrorHandler(err: any) {\n throw err;\n}\n\n/**\n * A handler for notifications that cannot be sent to a stopped subscriber.\n * @param notification The notification being sent\n * @param subscriber The stopped subscriber\n */\nfunction handleStoppedNotification(notification: ObservableNotification, subscriber: Subscriber) {\n const { onStoppedNotification } = config;\n onStoppedNotification && timeoutProvider.setTimeout(() => onStoppedNotification(notification, subscriber));\n}\n\n/**\n * The observer used as a stub for subscriptions where the user did not\n * pass any arguments to `subscribe`. Comes with the default error handling\n * behavior.\n */\nexport const EMPTY_OBSERVER: Readonly> & { closed: true } = {\n closed: true,\n next: noop,\n error: defaultErrorHandler,\n complete: noop,\n};\n", "/**\n * Symbol.observable or a string \"@@observable\". Used for interop\n *\n * @deprecated We will no longer be exporting this symbol in upcoming versions of RxJS.\n * Instead polyfill and use Symbol.observable directly *or* use https://www.npmjs.com/package/symbol-observable\n */\nexport const observable: string | symbol = (() => (typeof Symbol === 'function' && Symbol.observable) || '@@observable')();\n", "/**\n * This function takes one parameter and just returns it. Simply put,\n * this is like `(x: T): T => x`.\n *\n * ## Examples\n *\n * This is useful in some cases when using things like `mergeMap`\n *\n * ```ts\n * import { interval, take, map, range, mergeMap, identity } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(5));\n *\n * const result$ = source$.pipe(\n * map(i => range(i)),\n * mergeMap(identity) // same as mergeMap(x => x)\n * );\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * Or when you want to selectively apply an operator\n *\n * ```ts\n * import { interval, take, identity } from 'rxjs';\n *\n * const shouldLimit = () => Math.random() < 0.5;\n *\n * const source$ = interval(1000);\n *\n * const result$ = source$.pipe(shouldLimit() ? take(5) : identity);\n *\n * result$.subscribe({\n * next: console.log\n * });\n * ```\n *\n * @param x Any value that is returned by this function\n * @returns The value passed as the first parameter to this function\n */\nexport function identity(x: T): T {\n return x;\n}\n", "import { identity } from './identity';\nimport { UnaryFunction } from '../types';\n\nexport function pipe(): typeof identity;\nexport function pipe(fn1: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction): UnaryFunction;\nexport function pipe(fn1: UnaryFunction, fn2: UnaryFunction, fn3: UnaryFunction): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction\n): UnaryFunction;\nexport function pipe(\n fn1: UnaryFunction,\n fn2: UnaryFunction,\n fn3: UnaryFunction,\n fn4: UnaryFunction,\n fn5: UnaryFunction,\n fn6: UnaryFunction,\n fn7: UnaryFunction,\n fn8: UnaryFunction,\n fn9: UnaryFunction,\n ...fns: UnaryFunction[]\n): UnaryFunction;\n\n/**\n * pipe() can be called on one or more functions, each of which can take one argument (\"UnaryFunction\")\n * and uses it to return a value.\n * It returns a function that takes one argument, passes it to the first UnaryFunction, and then\n * passes the result to the next one, passes that result to the next one, and so on. \n */\nexport function pipe(...fns: Array>): UnaryFunction {\n return pipeFromArray(fns);\n}\n\n/** @internal */\nexport function pipeFromArray(fns: Array>): UnaryFunction {\n if (fns.length === 0) {\n return identity as UnaryFunction;\n }\n\n if (fns.length === 1) {\n return fns[0];\n }\n\n return function piped(input: T): R {\n return fns.reduce((prev: any, fn: UnaryFunction) => fn(prev), input as any);\n };\n}\n", "import { Operator } from './Operator';\nimport { SafeSubscriber, Subscriber } from './Subscriber';\nimport { isSubscription, Subscription } from './Subscription';\nimport { TeardownLogic, OperatorFunction, Subscribable, Observer } from './types';\nimport { observable as Symbol_observable } from './symbol/observable';\nimport { pipeFromArray } from './util/pipe';\nimport { config } from './config';\nimport { isFunction } from './util/isFunction';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A representation of any set of values over any amount of time. This is the most basic building block\n * of RxJS.\n *\n * @class Observable\n */\nexport class Observable implements Subscribable {\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n source: Observable | undefined;\n\n /**\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n */\n operator: Operator | undefined;\n\n /**\n * @constructor\n * @param {Function} subscribe the function that is called when the Observable is\n * initially subscribed to. This function is given a Subscriber, to which new values\n * can be `next`ed, or an `error` method can be called to raise an error, or\n * `complete` can be called to notify of a successful completion.\n */\n constructor(subscribe?: (this: Observable, subscriber: Subscriber) => TeardownLogic) {\n if (subscribe) {\n this._subscribe = subscribe;\n }\n }\n\n // HACK: Since TypeScript inherits static properties too, we have to\n // fight against TypeScript here so Subject can have a different static create signature\n /**\n * Creates a new Observable by calling the Observable constructor\n * @owner Observable\n * @method create\n * @param {Function} subscribe? the subscriber function to be passed to the Observable constructor\n * @return {Observable} a new observable\n * @nocollapse\n * @deprecated Use `new Observable()` instead. Will be removed in v8.\n */\n static create: (...args: any[]) => any = (subscribe?: (subscriber: Subscriber) => TeardownLogic) => {\n return new Observable(subscribe);\n };\n\n /**\n * Creates a new Observable, with this Observable instance as the source, and the passed\n * operator defined as the new observable's operator.\n * @method lift\n * @param operator the operator defining the operation to take on the observable\n * @return a new observable with the Operator applied\n * @deprecated Internal implementation detail, do not use directly. Will be made internal in v8.\n * If you have implemented an operator using `lift`, it is recommended that you create an\n * operator by simply returning `new Observable()` directly. See \"Creating new operators from\n * scratch\" section here: https://rxjs.dev/guide/operators\n */\n lift(operator?: Operator): Observable {\n const observable = new Observable();\n observable.source = this;\n observable.operator = operator;\n return observable;\n }\n\n subscribe(observerOrNext?: Partial> | ((value: T) => void)): Subscription;\n /** @deprecated Instead of passing separate callback arguments, use an observer argument. Signatures taking separate callback arguments will be removed in v8. Details: https://rxjs.dev/deprecations/subscribe-arguments */\n subscribe(next?: ((value: T) => void) | null, error?: ((error: any) => void) | null, complete?: (() => void) | null): Subscription;\n /**\n * Invokes an execution of an Observable and registers Observer handlers for notifications it will emit.\n *\n * Use it when you have all these Observables, but still nothing is happening.\n *\n * `subscribe` is not a regular operator, but a method that calls Observable's internal `subscribe` function. It\n * might be for example a function that you passed to Observable's constructor, but most of the time it is\n * a library implementation, which defines what will be emitted by an Observable, and when it be will emitted. This means\n * that calling `subscribe` is actually the moment when Observable starts its work, not when it is created, as it is often\n * the thought.\n *\n * Apart from starting the execution of an Observable, this method allows you to listen for values\n * that an Observable emits, as well as for when it completes or errors. You can achieve this in two\n * of the following ways.\n *\n * The first way is creating an object that implements {@link Observer} interface. It should have methods\n * defined by that interface, but note that it should be just a regular JavaScript object, which you can create\n * yourself in any way you want (ES6 class, classic function constructor, object literal etc.). In particular, do\n * not attempt to use any RxJS implementation details to create Observers - you don't need them. Remember also\n * that your object does not have to implement all methods. If you find yourself creating a method that doesn't\n * do anything, you can simply omit it. Note however, if the `error` method is not provided and an error happens,\n * it will be thrown asynchronously. Errors thrown asynchronously cannot be caught using `try`/`catch`. Instead,\n * use the {@link onUnhandledError} configuration option or use a runtime handler (like `window.onerror` or\n * `process.on('error)`) to be notified of unhandled errors. Because of this, it's recommended that you provide\n * an `error` method to avoid missing thrown errors.\n *\n * The second way is to give up on Observer object altogether and simply provide callback functions in place of its methods.\n * This means you can provide three functions as arguments to `subscribe`, where the first function is equivalent\n * of a `next` method, the second of an `error` method and the third of a `complete` method. Just as in case of an Observer,\n * if you do not need to listen for something, you can omit a function by passing `undefined` or `null`,\n * since `subscribe` recognizes these functions by where they were placed in function call. When it comes\n * to the `error` function, as with an Observer, if not provided, errors emitted by an Observable will be thrown asynchronously.\n *\n * You can, however, subscribe with no parameters at all. This may be the case where you're not interested in terminal events\n * and you also handled emissions internally by using operators (e.g. using `tap`).\n *\n * Whichever style of calling `subscribe` you use, in both cases it returns a Subscription object.\n * This object allows you to call `unsubscribe` on it, which in turn will stop the work that an Observable does and will clean\n * up all resources that an Observable used. Note that cancelling a subscription will not call `complete` callback\n * provided to `subscribe` function, which is reserved for a regular completion signal that comes from an Observable.\n *\n * Remember that callbacks provided to `subscribe` are not guaranteed to be called asynchronously.\n * It is an Observable itself that decides when these functions will be called. For example {@link of}\n * by default emits all its values synchronously. Always check documentation for how given Observable\n * will behave when subscribed and if its default behavior can be modified with a `scheduler`.\n *\n * #### Examples\n *\n * Subscribe with an {@link guide/observer Observer}\n *\n * ```ts\n * import { of } from 'rxjs';\n *\n * const sumObserver = {\n * sum: 0,\n * next(value) {\n * console.log('Adding: ' + value);\n * this.sum = this.sum + value;\n * },\n * error() {\n * // We actually could just remove this method,\n * // since we do not really care about errors right now.\n * },\n * complete() {\n * console.log('Sum equals: ' + this.sum);\n * }\n * };\n *\n * of(1, 2, 3) // Synchronously emits 1, 2, 3 and then completes.\n * .subscribe(sumObserver);\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Subscribe with functions ({@link deprecations/subscribe-arguments deprecated})\n *\n * ```ts\n * import { of } from 'rxjs'\n *\n * let sum = 0;\n *\n * of(1, 2, 3).subscribe(\n * value => {\n * console.log('Adding: ' + value);\n * sum = sum + value;\n * },\n * undefined,\n * () => console.log('Sum equals: ' + sum)\n * );\n *\n * // Logs:\n * // 'Adding: 1'\n * // 'Adding: 2'\n * // 'Adding: 3'\n * // 'Sum equals: 6'\n * ```\n *\n * Cancel a subscription\n *\n * ```ts\n * import { interval } from 'rxjs';\n *\n * const subscription = interval(1000).subscribe({\n * next(num) {\n * console.log(num)\n * },\n * complete() {\n * // Will not be called, even when cancelling subscription.\n * console.log('completed!');\n * }\n * });\n *\n * setTimeout(() => {\n * subscription.unsubscribe();\n * console.log('unsubscribed!');\n * }, 2500);\n *\n * // Logs:\n * // 0 after 1s\n * // 1 after 2s\n * // 'unsubscribed!' after 2.5s\n * ```\n *\n * @param {Observer|Function} observerOrNext (optional) Either an observer with methods to be called,\n * or the first of three possible handlers, which is the handler for each value emitted from the subscribed\n * Observable.\n * @param {Function} error (optional) A handler for a terminal event resulting from an error. If no error handler is provided,\n * the error will be thrown asynchronously as unhandled.\n * @param {Function} complete (optional) A handler for a terminal event resulting from successful completion.\n * @return {Subscription} a subscription reference to the registered handlers\n * @method subscribe\n */\n subscribe(\n observerOrNext?: Partial> | ((value: T) => void) | null,\n error?: ((error: any) => void) | null,\n complete?: (() => void) | null\n ): Subscription {\n const subscriber = isSubscriber(observerOrNext) ? observerOrNext : new SafeSubscriber(observerOrNext, error, complete);\n\n errorContext(() => {\n const { operator, source } = this;\n subscriber.add(\n operator\n ? // We're dealing with a subscription in the\n // operator chain to one of our lifted operators.\n operator.call(subscriber, source)\n : source\n ? // If `source` has a value, but `operator` does not, something that\n // had intimate knowledge of our API, like our `Subject`, must have\n // set it. We're going to just call `_subscribe` directly.\n this._subscribe(subscriber)\n : // In all other cases, we're likely wrapping a user-provided initializer\n // function, so we need to catch errors and handle them appropriately.\n this._trySubscribe(subscriber)\n );\n });\n\n return subscriber;\n }\n\n /** @internal */\n protected _trySubscribe(sink: Subscriber): TeardownLogic {\n try {\n return this._subscribe(sink);\n } catch (err) {\n // We don't need to return anything in this case,\n // because it's just going to try to `add()` to a subscription\n // above.\n sink.error(err);\n }\n }\n\n /**\n * Used as a NON-CANCELLABLE means of subscribing to an observable, for use with\n * APIs that expect promises, like `async/await`. You cannot unsubscribe from this.\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * #### Example\n *\n * ```ts\n * import { interval, take } from 'rxjs';\n *\n * const source$ = interval(1000).pipe(take(4));\n *\n * async function getTotal() {\n * let total = 0;\n *\n * await source$.forEach(value => {\n * total += value;\n * console.log('observable -> ' + value);\n * });\n *\n * return total;\n * }\n *\n * getTotal().then(\n * total => console.log('Total: ' + total)\n * );\n *\n * // Expected:\n * // 'observable -> 0'\n * // 'observable -> 1'\n * // 'observable -> 2'\n * // 'observable -> 3'\n * // 'Total: 6'\n * ```\n *\n * @param next a handler for each value emitted by the observable\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n */\n forEach(next: (value: T) => void): Promise;\n\n /**\n * @param next a handler for each value emitted by the observable\n * @param promiseCtor a constructor function used to instantiate the Promise\n * @return a promise that either resolves on observable completion or\n * rejects with the handled error\n * @deprecated Passing a Promise constructor will no longer be available\n * in upcoming versions of RxJS. This is because it adds weight to the library, for very\n * little benefit. If you need this functionality, it is recommended that you either\n * polyfill Promise, or you create an adapter to convert the returned native promise\n * to whatever promise implementation you wanted. Will be removed in v8.\n */\n forEach(next: (value: T) => void, promiseCtor: PromiseConstructorLike): Promise;\n\n forEach(next: (value: T) => void, promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n const subscriber = new SafeSubscriber({\n next: (value) => {\n try {\n next(value);\n } catch (err) {\n reject(err);\n subscriber.unsubscribe();\n }\n },\n error: reject,\n complete: resolve,\n });\n this.subscribe(subscriber);\n }) as Promise;\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): TeardownLogic {\n return this.source?.subscribe(subscriber);\n }\n\n /**\n * An interop point defined by the es7-observable spec https://github.com/zenparsing/es-observable\n * @method Symbol.observable\n * @return {Observable} this instance of the observable\n */\n [Symbol_observable]() {\n return this;\n }\n\n /* tslint:disable:max-line-length */\n pipe(): Observable;\n pipe(op1: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction): Observable;\n pipe(op1: OperatorFunction, op2: OperatorFunction, op3: OperatorFunction): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction\n ): Observable;\n pipe(\n op1: OperatorFunction,\n op2: OperatorFunction,\n op3: OperatorFunction,\n op4: OperatorFunction,\n op5: OperatorFunction,\n op6: OperatorFunction,\n op7: OperatorFunction,\n op8: OperatorFunction,\n op9: OperatorFunction,\n ...operations: OperatorFunction[]\n ): Observable;\n /* tslint:enable:max-line-length */\n\n /**\n * Used to stitch together functional operators into a chain.\n * @method pipe\n * @return {Observable} the Observable result of all of the operators having\n * been called in the order they were passed in.\n *\n * ## Example\n *\n * ```ts\n * import { interval, filter, map, scan } from 'rxjs';\n *\n * interval(1000)\n * .pipe(\n * filter(x => x % 2 === 0),\n * map(x => x + x),\n * scan((acc, x) => acc + x)\n * )\n * .subscribe(x => console.log(x));\n * ```\n */\n pipe(...operations: OperatorFunction[]): Observable {\n return pipeFromArray(operations)(this);\n }\n\n /* tslint:disable:max-line-length */\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: typeof Promise): Promise;\n /** @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise */\n toPromise(PromiseCtor: PromiseConstructorLike): Promise;\n /* tslint:enable:max-line-length */\n\n /**\n * Subscribe to this Observable and get a Promise resolving on\n * `complete` with the last emission (if any).\n *\n * **WARNING**: Only use this with observables you *know* will complete. If the source\n * observable does not complete, you will end up with a promise that is hung up, and\n * potentially all of the state of an async function hanging out in memory. To avoid\n * this situation, look into adding something like {@link timeout}, {@link take},\n * {@link takeWhile}, or {@link takeUntil} amongst others.\n *\n * @method toPromise\n * @param [promiseCtor] a constructor function used to instantiate\n * the Promise\n * @return A Promise that resolves with the last value emit, or\n * rejects on an error. If there were no emissions, Promise\n * resolves with undefined.\n * @deprecated Replaced with {@link firstValueFrom} and {@link lastValueFrom}. Will be removed in v8. Details: https://rxjs.dev/deprecations/to-promise\n */\n toPromise(promiseCtor?: PromiseConstructorLike): Promise {\n promiseCtor = getPromiseCtor(promiseCtor);\n\n return new promiseCtor((resolve, reject) => {\n let value: T | undefined;\n this.subscribe(\n (x: T) => (value = x),\n (err: any) => reject(err),\n () => resolve(value)\n );\n }) as Promise;\n }\n}\n\n/**\n * Decides between a passed promise constructor from consuming code,\n * A default configured promise constructor, and the native promise\n * constructor and returns it. If nothing can be found, it will throw\n * an error.\n * @param promiseCtor The optional promise constructor to passed by consuming code\n */\nfunction getPromiseCtor(promiseCtor: PromiseConstructorLike | undefined) {\n return promiseCtor ?? config.Promise ?? Promise;\n}\n\nfunction isObserver(value: any): value is Observer {\n return value && isFunction(value.next) && isFunction(value.error) && isFunction(value.complete);\n}\n\nfunction isSubscriber(value: any): value is Subscriber {\n return (value && value instanceof Subscriber) || (isObserver(value) && isSubscription(value));\n}\n", "import { Observable } from '../Observable';\nimport { Subscriber } from '../Subscriber';\nimport { OperatorFunction } from '../types';\nimport { isFunction } from './isFunction';\n\n/**\n * Used to determine if an object is an Observable with a lift function.\n */\nexport function hasLift(source: any): source is { lift: InstanceType['lift'] } {\n return isFunction(source?.lift);\n}\n\n/**\n * Creates an `OperatorFunction`. Used to define operators throughout the library in a concise way.\n * @param init The logic to connect the liftedSource to the subscriber at the moment of subscription.\n */\nexport function operate(\n init: (liftedSource: Observable, subscriber: Subscriber) => (() => void) | void\n): OperatorFunction {\n return (source: Observable) => {\n if (hasLift(source)) {\n return source.lift(function (this: Subscriber, liftedSource: Observable) {\n try {\n return init(liftedSource, this);\n } catch (err) {\n this.error(err);\n }\n });\n }\n throw new TypeError('Unable to lift unknown Observable type');\n };\n}\n", "import { Subscriber } from '../Subscriber';\n\n/**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional teardown logic here. This will only be called on teardown if the\n * subscriber itself is not already closed. This is called after all other teardown logic is executed.\n */\nexport function createOperatorSubscriber(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n onFinalize?: () => void\n): Subscriber {\n return new OperatorSubscriber(destination, onNext, onComplete, onError, onFinalize);\n}\n\n/**\n * A generic helper for allowing operators to be created with a Subscriber and\n * use closures to capture necessary state from the operator function itself.\n */\nexport class OperatorSubscriber extends Subscriber {\n /**\n * Creates an instance of an `OperatorSubscriber`.\n * @param destination The downstream subscriber.\n * @param onNext Handles next values, only called if this subscriber is not stopped or closed. Any\n * error that occurs in this function is caught and sent to the `error` method of this subscriber.\n * @param onError Handles errors from the subscription, any errors that occur in this handler are caught\n * and send to the `destination` error handler.\n * @param onComplete Handles completion notification from the subscription. Any errors that occur in\n * this handler are sent to the `destination` error handler.\n * @param onFinalize Additional finalization logic here. This will only be called on finalization if the\n * subscriber itself is not already closed. This is called after all other finalization logic is executed.\n * @param shouldUnsubscribe An optional check to see if an unsubscribe call should truly unsubscribe.\n * NOTE: This currently **ONLY** exists to support the strange behavior of {@link groupBy}, where unsubscription\n * to the resulting observable does not actually disconnect from the source if there are active subscriptions\n * to any grouped observable. (DO NOT EXPOSE OR USE EXTERNALLY!!!)\n */\n constructor(\n destination: Subscriber,\n onNext?: (value: T) => void,\n onComplete?: () => void,\n onError?: (err: any) => void,\n private onFinalize?: () => void,\n private shouldUnsubscribe?: () => boolean\n ) {\n // It's important - for performance reasons - that all of this class's\n // members are initialized and that they are always initialized in the same\n // order. This will ensure that all OperatorSubscriber instances have the\n // same hidden class in V8. This, in turn, will help keep the number of\n // hidden classes involved in property accesses within the base class as\n // low as possible. If the number of hidden classes involved exceeds four,\n // the property accesses will become megamorphic and performance penalties\n // will be incurred - i.e. inline caches won't be used.\n //\n // The reasons for ensuring all instances have the same hidden class are\n // further discussed in this blog post from Benedikt Meurer:\n // https://benediktmeurer.de/2018/03/23/impact-of-polymorphism-on-component-based-frameworks-like-react/\n super(destination);\n this._next = onNext\n ? function (this: OperatorSubscriber, value: T) {\n try {\n onNext(value);\n } catch (err) {\n destination.error(err);\n }\n }\n : super._next;\n this._error = onError\n ? function (this: OperatorSubscriber, err: any) {\n try {\n onError(err);\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._error;\n this._complete = onComplete\n ? function (this: OperatorSubscriber) {\n try {\n onComplete();\n } catch (err) {\n // Send any errors that occur down stream.\n destination.error(err);\n } finally {\n // Ensure finalization.\n this.unsubscribe();\n }\n }\n : super._complete;\n }\n\n unsubscribe() {\n if (!this.shouldUnsubscribe || this.shouldUnsubscribe()) {\n const { closed } = this;\n super.unsubscribe();\n // Execute additional teardown if we have any and we didn't already do so.\n !closed && this.onFinalize?.();\n }\n }\n}\n", "import { Subscription } from '../Subscription';\n\ninterface AnimationFrameProvider {\n schedule(callback: FrameRequestCallback): Subscription;\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n delegate:\n | {\n requestAnimationFrame: typeof requestAnimationFrame;\n cancelAnimationFrame: typeof cancelAnimationFrame;\n }\n | undefined;\n}\n\nexport const animationFrameProvider: AnimationFrameProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n schedule(callback) {\n let request = requestAnimationFrame;\n let cancel: typeof cancelAnimationFrame | undefined = cancelAnimationFrame;\n const { delegate } = animationFrameProvider;\n if (delegate) {\n request = delegate.requestAnimationFrame;\n cancel = delegate.cancelAnimationFrame;\n }\n const handle = request((timestamp) => {\n // Clear the cancel function. The request has been fulfilled, so\n // attempting to cancel the request upon unsubscription would be\n // pointless.\n cancel = undefined;\n callback(timestamp);\n });\n return new Subscription(() => cancel?.(handle));\n },\n requestAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.requestAnimationFrame || requestAnimationFrame)(...args);\n },\n cancelAnimationFrame(...args) {\n const { delegate } = animationFrameProvider;\n return (delegate?.cancelAnimationFrame || cancelAnimationFrame)(...args);\n },\n delegate: undefined,\n};\n", "import { createErrorClass } from './createErrorClass';\n\nexport interface ObjectUnsubscribedError extends Error {}\n\nexport interface ObjectUnsubscribedErrorCtor {\n /**\n * @deprecated Internal implementation detail. Do not construct error instances.\n * Cannot be tagged as internal: https://github.com/ReactiveX/rxjs/issues/6269\n */\n new (): ObjectUnsubscribedError;\n}\n\n/**\n * An error thrown when an action is invalid because the object has been\n * unsubscribed.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n *\n * @class ObjectUnsubscribedError\n */\nexport const ObjectUnsubscribedError: ObjectUnsubscribedErrorCtor = createErrorClass(\n (_super) =>\n function ObjectUnsubscribedErrorImpl(this: any) {\n _super(this);\n this.name = 'ObjectUnsubscribedError';\n this.message = 'object unsubscribed';\n }\n);\n", "import { Operator } from './Operator';\nimport { Observable } from './Observable';\nimport { Subscriber } from './Subscriber';\nimport { Subscription, EMPTY_SUBSCRIPTION } from './Subscription';\nimport { Observer, SubscriptionLike, TeardownLogic } from './types';\nimport { ObjectUnsubscribedError } from './util/ObjectUnsubscribedError';\nimport { arrRemove } from './util/arrRemove';\nimport { errorContext } from './util/errorContext';\n\n/**\n * A Subject is a special type of Observable that allows values to be\n * multicasted to many Observers. Subjects are like EventEmitters.\n *\n * Every Subject is an Observable and an Observer. You can subscribe to a\n * Subject, and you can call next to feed values as well as error and complete.\n */\nexport class Subject extends Observable implements SubscriptionLike {\n closed = false;\n\n private currentObservers: Observer[] | null = null;\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n observers: Observer[] = [];\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n isStopped = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n hasError = false;\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n thrownError: any = null;\n\n /**\n * Creates a \"subject\" by basically gluing an observer to an observable.\n *\n * @nocollapse\n * @deprecated Recommended you do not use. Will be removed at some point in the future. Plans for replacement still under discussion.\n */\n static create: (...args: any[]) => any = (destination: Observer, source: Observable): AnonymousSubject => {\n return new AnonymousSubject(destination, source);\n };\n\n constructor() {\n // NOTE: This must be here to obscure Observable's constructor.\n super();\n }\n\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n lift(operator: Operator): Observable {\n const subject = new AnonymousSubject(this, this);\n subject.operator = operator as any;\n return subject as any;\n }\n\n /** @internal */\n protected _throwIfClosed() {\n if (this.closed) {\n throw new ObjectUnsubscribedError();\n }\n }\n\n next(value: T) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n if (!this.currentObservers) {\n this.currentObservers = Array.from(this.observers);\n }\n for (const observer of this.currentObservers) {\n observer.next(value);\n }\n }\n });\n }\n\n error(err: any) {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.hasError = this.isStopped = true;\n this.thrownError = err;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.error(err);\n }\n }\n });\n }\n\n complete() {\n errorContext(() => {\n this._throwIfClosed();\n if (!this.isStopped) {\n this.isStopped = true;\n const { observers } = this;\n while (observers.length) {\n observers.shift()!.complete();\n }\n }\n });\n }\n\n unsubscribe() {\n this.isStopped = this.closed = true;\n this.observers = this.currentObservers = null!;\n }\n\n get observed() {\n return this.observers?.length > 0;\n }\n\n /** @internal */\n protected _trySubscribe(subscriber: Subscriber): TeardownLogic {\n this._throwIfClosed();\n return super._trySubscribe(subscriber);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._checkFinalizedStatuses(subscriber);\n return this._innerSubscribe(subscriber);\n }\n\n /** @internal */\n protected _innerSubscribe(subscriber: Subscriber) {\n const { hasError, isStopped, observers } = this;\n if (hasError || isStopped) {\n return EMPTY_SUBSCRIPTION;\n }\n this.currentObservers = null;\n observers.push(subscriber);\n return new Subscription(() => {\n this.currentObservers = null;\n arrRemove(observers, subscriber);\n });\n }\n\n /** @internal */\n protected _checkFinalizedStatuses(subscriber: Subscriber) {\n const { hasError, thrownError, isStopped } = this;\n if (hasError) {\n subscriber.error(thrownError);\n } else if (isStopped) {\n subscriber.complete();\n }\n }\n\n /**\n * Creates a new Observable with this Subject as the source. You can do this\n * to create custom Observer-side logic of the Subject and conceal it from\n * code that uses the Observable.\n * @return {Observable} Observable that the Subject casts to\n */\n asObservable(): Observable {\n const observable: any = new Observable();\n observable.source = this;\n return observable;\n }\n}\n\n/**\n * @class AnonymousSubject\n */\nexport class AnonymousSubject extends Subject {\n constructor(\n /** @deprecated Internal implementation detail, do not use directly. Will be made internal in v8. */\n public destination?: Observer,\n source?: Observable\n ) {\n super();\n this.source = source;\n }\n\n next(value: T) {\n this.destination?.next?.(value);\n }\n\n error(err: any) {\n this.destination?.error?.(err);\n }\n\n complete() {\n this.destination?.complete?.();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n return this.source?.subscribe(subscriber) ?? EMPTY_SUBSCRIPTION;\n }\n}\n", "import { Subject } from './Subject';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\n\n/**\n * A variant of Subject that requires an initial value and emits its current\n * value whenever it is subscribed to.\n *\n * @class BehaviorSubject\n */\nexport class BehaviorSubject extends Subject {\n constructor(private _value: T) {\n super();\n }\n\n get value(): T {\n return this.getValue();\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n const subscription = super._subscribe(subscriber);\n !subscription.closed && subscriber.next(this._value);\n return subscription;\n }\n\n getValue(): T {\n const { hasError, thrownError, _value } = this;\n if (hasError) {\n throw thrownError;\n }\n this._throwIfClosed();\n return _value;\n }\n\n next(value: T): void {\n super.next((this._value = value));\n }\n}\n", "import { TimestampProvider } from '../types';\n\ninterface DateTimestampProvider extends TimestampProvider {\n delegate: TimestampProvider | undefined;\n}\n\nexport const dateTimestampProvider: DateTimestampProvider = {\n now() {\n // Use the variable rather than `this` so that the function can be called\n // without being bound to the provider.\n return (dateTimestampProvider.delegate || Date).now();\n },\n delegate: undefined,\n};\n", "import { Subject } from './Subject';\nimport { TimestampProvider } from './types';\nimport { Subscriber } from './Subscriber';\nimport { Subscription } from './Subscription';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * A variant of {@link Subject} that \"replays\" old values to new subscribers by emitting them when they first subscribe.\n *\n * `ReplaySubject` has an internal buffer that will store a specified number of values that it has observed. Like `Subject`,\n * `ReplaySubject` \"observes\" values by having them passed to its `next` method. When it observes a value, it will store that\n * value for a time determined by the configuration of the `ReplaySubject`, as passed to its constructor.\n *\n * When a new subscriber subscribes to the `ReplaySubject` instance, it will synchronously emit all values in its buffer in\n * a First-In-First-Out (FIFO) manner. The `ReplaySubject` will also complete, if it has observed completion; and it will\n * error if it has observed an error.\n *\n * There are two main configuration items to be concerned with:\n *\n * 1. `bufferSize` - This will determine how many items are stored in the buffer, defaults to infinite.\n * 2. `windowTime` - The amount of time to hold a value in the buffer before removing it from the buffer.\n *\n * Both configurations may exist simultaneously. So if you would like to buffer a maximum of 3 values, as long as the values\n * are less than 2 seconds old, you could do so with a `new ReplaySubject(3, 2000)`.\n *\n * ### Differences with BehaviorSubject\n *\n * `BehaviorSubject` is similar to `new ReplaySubject(1)`, with a couple of exceptions:\n *\n * 1. `BehaviorSubject` comes \"primed\" with a single value upon construction.\n * 2. `ReplaySubject` will replay values, even after observing an error, where `BehaviorSubject` will not.\n *\n * @see {@link Subject}\n * @see {@link BehaviorSubject}\n * @see {@link shareReplay}\n */\nexport class ReplaySubject extends Subject {\n private _buffer: (T | number)[] = [];\n private _infiniteTimeWindow = true;\n\n /**\n * @param bufferSize The size of the buffer to replay on subscription\n * @param windowTime The amount of time the buffered items will stay buffered\n * @param timestampProvider An object with a `now()` method that provides the current timestamp. This is used to\n * calculate the amount of time something has been buffered.\n */\n constructor(\n private _bufferSize = Infinity,\n private _windowTime = Infinity,\n private _timestampProvider: TimestampProvider = dateTimestampProvider\n ) {\n super();\n this._infiniteTimeWindow = _windowTime === Infinity;\n this._bufferSize = Math.max(1, _bufferSize);\n this._windowTime = Math.max(1, _windowTime);\n }\n\n next(value: T): void {\n const { isStopped, _buffer, _infiniteTimeWindow, _timestampProvider, _windowTime } = this;\n if (!isStopped) {\n _buffer.push(value);\n !_infiniteTimeWindow && _buffer.push(_timestampProvider.now() + _windowTime);\n }\n this._trimBuffer();\n super.next(value);\n }\n\n /** @internal */\n protected _subscribe(subscriber: Subscriber): Subscription {\n this._throwIfClosed();\n this._trimBuffer();\n\n const subscription = this._innerSubscribe(subscriber);\n\n const { _infiniteTimeWindow, _buffer } = this;\n // We use a copy here, so reentrant code does not mutate our array while we're\n // emitting it to a new subscriber.\n const copy = _buffer.slice();\n for (let i = 0; i < copy.length && !subscriber.closed; i += _infiniteTimeWindow ? 1 : 2) {\n subscriber.next(copy[i] as T);\n }\n\n this._checkFinalizedStatuses(subscriber);\n\n return subscription;\n }\n\n private _trimBuffer() {\n const { _bufferSize, _timestampProvider, _buffer, _infiniteTimeWindow } = this;\n // If we don't have an infinite buffer size, and we're over the length,\n // use splice to truncate the old buffer values off. Note that we have to\n // double the size for instances where we're not using an infinite time window\n // because we're storing the values and the timestamps in the same array.\n const adjustedBufferSize = (_infiniteTimeWindow ? 1 : 2) * _bufferSize;\n _bufferSize < Infinity && adjustedBufferSize < _buffer.length && _buffer.splice(0, _buffer.length - adjustedBufferSize);\n\n // Now, if we're not in an infinite time window, remove all values where the time is\n // older than what is allowed.\n if (!_infiniteTimeWindow) {\n const now = _timestampProvider.now();\n let last = 0;\n // Search the array for the first timestamp that isn't expired and\n // truncate the buffer up to that point.\n for (let i = 1; i < _buffer.length && (_buffer[i] as number) <= now; i += 2) {\n last = i;\n }\n last && _buffer.splice(0, last + 1);\n }\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Subscription } from '../Subscription';\nimport { SchedulerAction } from '../types';\n\n/**\n * A unit of work to be executed in a `scheduler`. An action is typically\n * created from within a {@link SchedulerLike} and an RxJS user does not need to concern\n * themselves about creating and manipulating an Action.\n *\n * ```ts\n * class Action extends Subscription {\n * new (scheduler: Scheduler, work: (state?: T) => void);\n * schedule(state?: T, delay: number = 0): Subscription;\n * }\n * ```\n *\n * @class Action\n */\nexport class Action extends Subscription {\n constructor(scheduler: Scheduler, work: (this: SchedulerAction, state?: T) => void) {\n super();\n }\n /**\n * Schedules this action on its parent {@link SchedulerLike} for execution. May be passed\n * some context object, `state`. May happen at some point in the future,\n * according to the `delay` parameter, if specified.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler.\n * @return {void}\n */\n public schedule(state?: T, delay: number = 0): Subscription {\n return this;\n }\n}\n", "import type { TimerHandle } from './timerHandle';\ntype SetIntervalFunction = (handler: () => void, timeout?: number, ...args: any[]) => TimerHandle;\ntype ClearIntervalFunction = (handle: TimerHandle) => void;\n\ninterface IntervalProvider {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n delegate:\n | {\n setInterval: SetIntervalFunction;\n clearInterval: ClearIntervalFunction;\n }\n | undefined;\n}\n\nexport const intervalProvider: IntervalProvider = {\n // When accessing the delegate, use the variable rather than `this` so that\n // the functions can be called without being bound to the provider.\n setInterval(handler: () => void, timeout?: number, ...args) {\n const { delegate } = intervalProvider;\n if (delegate?.setInterval) {\n return delegate.setInterval(handler, timeout, ...args);\n }\n return setInterval(handler, timeout, ...args);\n },\n clearInterval(handle) {\n const { delegate } = intervalProvider;\n return (delegate?.clearInterval || clearInterval)(handle as any);\n },\n delegate: undefined,\n};\n", "import { Action } from './Action';\nimport { SchedulerAction } from '../types';\nimport { Subscription } from '../Subscription';\nimport { AsyncScheduler } from './AsyncScheduler';\nimport { intervalProvider } from './intervalProvider';\nimport { arrRemove } from '../util/arrRemove';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncAction extends Action {\n public id: TimerHandle | undefined;\n public state?: T;\n // @ts-ignore: Property has no initializer and is not definitely assigned\n public delay: number;\n protected pending: boolean = false;\n\n constructor(protected scheduler: AsyncScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (this.closed) {\n return this;\n }\n\n // Always replace the current state with the new state.\n this.state = state;\n\n const id = this.id;\n const scheduler = this.scheduler;\n\n //\n // Important implementation note:\n //\n // Actions only execute once by default, unless rescheduled from within the\n // scheduled callback. This allows us to implement single and repeat\n // actions via the same code path, without adding API surface area, as well\n // as mimic traditional recursion but across asynchronous boundaries.\n //\n // However, JS runtimes and timers distinguish between intervals achieved by\n // serial `setTimeout` calls vs. a single `setInterval` call. An interval of\n // serial `setTimeout` calls can be individually delayed, which delays\n // scheduling the next `setTimeout`, and so on. `setInterval` attempts to\n // guarantee the interval callback will be invoked more precisely to the\n // interval period, regardless of load.\n //\n // Therefore, we use `setInterval` to schedule single and repeat actions.\n // If the action reschedules itself with the same delay, the interval is not\n // canceled. If the action doesn't reschedule, or reschedules with a\n // different delay, the interval will be canceled after scheduled callback\n // execution.\n //\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, delay);\n }\n\n // Set the pending flag indicating that this action has been scheduled, or\n // has recursively rescheduled itself.\n this.pending = true;\n\n this.delay = delay;\n // If this action has already an async Id, don't request a new one.\n this.id = this.id ?? this.requestAsyncId(scheduler, this.id, delay);\n\n return this;\n }\n\n protected requestAsyncId(scheduler: AsyncScheduler, _id?: TimerHandle, delay: number = 0): TimerHandle {\n return intervalProvider.setInterval(scheduler.flush.bind(scheduler, this), delay);\n }\n\n protected recycleAsyncId(_scheduler: AsyncScheduler, id?: TimerHandle, delay: number | null = 0): TimerHandle | undefined {\n // If this action is rescheduled with the same delay time, don't clear the interval id.\n if (delay != null && this.delay === delay && this.pending === false) {\n return id;\n }\n // Otherwise, if the action's delay time is different from the current delay,\n // or the action has been rescheduled before it's executed, clear the interval id\n if (id != null) {\n intervalProvider.clearInterval(id);\n }\n\n return undefined;\n }\n\n /**\n * Immediately executes this action and the `work` it contains.\n * @return {any}\n */\n public execute(state: T, delay: number): any {\n if (this.closed) {\n return new Error('executing a cancelled action');\n }\n\n this.pending = false;\n const error = this._execute(state, delay);\n if (error) {\n return error;\n } else if (this.pending === false && this.id != null) {\n // Dequeue if the action didn't reschedule itself. Don't call\n // unsubscribe(), because the action could reschedule later.\n // For example:\n // ```\n // scheduler.schedule(function doWork(counter) {\n // /* ... I'm a busy worker bee ... */\n // var originalAction = this;\n // /* wait 100ms before rescheduling the action */\n // setTimeout(function () {\n // originalAction.schedule(counter + 1);\n // }, 100);\n // }, 1000);\n // ```\n this.id = this.recycleAsyncId(this.scheduler, this.id, null);\n }\n }\n\n protected _execute(state: T, _delay: number): any {\n let errored: boolean = false;\n let errorValue: any;\n try {\n this.work(state);\n } catch (e) {\n errored = true;\n // HACK: Since code elsewhere is relying on the \"truthiness\" of the\n // return here, we can't have it return \"\" or 0 or false.\n // TODO: Clean this up when we refactor schedulers mid-version-8 or so.\n errorValue = e ? e : new Error('Scheduled action threw falsy error');\n }\n if (errored) {\n this.unsubscribe();\n return errorValue;\n }\n }\n\n unsubscribe() {\n if (!this.closed) {\n const { id, scheduler } = this;\n const { actions } = scheduler;\n\n this.work = this.state = this.scheduler = null!;\n this.pending = false;\n\n arrRemove(actions, this);\n if (id != null) {\n this.id = this.recycleAsyncId(scheduler, id, null);\n }\n\n this.delay = null!;\n super.unsubscribe();\n }\n }\n}\n", "import { Action } from './scheduler/Action';\nimport { Subscription } from './Subscription';\nimport { SchedulerLike, SchedulerAction } from './types';\nimport { dateTimestampProvider } from './scheduler/dateTimestampProvider';\n\n/**\n * An execution context and a data structure to order tasks and schedule their\n * execution. Provides a notion of (potentially virtual) time, through the\n * `now()` getter method.\n *\n * Each unit of work in a Scheduler is called an `Action`.\n *\n * ```ts\n * class Scheduler {\n * now(): number;\n * schedule(work, delay?, state?): Subscription;\n * }\n * ```\n *\n * @class Scheduler\n * @deprecated Scheduler is an internal implementation detail of RxJS, and\n * should not be used directly. Rather, create your own class and implement\n * {@link SchedulerLike}. Will be made internal in v8.\n */\nexport class Scheduler implements SchedulerLike {\n public static now: () => number = dateTimestampProvider.now;\n\n constructor(private schedulerActionCtor: typeof Action, now: () => number = Scheduler.now) {\n this.now = now;\n }\n\n /**\n * A getter method that returns a number representing the current time\n * (at the time this function was called) according to the scheduler's own\n * internal clock.\n * @return {number} A number that represents the current time. May or may not\n * have a relation to wall-clock time. May or may not refer to a time unit\n * (e.g. milliseconds).\n */\n public now: () => number;\n\n /**\n * Schedules a function, `work`, for execution. May happen at some point in\n * the future, according to the `delay` parameter, if specified. May be passed\n * some context object, `state`, which will be passed to the `work` function.\n *\n * The given arguments will be processed an stored as an Action object in a\n * queue of actions.\n *\n * @param {function(state: ?T): ?Subscription} work A function representing a\n * task, or some unit of work to be executed by the Scheduler.\n * @param {number} [delay] Time to wait before executing the work, where the\n * time unit is implicit and defined by the Scheduler itself.\n * @param {T} [state] Some contextual data that the `work` function uses when\n * called by the Scheduler.\n * @return {Subscription} A subscription in order to be able to unsubscribe\n * the scheduled work.\n */\n public schedule(work: (this: SchedulerAction, state?: T) => void, delay: number = 0, state?: T): Subscription {\n return new this.schedulerActionCtor(this, work).schedule(state, delay);\n }\n}\n", "import { Scheduler } from '../Scheduler';\nimport { Action } from './Action';\nimport { AsyncAction } from './AsyncAction';\nimport { TimerHandle } from './timerHandle';\n\nexport class AsyncScheduler extends Scheduler {\n public actions: Array> = [];\n /**\n * A flag to indicate whether the Scheduler is currently executing a batch of\n * queued actions.\n * @type {boolean}\n * @internal\n */\n public _active: boolean = false;\n /**\n * An internal ID used to track the latest asynchronous task such as those\n * coming from `setTimeout`, `setInterval`, `requestAnimationFrame`, and\n * others.\n * @type {any}\n * @internal\n */\n public _scheduled: TimerHandle | undefined;\n\n constructor(SchedulerAction: typeof Action, now: () => number = Scheduler.now) {\n super(SchedulerAction, now);\n }\n\n public flush(action: AsyncAction): void {\n const { actions } = this;\n\n if (this._active) {\n actions.push(action);\n return;\n }\n\n let error: any;\n this._active = true;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions.shift()!)); // exhaust the scheduler queue\n\n this._active = false;\n\n if (error) {\n while ((action = actions.shift()!)) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\n/**\n *\n * Async Scheduler\n *\n * Schedule task as if you used setTimeout(task, duration)\n *\n * `async` scheduler schedules tasks asynchronously, by putting them on the JavaScript\n * event loop queue. It is best used to delay tasks in time or to schedule tasks repeating\n * in intervals.\n *\n * If you just want to \"defer\" task, that is to perform it right after currently\n * executing synchronous code ends (commonly achieved by `setTimeout(deferredTask, 0)`),\n * better choice will be the {@link asapScheduler} scheduler.\n *\n * ## Examples\n * Use async scheduler to delay task\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * const task = () => console.log('it works!');\n *\n * asyncScheduler.schedule(task, 2000);\n *\n * // After 2 seconds logs:\n * // \"it works!\"\n * ```\n *\n * Use async scheduler to repeat task in intervals\n * ```ts\n * import { asyncScheduler } from 'rxjs';\n *\n * function task(state) {\n * console.log(state);\n * this.schedule(state + 1, 1000); // `this` references currently executing Action,\n * // which we reschedule with new state and delay\n * }\n *\n * asyncScheduler.schedule(task, 3000, 0);\n *\n * // Logs:\n * // 0 after 3s\n * // 1 after 4s\n * // 2 after 5s\n * // 3 after 6s\n * ```\n */\n\nexport const asyncScheduler = new AsyncScheduler(AsyncAction);\n\n/**\n * @deprecated Renamed to {@link asyncScheduler}. Will be removed in v8.\n */\nexport const async = asyncScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { Subscription } from '../Subscription';\nimport { QueueScheduler } from './QueueScheduler';\nimport { SchedulerAction } from '../types';\nimport { TimerHandle } from './timerHandle';\n\nexport class QueueAction extends AsyncAction {\n constructor(protected scheduler: QueueScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n public schedule(state?: T, delay: number = 0): Subscription {\n if (delay > 0) {\n return super.schedule(state, delay);\n }\n this.delay = delay;\n this.state = state;\n this.scheduler.flush(this);\n return this;\n }\n\n public execute(state: T, delay: number): any {\n return delay > 0 || this.closed ? super.execute(state, delay) : this._execute(state, delay);\n }\n\n protected requestAsyncId(scheduler: QueueScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n\n if ((delay != null && delay > 0) || (delay == null && this.delay > 0)) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n\n // Otherwise flush the scheduler starting with this action.\n scheduler.flush(this);\n\n // HACK: In the past, this was returning `void`. However, `void` isn't a valid\n // `TimerHandle`, and generally the return value here isn't really used. So the\n // compromise is to return `0` which is both \"falsy\" and a valid `TimerHandle`,\n // as opposed to refactoring every other instanceo of `requestAsyncId`.\n return 0;\n }\n}\n", "import { AsyncScheduler } from './AsyncScheduler';\n\nexport class QueueScheduler extends AsyncScheduler {\n}\n", "import { QueueAction } from './QueueAction';\nimport { QueueScheduler } from './QueueScheduler';\n\n/**\n *\n * Queue Scheduler\n *\n * Put every next task on a queue, instead of executing it immediately\n *\n * `queue` scheduler, when used with delay, behaves the same as {@link asyncScheduler} scheduler.\n *\n * When used without delay, it schedules given task synchronously - executes it right when\n * it is scheduled. However when called recursively, that is when inside the scheduled task,\n * another task is scheduled with queue scheduler, instead of executing immediately as well,\n * that task will be put on a queue and wait for current one to finish.\n *\n * This means that when you execute task with `queue` scheduler, you are sure it will end\n * before any other task scheduled with that scheduler will start.\n *\n * ## Examples\n * Schedule recursively first, then do something\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(() => {\n * queueScheduler.schedule(() => console.log('second')); // will not happen now, but will be put on a queue\n *\n * console.log('first');\n * });\n *\n * // Logs:\n * // \"first\"\n * // \"second\"\n * ```\n *\n * Reschedule itself recursively\n * ```ts\n * import { queueScheduler } from 'rxjs';\n *\n * queueScheduler.schedule(function(state) {\n * if (state !== 0) {\n * console.log('before', state);\n * this.schedule(state - 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * console.log('after', state);\n * }\n * }, 0, 3);\n *\n * // In scheduler that runs recursively, you would expect:\n * // \"before\", 3\n * // \"before\", 2\n * // \"before\", 1\n * // \"after\", 1\n * // \"after\", 2\n * // \"after\", 3\n *\n * // But with queue it logs:\n * // \"before\", 3\n * // \"after\", 3\n * // \"before\", 2\n * // \"after\", 2\n * // \"before\", 1\n * // \"after\", 1\n * ```\n */\n\nexport const queueScheduler = new QueueScheduler(QueueAction);\n\n/**\n * @deprecated Renamed to {@link queueScheduler}. Will be removed in v8.\n */\nexport const queue = queueScheduler;\n", "import { AsyncAction } from './AsyncAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\nimport { SchedulerAction } from '../types';\nimport { animationFrameProvider } from './animationFrameProvider';\nimport { TimerHandle } from './timerHandle';\n\nexport class AnimationFrameAction extends AsyncAction {\n constructor(protected scheduler: AnimationFrameScheduler, protected work: (this: SchedulerAction, state?: T) => void) {\n super(scheduler, work);\n }\n\n protected requestAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle {\n // If delay is greater than 0, request as an async action.\n if (delay !== null && delay > 0) {\n return super.requestAsyncId(scheduler, id, delay);\n }\n // Push the action to the end of the scheduler queue.\n scheduler.actions.push(this);\n // If an animation frame has already been requested, don't request another\n // one. If an animation frame hasn't been requested yet, request one. Return\n // the current animation frame request id.\n return scheduler._scheduled || (scheduler._scheduled = animationFrameProvider.requestAnimationFrame(() => scheduler.flush(undefined)));\n }\n\n protected recycleAsyncId(scheduler: AnimationFrameScheduler, id?: TimerHandle, delay: number = 0): TimerHandle | undefined {\n // If delay exists and is greater than 0, or if the delay is null (the\n // action wasn't rescheduled) but was originally scheduled as an async\n // action, then recycle as an async action.\n if (delay != null ? delay > 0 : this.delay > 0) {\n return super.recycleAsyncId(scheduler, id, delay);\n }\n // If the scheduler queue has no remaining actions with the same async id,\n // cancel the requested animation frame and set the scheduled flag to\n // undefined so the next AnimationFrameAction will request its own.\n const { actions } = scheduler;\n if (id != null && actions[actions.length - 1]?.id !== id) {\n animationFrameProvider.cancelAnimationFrame(id as number);\n scheduler._scheduled = undefined;\n }\n // Return undefined so the action knows to request a new async id if it's rescheduled.\n return undefined;\n }\n}\n", "import { AsyncAction } from './AsyncAction';\nimport { AsyncScheduler } from './AsyncScheduler';\n\nexport class AnimationFrameScheduler extends AsyncScheduler {\n public flush(action?: AsyncAction): void {\n this._active = true;\n // The async id that effects a call to flush is stored in _scheduled.\n // Before executing an action, it's necessary to check the action's async\n // id to determine whether it's supposed to be executed in the current\n // flush.\n // Previous implementations of this method used a count to determine this,\n // but that was unsound, as actions that are unsubscribed - i.e. cancelled -\n // are removed from the actions array and that can shift actions that are\n // scheduled to be executed in a subsequent flush into positions at which\n // they are executed within the current flush.\n const flushId = this._scheduled;\n this._scheduled = undefined;\n\n const { actions } = this;\n let error: any;\n action = action || actions.shift()!;\n\n do {\n if ((error = action.execute(action.state, action.delay))) {\n break;\n }\n } while ((action = actions[0]) && action.id === flushId && actions.shift());\n\n this._active = false;\n\n if (error) {\n while ((action = actions[0]) && action.id === flushId && actions.shift()) {\n action.unsubscribe();\n }\n throw error;\n }\n }\n}\n", "import { AnimationFrameAction } from './AnimationFrameAction';\nimport { AnimationFrameScheduler } from './AnimationFrameScheduler';\n\n/**\n *\n * Animation Frame Scheduler\n *\n * Perform task when `window.requestAnimationFrame` would fire\n *\n * When `animationFrame` scheduler is used with delay, it will fall back to {@link asyncScheduler} scheduler\n * behaviour.\n *\n * Without delay, `animationFrame` scheduler can be used to create smooth browser animations.\n * It makes sure scheduled task will happen just before next browser content repaint,\n * thus performing animations as efficiently as possible.\n *\n * ## Example\n * Schedule div height animation\n * ```ts\n * // html:
\n * import { animationFrameScheduler } from 'rxjs';\n *\n * const div = document.querySelector('div');\n *\n * animationFrameScheduler.schedule(function(height) {\n * div.style.height = height + \"px\";\n *\n * this.schedule(height + 1); // `this` references currently executing Action,\n * // which we reschedule with new state\n * }, 0, 0);\n *\n * // You will see a div element growing in height\n * ```\n */\n\nexport const animationFrameScheduler = new AnimationFrameScheduler(AnimationFrameAction);\n\n/**\n * @deprecated Renamed to {@link animationFrameScheduler}. Will be removed in v8.\n */\nexport const animationFrame = animationFrameScheduler;\n", "import { Observable } from '../Observable';\nimport { SchedulerLike } from '../types';\n\n/**\n * A simple Observable that emits no items to the Observer and immediately\n * emits a complete notification.\n *\n * Just emits 'complete', and nothing else.\n *\n * ![](empty.png)\n *\n * A simple Observable that only emits the complete notification. It can be used\n * for composing with other Observables, such as in a {@link mergeMap}.\n *\n * ## Examples\n *\n * Log complete notification\n *\n * ```ts\n * import { EMPTY } from 'rxjs';\n *\n * EMPTY.subscribe({\n * next: () => console.log('Next'),\n * complete: () => console.log('Complete!')\n * });\n *\n * // Outputs\n * // Complete!\n * ```\n *\n * Emit the number 7, then complete\n *\n * ```ts\n * import { EMPTY, startWith } from 'rxjs';\n *\n * const result = EMPTY.pipe(startWith(7));\n * result.subscribe(x => console.log(x));\n *\n * // Outputs\n * // 7\n * ```\n *\n * Map and flatten only odd numbers to the sequence `'a'`, `'b'`, `'c'`\n *\n * ```ts\n * import { interval, mergeMap, of, EMPTY } from 'rxjs';\n *\n * const interval$ = interval(1000);\n * const result = interval$.pipe(\n * mergeMap(x => x % 2 === 1 ? of('a', 'b', 'c') : EMPTY),\n * );\n * result.subscribe(x => console.log(x));\n *\n * // Results in the following to the console:\n * // x is equal to the count on the interval, e.g. (0, 1, 2, 3, ...)\n * // x will occur every 1000ms\n * // if x % 2 is equal to 1, print a, b, c (each on its own)\n * // if x % 2 is not equal to 1, nothing will be output\n * ```\n *\n * @see {@link Observable}\n * @see {@link NEVER}\n * @see {@link of}\n * @see {@link throwError}\n */\nexport const EMPTY = new Observable((subscriber) => subscriber.complete());\n\n/**\n * @param scheduler A {@link SchedulerLike} to use for scheduling\n * the emission of the complete notification.\n * @deprecated Replaced with the {@link EMPTY} constant or {@link scheduled} (e.g. `scheduled([], scheduler)`). Will be removed in v8.\n */\nexport function empty(scheduler?: SchedulerLike) {\n return scheduler ? emptyScheduled(scheduler) : EMPTY;\n}\n\nfunction emptyScheduled(scheduler: SchedulerLike) {\n return new Observable((subscriber) => scheduler.schedule(() => subscriber.complete()));\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport function isScheduler(value: any): value is SchedulerLike {\n return value && isFunction(value.schedule);\n}\n", "import { SchedulerLike } from '../types';\nimport { isFunction } from './isFunction';\nimport { isScheduler } from './isScheduler';\n\nfunction last(arr: T[]): T | undefined {\n return arr[arr.length - 1];\n}\n\nexport function popResultSelector(args: any[]): ((...args: unknown[]) => unknown) | undefined {\n return isFunction(last(args)) ? args.pop() : undefined;\n}\n\nexport function popScheduler(args: any[]): SchedulerLike | undefined {\n return isScheduler(last(args)) ? args.pop() : undefined;\n}\n\nexport function popNumber(args: any[], defaultValue: number): number {\n return typeof last(args) === 'number' ? args.pop()! : defaultValue;\n}\n", "export const isArrayLike = ((x: any): x is ArrayLike => x && typeof x.length === 'number' && typeof x !== 'function');", "import { isFunction } from \"./isFunction\";\n\n/**\n * Tests to see if the object is \"thennable\".\n * @param value the object to test\n */\nexport function isPromise(value: any): value is PromiseLike {\n return isFunction(value?.then);\n}\n", "import { InteropObservable } from '../types';\nimport { observable as Symbol_observable } from '../symbol/observable';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being Observable (but not necessary an Rx Observable) */\nexport function isInteropObservable(input: any): input is InteropObservable {\n return isFunction(input[Symbol_observable]);\n}\n", "import { isFunction } from './isFunction';\n\nexport function isAsyncIterable(obj: any): obj is AsyncIterable {\n return Symbol.asyncIterator && isFunction(obj?.[Symbol.asyncIterator]);\n}\n", "/**\n * Creates the TypeError to throw if an invalid object is passed to `from` or `scheduled`.\n * @param input The object that was passed.\n */\nexport function createInvalidObservableTypeError(input: any) {\n // TODO: We should create error codes that can be looked up, so this can be less verbose.\n return new TypeError(\n `You provided ${\n input !== null && typeof input === 'object' ? 'an invalid object' : `'${input}'`\n } where a stream was expected. You can provide an Observable, Promise, ReadableStream, Array, AsyncIterable, or Iterable.`\n );\n}\n", "export function getSymbolIterator(): symbol {\n if (typeof Symbol !== 'function' || !Symbol.iterator) {\n return '@@iterator' as any;\n }\n\n return Symbol.iterator;\n}\n\nexport const iterator = getSymbolIterator();\n", "import { iterator as Symbol_iterator } from '../symbol/iterator';\nimport { isFunction } from './isFunction';\n\n/** Identifies an input as being an Iterable */\nexport function isIterable(input: any): input is Iterable {\n return isFunction(input?.[Symbol_iterator]);\n}\n", "import { ReadableStreamLike } from '../types';\nimport { isFunction } from './isFunction';\n\nexport async function* readableStreamLikeToAsyncGenerator(readableStream: ReadableStreamLike): AsyncGenerator {\n const reader = readableStream.getReader();\n try {\n while (true) {\n const { value, done } = await reader.read();\n if (done) {\n return;\n }\n yield value!;\n }\n } finally {\n reader.releaseLock();\n }\n}\n\nexport function isReadableStreamLike(obj: any): obj is ReadableStreamLike {\n // We don't want to use instanceof checks because they would return\n // false for instances from another Realm, like an +

+ + + + + + + + + + + + + + + + + + + + + + + + + + +
+ + +
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/entregas/segunda-entrega/index.html b/entregas/segunda-entrega/index.html new file mode 100644 index 0000000..bac5373 --- /dev/null +++ b/entregas/segunda-entrega/index.html @@ -0,0 +1,1408 @@ + + + + + + + + + + + + + + + + + + + + + Segunda entrega em vídeo - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+ +
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/index.html b/index.html new file mode 100644 index 0000000..6a8188f --- /dev/null +++ b/index.html @@ -0,0 +1,1498 @@ + + + + + + + + + + + + + + + + + + + + + Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Requisitos Minecraft

+

Logo Minecraft

+

Este repositório contém a documentação e artefatos que foram produzidos durante a disciplina de Requisitos de software do curso Engenharia de Software da Universidade de Brasília - Campus Gama (UnB - Gama).

+

🤝 Colaboradores

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
FotoNomeMatrículaGithub
carlosCarlos Eduardo221031265Carlos-kadu
daniloDanilo César221031149DaniloCTM
patriciaPatrícia Helena221037993patyhelenaa
SamaraSamara Letícia221008445samarawwleticia
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/modelagem/Epics/index.html b/modelagem/Epics/index.html new file mode 100644 index 0000000..4c055a3 --- /dev/null +++ b/modelagem/Epics/index.html @@ -0,0 +1,1531 @@ + + + + + + + + + + + + + + + + + + + + + + + Epics - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Epics

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
16/08/20240.1Criação do documento inicialDanilo Melo
+

Introdução

+

O modelo de Epics e Histórias de Usuários estrutura o desenvolvimento de funcionalidades no Minecraft em quatro níveis:

+
    +
  • Theme: Tema geral do jogo, como Exploração.
  • +
  • Epic: Grandes blocos de funcionalidades, como Biomas Diversos.
  • +
  • User Stories: Descrevem as necessidades do jogador, como "Quero explorar novos biomas."
  • +
  • Tasks: Tarefas técnicas que os desenvolvedores realizam para implementar as histórias de usuário.
  • +
+

Esse modelo organiza o processo de desenvolvimento de forma clara, do conceito à implementação, garantindo uma experiência de jogo coesa.

+

Modos de jogo

+

Epic - Modos de jogo

+

Exploração

+

Epic - exploracao

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/modelagem/NFR/index.html b/modelagem/NFR/index.html new file mode 100644 index 0000000..2af3362 --- /dev/null +++ b/modelagem/NFR/index.html @@ -0,0 +1,1553 @@ + + + + + + + + + + + + + + + + + + + + + + + NFR - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

NFR

+ + +

Histórico de Revisão

+ + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
21/08/20240.1Criação do documento e adição do NFR de usabilidadePatricia Helena
21/08/20240.2Adição do NFR de DesempenhoPatricia Helena
+

Introdução

+

O modelo NFR Framework é voltado para a condução da Engenharia de Requisitos com ênfase em requisitos não funcionais, incluindo uma extensão que apoia a análise de suposições para verificar a satisfação das metas flexíveis.

+

Usabilidade

+

NFR-Usabilidade

+

Versão 1 - Autora: Patricia Helena

+ +

Desempenho

+

NFR-Desempenho

+

Versão 1 - Autora: Patricia Helena

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/modelagem/backlog/index.html b/modelagem/backlog/index.html new file mode 100644 index 0000000..61402aa --- /dev/null +++ b/modelagem/backlog/index.html @@ -0,0 +1,1738 @@ + + + + + + + + + + + + + + + + + + + + + + + Backlog do Produto - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Backlog do Produto

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
21/08/20240.1Criação do documento e adição dos requisitos de US001 a US031Danilo Melo
08/09/20240.2Adição dos temas nos items e linkagens com os termos do léxicoDanilo Melo
+

Metodologia

+

Para o desenvolvimento do backlog do produto, foram utilizados como base os artefatos do brainstorming, introspecção e casos de uso.

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
IDTemaEu, comoDesejoPara que eu possa
US001Criação de mundoUsuárioCriar um novo mundo no minecraftComeçar a jogar
US002Modos de jogoUsuárioSelecionar o modo de jogoJogar de diferentes formas
US003DificuldadeUsuárioSelecionar a dificuldade do mundoTer um jogo mais desafiador
US004Carregar mundoUsuárioCarregar um mundo existenteAcessar mundos existentes
US005ExploraçãoUsuárioMe movimentarExplorar o mundo
US006ExploraçãoUsuárioInteragir com o ambienteModificar o mundo
US007ExploraçãoUsuárioColetar recursosCriar novos itens e construir
US008CombateUsuárioEncontrar inimigosEnfrentar eles
US009CombateUsuárioEnfrentar inimigosAtacar eles e conseguir itens
US010CombateUsuárioUtilizar armadurasFicar mais forte
US011CombateUsuárioUtilizar poçõesFicar mais forte
US012CombateUsuárioUtilizar ferramentas de combateCausar mais dano
US013CombateUsuárioEncontrar diferentes tipos de inimigosTer uma experiência de jogo variada
US014PersonagemUsuárioTer um inventárioGuardar os meus recursos
US015PersonagemUsuárioTer uma hotbarTer acesso rápido aos meus recursos
US016PersonagemUsuárioTer uma barra de vidaVer minha vida de forma fácil
US017PersonagemUsuárioTer uma barra de fomeVer minha fome de forma fácil
US018PersonagemUsuárioTer uma barra de armaduraVer minha meu nível de armadura de forma fácil
US019PersonagemUsuárioTer uma área de craft no inventárioCriar meus itens
US020PersonagemUsuárioVer os efeitos das poçõesVer o tempo que ela vai durar
US021ConstruçãoUsuárioColocar blocosCriar construções
US022ConstruçãoUsuárioQuebrar blocosColetar recursos
US023SocialUsuárioAdicionar amigosJogar com os meus amigos
US024SocialUsuárioExcluir amigosRemover alguém da lista de amigos
US025SocialUsuárioAcessar minha lista de amigosVer quem está online
US026SocialUsuárioConvidar um amigo para jogarJogar junto com meu amigo
US027SocialUsuárioAcessar servidoresesJogar com outras pessoas
US028JogabilidadeUsuárioCriar diferentes itensEvoluir no jogo e criar novas construções
US029JogabilidadeUsuárioEncantar os meus itensTer ferramentas e armaduras mais fortes
US030JogabilidadeUsuárioGanhar experiênciaPara eu subir de nível e encantar meus itens
US031SocialUsuárioCriar um servidorEu possa jogar com outras pessoas
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/modelagem/casos-de-uso/index.html b/modelagem/casos-de-uso/index.html new file mode 100644 index 0000000..f45cce9 --- /dev/null +++ b/modelagem/casos-de-uso/index.html @@ -0,0 +1,2801 @@ + + + + + + + + + + + + + + + + + + + + + + + Casos de uso - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Casos de uso

+ + +

Histórico de Revisão

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
18/08/20240.1Criação do documento inicial com diagrama e tabelas da especificação suplementarCarlos Eduardo
19/08/20240.2Linkagens com os termos do léxicoCarlos Eduardo
20/08/20240.3Adição do diagrama de criação de mundos e realmsCarlos Eduardo
+

Introdução

+

Este documento contém a especificação dos casos de uso, onde o principal objetivo é detalhar as interações entre os usuários e o sistema, uma das melhores formas para a elicitação dos requisitos funcionais.

+

Diagramas dos Casos de Uso

+

Caso de uso geral

+

Casos de uso

+

Versão 1 - Autor: Carlos Eduardo

+ +

Criação de mundos e realms

+

Casos de uso

+

Versão 1 - Autor: Carlos Eduardo

+ +

Especificação do caso de uso

+

UC01 Criar mundo

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Criar mundo
Descrição:Criar um novo mundo no Minecraft.
Ator(es):Usuário
Pré-Requisitos:Usuário deve estar no menu principal do jogo.
Fluxo Principal:1. Usuário acessa o menu "Criar Mundo".
2. Usuário configura as opções desejadas para o mundo (nome, tipo de mundo, etc.).
3. Usuário confirma a criação do mundo.
Fluxo Alternativo:1. Usuário decide cancelar a criação do mundo antes de confirmar.
2. Usuário retorna ao menu principal.
Fluxo de Exceção:1. Ocorre um erro durante a criação do mundo.
2. Usuário recebe uma mensagem de erro e é redirecionado ao menu principal.
Pós-condições:Um novo mundo é criado e carregado para o usuário explorar.
+

UC02 Selecionar modo de jogo e dificuldade

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Selecionar modo de jogo e dificuldade
Descrição:Selecionar o modo de jogo e a dificuldade para o mundo.
Ator(es):Usuário
Pré-Requisitos:Usuário deve estar no menu de criação ou edição de um mundo.
Fluxo Principal:1. Usuário acessa as configurações de modo de jogo e dificuldade.
2. Usuário seleciona o modo de jogo desejado (Sobrevivência, Criativo, Aventura, Espectador, Hardcore).
3. Usuário escolhe o nível de dificuldade (Fácil, Médio, Difícil...).
Fluxo Alternativo:1. Usuário decide manter as configurações padrão.
Fluxo de Exceção:1. Erro ao salvar as configurações.
2. Usuário é notificado e tenta novamente.
Pós-condições:Configurações de modo de jogo e dificuldade aplicadas ao mundo.
+

UC03 Carregar mundo

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Carregar mundo
Descrição:Carregar um mundo existente.
Ator(es):Usuário
Pré-Requisitos:Usuário deve estar no menu principal do jogo.
Fluxo Principal:1. Usuário acessa a lista de mundos salvos.
2. Usuário seleciona o mundo desejado.
3. Mundo é carregado e o jogador pode jogar.
Fluxo Alternativo:1. Usuário decide não carregar nenhum mundo e retorna ao menu principal.
Fluxo de Exceção:1. Ocorre um erro ao carregar o mundo.
2. Usuário é notificado e redirecionado ao menu principal.
Pós-condições:Mundo existente é carregado para o jogador.
+

UC04 Explorar mundo

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Explorar mundo
Descrição:Explorar o mundo do Minecraft.
Ator(es):Usuário
Pré-Requisitos:Mundo deve estar carregado e pronto para exploração.
Fluxo Principal:1. Usuário move o personagem pelo mundo.
2. Usuário interage com o ambiente.
3. Usuário coleta recursos ou enfrenta inimigos.
Fluxo Alternativo:1. Usuário decide construir ou modificar o ambiente durante a exploração.
Fluxo de Exceção:1. Ocorre um erro no jogo durante a exploração.
2. Usuário é notificado e o jogo pode reiniciar.
Pós-condições:O mundo é explorado.
+

UC05 Combater inimigos

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Combater inimigos
Descrição:Combater inimigos no jogo.
Ator(es):Usuário
Pré-Requisitos:Usuário deve estar em modo de sobrevivência ou similar.
Fluxo Principal:1. Usuário encontra inimigos durante a exploração.
2. Usuário usa armas ou ferramentas para atacar os inimigos.
3. Inimigos são derrotados ou o jogador é derrotado.
Fluxo Alternativo:1. Usuário decide evitar o combate e foge ou se esconde dos inimigos.
Fluxo de Exceção:1. Jogo trava durante o combate.
2. O jogo é reiniciado.
Pós-condições:Inimigos derrotados ou jogador recomeça após a derrota.
+

UC06 Proteger território

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Proteger território
Descrição:Proteger o território no jogo.
Ator(es):Usuário
Pré-Requisitos:Usuário deve ter estabelecido uma base ou local de interesse.
Fluxo Principal:1. Usuário constrói defesas ao redor do território.
2. Usuário protege o território de ataques inimigos.
3. Território permanece seguro ou é invadido.
Fluxo Alternativo:1. Usuário decide abandonar o território e mudar para um novo local.
Fluxo de Exceção:1. Defesas falham e território é invadido.
2. Usuário deve reconstruir sua base ou procurar outro local.
Pós-condições:Território protegido, abandonado ou há a necessidade de reconstrução.
+

UC07 Construir blocos

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Construir blocos
Descrição:Construir blocos no jogo.
Ator(es):Usuário
Pré-Requisitos:Usuário deve possuir blocos no inventário.
Fluxo Principal:1. Usuário seleciona os blocos no inventário.
2. Usuário posiciona os blocos no mundo conforme desejado.
3. Construção é realizada.
Fluxo Alternativo:1. Usuário decide não construir o bloco.
Fluxo de Exceção:1. Ocorre um erro ao posicionar os blocos.
2. Usuário tenta novamente ou usa outro tipo de bloco.
Pós-condições:Blocos construídos.
+

UC08 Quebrar blocos

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Quebrar blocos
Descrição:Quebrar blocos no jogo.
Ator(es):Usuário
Pré-Requisitos:Usuário deve estar equipado com uma ferramenta ou à mão livre.
Fluxo Principal:1. Usuário seleciona o bloco que deseja quebrar.
2. Usuário utiliza a ferramenta adequada ou à mão livre para quebrar o bloco.
3. Bloco é quebrado e, se for possível, coletado para o inventário.
Fluxo Alternativo:1. Usuário decide não coletar o bloco quebrado e o deixa no chão.
Fluxo de Exceção:1. Bloco não pode ser quebrado por estar protegido ou ser indestrutível.
2. Usuário desiste de quebrar o bloco ou procura outra ferramenta.
Pós-condições:Bloco é quebrado ou permanece intacto.
+

UC09 Coletar recursos

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Coletar recursos
Descrição:Coletar recursos no jogo.
Ator(es):Usuário
Pré-Requisitos:Usuário deve explorar o mundo.
Fluxo Principal:1. Usuário encontra recursos durante a exploração.
2. Usuário utiliza ferramentas ou à mão livre para coletar os recursos.
3. Recursos são adicionados ao inventário.
Fluxo Alternativo:1. Usuário decide não coletar os recursos e continua a exploração.
Fluxo de Exceção:1. Recursos são destruídos acidentalmente durante a coleta.
2. Usuário procura por mais recursos no mundo.
Pós-condições:Recursos coletados e armazenados no inventário.
+

UC10 Adicionar e gerenciar amigos

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Adicionar e gerenciar amigos
Descrição:Adicionar e gerenciar amigos no jogo.
Ator(es):Usuário
Pré-Requisitos:Usuário deve estar conectado a uma rede e ter uma conta microsoft.
Fluxo Principal:1. Usuário acessa a lista de amigos.
2. Usuário adiciona novos amigos ou gerencia os existentes.
3. Amizades são atualizadas junto ao servidor do jogo.
Fluxo Alternativo:1. Usuário decide remover ou bloquear um amigo da lista.
Fluxo de Exceção:1. Erro ao atualizar a lista de amigos.
2. Usuário tenta novamente ou entra em contato com o suporte.
Pós-condições:Amigos adicionados ou lista de amigos gerenciada.
+

UC11 Criar Itens

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Criar Itens
Descrição:Criar itens no jogo usando recursos coletados.
Ator(es):Usuário
Pré-Requisitos:Usuário deve possuir os recursos necessários no inventário.
Fluxo Principal:1. Usuário acessa a mesa de trabalho ou o menu de criação.
2. Usuário seleciona o item a ser criado.
3. Item é criado e adicionado ao inventário.
Fluxo Alternativo:1. Usuário decide não criar o item e fecha o menu de criação.
Fluxo de Exceção:1. Recursos insuficientes para criar o item.
2. Usuário coleta mais recursos e tenta novamente.
Pós-condições:Item criado e adicionado ao inventário do usuário.
+

UC12 Jogar no modo multiplayer

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Jogar no modo multiplayer
Descrição:Jogar no modo multiplayer com outros usuários.
Ator(es):Usuário
Pré-Requisitos:Usuário deve estar conectado à internet e ter uma conta no Minecraft.
Fluxo Principal:1. Usuário acessa o menu multiplayer.
2. Usuário escolhe um servidor ou insere o IP de um servidor específico.
3. Usuário conecta-se ao servidor e começa a jogar com outros jogadores.
Fluxo Alternativo:1. Usuário decide jogar em modo singleplayer e retorna ao menu principal.
Fluxo de Exceção:1. Erro de conexão com o servidor.
2. Usuário tenta conectar novamente ou escolhe outro servidor.
Pós-condições:Usuário conectado ao servidor e jogando com outros jogadores.
+

UC13 Entrar ou criar conta

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Entrar ou criar conta
Descrição:Entrar ou criar uma conta no Minecraft.
Ator(es):Usuário
Pré-Requisitos:Usuário deve ter acesso à internet.
Fluxo Principal:1. Usuário acessa o menu de login.
2. Usuário acessa a página de login da microsoft e insere as credenciais ou cria uma nova conta.
3. Usuário é autenticado e pode acessar o jogo.
Fluxo Alternativo:1. Usuário decide jogar sem se conectar a sua conta
Fluxo de Exceção:1. Erro ao criar ou entrar na conta.
2. Usuário verifica as credenciais e tenta novamente.
Pós-condições:Usuário autenticado.
+

UC14 Conectar ou adicionar um servidor

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Conectar ou adicionar um servidor
Descrição:Conectar-se a um servidor existente ou adicionar um novo.
Ator(es):Usuário
Pré-Requisitos:Usuário deve estar conectado à internet.
Fluxo Principal:1. Usuário acessa o menu de servidores.
2. Usuário seleciona um servidor existente ou insere o IP de um novo servidor.
3. Usuário conecta-se ao servidor escolhido.
Fluxo Alternativo:1. Usuário decide não se conectar a nenhum servidor e retorna ao menu principal.
Fluxo de Exceção:1. Erro ao conectar-se ao servidor.
2. Usuário tenta novamente ou escolhe outro servidor.
Pós-condições:Usuário conectado ao servidor.
+

UC15 Sair do jogo

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Sair do jogo
Descrição:Sair do jogo e retornar ao sistema operacional.
Ator(es):Usuário
Pré-Requisitos:Jogo deve estar em execução.
Fluxo Principal:1. Usuário acessa o menu de pausa ou o principal.
2. Usuário seleciona a opção de sair do jogo.
3. Jogo é fechado e usuário retorna ao SO.
Fluxo Alternativo:1. Usuário decide continuar jogando e fecha o menu.
Fluxo de Exceção:1. Jogo trava ao tentar sair.
2. Usuário força o fechamento do jogo via sistema operacional.
Pós-condições:Jogo fechado e retorno ao sistema operacional.
+

UC16 Salvar mundo

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Salvar mundo
Descrição:Salvar o progresso do mundo em que está jogando.
Ator(es):Usuário
Pré-Requisitos:Usuário deve estar jogando em um mundo.
Fluxo Principal:1. Usuário acessa o menu de pausa.
2. Usuário seleciona a opção de salvar.
3. Progresso do mundo é salvo.
Fluxo Alternativo:1. Usuário decide não salvar e continua jogando.
Fluxo de Exceção:1. Erro ao salvar o mundo.
2. Usuário tenta novamente ou verifica espaço disponível.
Pós-condições:mundo salvo e progresso garantido.
+

UC17 Configurações gerais

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Configurações gerais
Descrição:Permite ao jogador ajustar configurações gerais do mundo, como modo de jogo e dificuldade.
Ator(es):Jogador
Pré-Requisitos:O jogador deve estar na tela de configuração do mundo.
Fluxo Principal:1. O jogador acessa a seção de configurações gerais.
2. O jogador ajusta as opções de modo de jogo e dificuldade.
3. O jogador confirma as configurações e prossegue para a próxima etapa.
Fluxo Alternativo:1. O jogador decide manter as configurações padrão.
2. O jogador confirma as configurações e prossegue para a próxima etapa.
Fluxo de Exceção:1. Falha ao aplicar as configurações.
2. O jogo solicita que o jogador ajuste as configurações novamente.
Pós-condições:As configurações gerais são aplicadas e o jogador pode continuar a configuração do mundo.
+

UC18 Criar no servidor Realms

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Criar no servidor Realms
Descrição:Permite ao jogador criar um mundo no servidor Realms.
Ator(es):Jogador
Pré-Requisitos:O jogador deve estar logado em sua conta da Microsoft e ter uma assinatura ativa do Realms.
Fluxo Principal:1. O jogador seleciona a opção para criar no servidor Realms.
2. O jogador escolhe um nome e configuracões para o Realms.
3. O jogador confirma e o mundo é criado no servidor Realms.
Fluxo Alternativo:1. O jogador decide criar o mundo localmente em vez de usar o Realms.
2. O jogador retorna à opção de criação de mundo local.
Fluxo de Exceção:1. Falha ao conectar ao servidor Realms.
2. O jogo notifica o jogador e permite tentar novamente ou retornar ao menu principal.
Pós-condições:O mundo é criado no servidor Realms e fica disponível para o jogador e seus amigos convidados.
+

UC19 Selecionar grupamento

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Selecionar grupamento
Descrição:Permite ao jogador escolher a quantidade de jogadores que poderão jogar simultaneamente no servidor Realms (2 ou 10).
Ator(es):Jogador
Pré-Requisitos:O jogador deve estar na etapa de criação no servidor Realms.
Fluxo Principal:1. O jogador acessa a opção de seleção de grupamento.
2. O jogador escolhe entre as opções de 2 ou 10 jogadores.
3. O jogador confirma a escolha e prossegue com a criação.
Fluxo Alternativo:1. O jogador é direcionado à escolha padrão ou retorna à tela anterior.
Fluxo de Exceção:1. O jogador encontra problemas ao selecionar o grupamento.
2. O jogo notifica o jogador para tentar novamente ou escolher outra opção.
Pós-condições:O grupamento é selecionado, permitindo a criação do mundo com o número especificado de jogadores simultâneos.
+

UC20 Selecionar nome do realm

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Selecionar nome do realm
Descrição:Permite ao jogador escolher o nome do Realm onde o mundo será criado.
Ator(es):Jogador
Pré-Requisitos:O jogador deve estar na etapa de criação do mundo no Realms. O jogador deve estar conectado à internet.
Fluxo Principal:1. O jogador acessa a opção para nomear o Realm.
2. O jogador digita o nome desejado.
3. O jogador confirma o nome e prossegue com a criação do mundo.
Fluxo Alternativo:1. O jogador decide utilizar um nome sugerido automaticamente pelo jogo.
2. O jogador confirma o nome sugerido e prossegue.
Fluxo de Exceção:1. O nome escolhido já está em uso ou é inválido.
2. O jogo solicita que o jogador escolha outro nome.
Pós-condições:O nome do Realm é registrado e o jogador pode continuar com a criação do mundo.
+

UC21 Aceitar termos e condições realms

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Aceitar termos e condições realms
Descrição:Requer que o jogador aceite os termos e condições para utilizar o servidor Realms.
Ator(es):Jogador
Pré-Requisitos:O jogador deve estar na etapa de criação do mundo no Realms. O jogador deve estar conectado à internet.
Fluxo Principal:1. O jogador é apresentado aos termos e condições.
2. O jogador lê e aceita os termos e condições.
3. O jogador prossegue com a criação do servidor realms.
Fluxo Alternativo:1. O jogador decide não aceitar os termos e condições.
2. O jogador é impedido de prosseguir com a criação do mundo no Realms.
Fluxo de Exceção:1. Falha ao registrar a aceitação dos termos e condições.
2. O jogo solicita que o jogador tente aceitar os termos novamente.
Pós-condições:Os termos e condições são aceitos e o jogador pode continuar a criação do mundo no Realms.
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/modelagem/cenarios/index.html b/modelagem/cenarios/index.html new file mode 100644 index 0000000..c409b9d --- /dev/null +++ b/modelagem/cenarios/index.html @@ -0,0 +1,2275 @@ + + + + + + + + + + + + + + + + + + + + + + + Cenários - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Cenários

+

Histórico de Versões

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
30/07/20240.1Criação de CenáriosSamara Letícia
01/08/20240.2RevisãoDanilo Melo
06/09/20240.3Atualizações e adições de cenáriosSamara Letícia
+

Introdução

+

Os cenários são empregados como uma ferramenta para modelar as interações usuário-sistema. Essa abordagem permite detalhar os fluxos de trabalho, desde a iniciação até a conclusão de uma tarefa, considerando as diversas possibilidades e exceções. Através da análise de cenários, é possível identificar requisitos funcionais e não funcionais de forma mais precisa, garantindo a qualidade e a usabilidade do sistema desenvolvido.

+

Metodologia

+

A metodologia utilizada neste trabalho baseia-se na modelagem de casos de uso e na análise de fluxos de interação, além do uso de brainstorming.

+

Cenário 01

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Título:Dinâmica do Minecraft survival
Objetivo:Descrever o início do Minecraft
Contexto:Início de Jogo
Atores:Jogador
Recursos:Minecraft Launcher
Episódios:Jogador cria mundo
Jogador escolhe modo de jogo sobrevivência
Jogador escolhe dificuldade do jogo (pacífico, fácil, normal ou difícil)
Jogador nomeia o mundo
Jogador entra no mundo (overworld)
Restrição:Carregamento e atualizações rápidas
Começar em um bioma com bons recursos
ExceçãoLauncher não carregar o mundo
Erro na geração de biomas
Estruturas não encontradas
+

Cenário 02

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Título:Dinâmica do Minecraft criativo
Objetivo:Criar uma construção no Minecraft
Contexto:Modo de Jogo: criativo
Atores:Jogador
Recursos:Minecraft Launcher
Episódios:Jogador escolhe coordenadas da construção
Jogador abre o inventário
Jogador escolhe recursos
Jogador coloca recursos no mundo, construindo a estrutura desejada
Restrição:Bom desempenho do jogo
Localizar facilmente os recursos
ExceçãoFalta de memória para carregar a construção
Desempenho lento do jogo
+

Cenário 03

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Título:Ir ao end
Objetivo:Descrever como chegar a dimensão end
Contexto:Jogo avançado
Atores:Jogador
Recursos:Minecraft Launcher
Episódios:Jogador cria olho de ender
Jogador usa olho de ender para localizar a fortaleza
Jogador entra na sala de portal
Jogador coloca os Olhos de Ender no portal
Jogador entra no portal
Restrição:Carregamento e atualizações rápidas
Entrar na plataforma principal do End
ExceçãoLauncher não carregar o End
Cair no vazio
Não localizar a fortaleza
Não obter Ender pearls
+

Cenário 04

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Título:Derrotar o Ender Dragon
Objetivo:Derrotar o Ender Dragon e completar o jogo
Contexto:Final do jogo
Atores:Jogador
Recursos:Minecraft Launcher, armas, armaduras, poções
Episódios:Jogador encontra a fortaleza do End
Jogador ativa o portal do End
Jogador vai ao End
Jogador destrói cristais do End
Jogador ataca o Dragão até derrotá-lo
Restrição:Ter todos os itens necessários para o combate
ExceçãoLauncher não carregar o End
Cair no vazio
Não localizar a fortaleza
Ser morto pelo Ender Dragon
+

Cenário 05

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Título:Derrotar o Warden
Objetivo:Derrotar o Warden no subterrâneo
Contexto:Jogo Avançado
Atores:Jogador
Recursos:Minecraft Launcher, armadura, armas
Episódios:Jogador encontra cidade ancestral
Jogador atrai o Warden com vibrações
Jogador ataca o Warden com estratégia à distância e corpo-a-corpo
Restrição:Ter todos os itens necessários para o combate
ExceçãoJogador é derrotado pelo Warden
Jogador perde todos os itens durante a batalha
Jogador não consegue encontrar Cidade Ancestral
+

Cenário 06

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Título:Chocar um Ovo de Farejador
Objetivo:Obter um Farejador
Contexto:Jogo Avançado
Atores:Jogador
Recursos:Minecraft Launcher, pincel
Episódios:Jogador encontra ruínas
Jogador utiliza pincel nos blocos para tentar obter Ovo de Farejador
Jogador coloca ovo de farejador sobre bloco de terra ou musgo
Farejador sai do ovo depois de um determinado tempo
Restrição:Ter todos os itens necessários para crafitar um pincel
Achar Ovo de Farejador com facilidade
ExceçãoJogador não consegue localizar uma ruína
Jogador não consegue encontrar Ovo de Farejador
+

Cenário 07

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Título:Derrotar um Mob Simples (Zumbi, Esqueleto, Creeper)
Objetivo:Derrotar um mob simples
Contexto:Jogo Inicial
Atores:Jogador
Recursos:Minecraft Launcher
Episódios:Jogador espera anoitecer
Jogador encontra mob
Jogador ataca mob até derrotá-lo
Restrição:Utilizar armas e armadura forte
ExceçãoJogador é derrotado pelo Mob
Jogador perde todos os itens durante a batalha
+

Cenário 08

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Título:Fazer uma Farm de Pedra
Objetivo:Criar uma Farm automática de pedra
Contexto:Jogo Inicial
Atores:Jogador
Recursos:Minecraft Launcher, lava, água, redstone
Episódios:Jogador coleta materiais
Jogador utiliza materiais para construir a farm de pedra
Jogador coleta as pedras
Restrição:Boa construção e otimização
ExceçãoNão conseguir encontrar lava
Não utilizar corretamente a redstone
Farm falhar ao produzir pedra
+

Cenário 09

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Título:Crafitar uma Cama
Objetivo:Construir uma cama no minecraft utilizando a mesa de construção
Contexto:Jogo Inicial
Atores:Jogador
Recursos:Minecraft Launcher, mesa de construção
Episódios:Jogador encontra ovelhas
Jogador obtem lã de ovelhas
Jogador obtém madeira de qualquer árvore
Jogador transforma madeira bruta em tábua de madeira
Jogador utiliza mesa de construção para construir cama utilizando as lãs e as tábuas de madeira
Restrição:Obter todos os itens necessários
ExceçãoJogador não encontra lãs da mesma coloração
Jogador não encontra ovelhas
Jogador não obtem recursos suficientes
+

Cenário 10

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Título:Reproduzir Villagers
Objetivo:Reproduzir villagers no jogo
Contexto:Jogo Normal
Atores:Jogador
Recursos:Minecraft Launcher, comida, camas
Episódios:Jogador encontra vila
Jogador posiciona cama perto dos villagers
Jogador coloca dá comida a 2 villagers
Villagers se reproduzem
Restrição:Villagers disponíveis, espaço suficiente
ExceçãoVillagers não se reproduzem
+

Cenário 11

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Título:Voar com Elytra
Objetivo:Voar utilizando a Elytra
Contexto:Jogo Avançado
Atores:Jogador
Recursos:Minecraft Launcher, Elytra
Episódios:Jogador crafita foguetes
Jogador equipa a Elytra
Jogador aciona foguete enquanto o segura
Restrição:Durabilidade da Elytra e número de foguetes
ExceçãoElytra quebra durante o jogo
Não obtém os recursos necessários para crafitar foguetes
+

Cenário 12

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Título:Domar um Lobo
Objetivo:Domar um lobo no minecraft
Contexto:Jogo Normal
Atores:Jogador
Recursos:Minecraft Launcher, ossos
Episódios:Jogador encontra Lobo
Jogador alimenta Lobo com ossos
Lobo é domado pelo Jogador
Restrição:Ter ossos suficientes
ExceçãoLobo não é domado
Jogador não encontra um Lobo
+

Cenário 13

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
Título:Encontrar um tesouro escondido
Objetivo:Encontrar um tesouro no minecraft
Contexto:Jogo Normal
Atores:Jogador
Recursos:Minecraft Launcher
Episódios:Jogador encontra Naufrágio
Jogador obtém mapa do tesouro
Jogador procura o tesouro utilizando o mapa
Jogador obtém tesouro escondido
Restrição:Encontrar um mapa do tesouro
Encontrar um naufrágio
Localização precisa
ExceçãoNaufrágio não produz mapa do tesouro
Jogador não consegue localizar o tesouro
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/modelagem/especificacaoSuplementar/index.html b/modelagem/especificacaoSuplementar/index.html new file mode 100644 index 0000000..9561962 --- /dev/null +++ b/modelagem/especificacaoSuplementar/index.html @@ -0,0 +1,1455 @@ + + + + + + + + + + + + + + + + + + + + + + + Especificações Suplementares - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Especificações Suplementares

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
20/08/20240.1Criação das EspecificaçõesSamara Letícia
+

Introdução

+

A especificação suplementar garante que todos os requisitos do sistema, incluindo aqueles relacionados à qualidade e desempenho, sejam devidamente considerados.

+

1. Desempenho

+
    +
  • Taxa de Quadros (FPS): O jogo deve manter uma taxa mínima de 30 FPS em dispositivos que atendam às especificações recomendadas.
  • +
  • Uso de Memória: O jogo pede no mínimo 4GB de RAM para uma experiência agradável em dispositivos com as configurações mínimas.
  • +
+

2. Requisitos de Segurança

+
    +
  • Autenticação: Todos os jogadores devem autenticar-se através de uma conta Microsoft para acessar servidores online.
  • +
  • Criptografia: As comunicações entre o cliente e o servidor devem ser criptografadas utilizando TLS 1.2 ou superior.
  • +
  • Proteção contra Exploits: Medidas devem ser implementadas para proteger o jogo contra exploits conhecidos, como manipulação de pacotes ou modding não autorizado.
  • +
+

3. Requisitos de Usabilidade

+
    +
  • Interface do Usuário: A interface deve ser responsiva e adaptável a diferentes resoluções de tela, incluindo dispositivos móveis.
  • +
  • Acessibilidade: O jogo deve incluir opções de acessibilidade, como suporte a leitores de tela e modos de alto contraste.
  • +
  • Documentação: Deve haver documentação clara e acessível para novos jogadores explicando as funcionalidades básicas do jogo.
  • +
+

4. Requisitos de Compatibilidade

+
    +
  • Compatibilidade Multiplataforma: O jogo deve ser compatível com Windows, Xbox, PlayStation, Nintendo Switch, iOS e Android.
  • +
  • Suporte a Versionamento: Deve ser possível jogar em servidores que suportam múltiplas versões do jogo, ou pelo menos a versão mais recente.
  • +
+

5. Requisitos de Manutenção

+
    +
  • Atualizações: O jogo deve permitir atualizações regulares sem a necessidade de reinstalação completa.
  • +
  • Backup de Dados: O jogo deve permitir a realização de backups automáticos dos dados dos jogadores.
  • +
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/modelagem/lexico/index.html b/modelagem/lexico/index.html new file mode 100644 index 0000000..7479feb --- /dev/null +++ b/modelagem/lexico/index.html @@ -0,0 +1,3913 @@ + + + + + + + + + + + + + + + + + + + + + + + Léxico - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Léxico

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
30/07/20240.1Criação do documento inicial e adição dos léxicos de L01 a L38Carlos Eduardo Rodrigues
01/08/20240.2Adição dos léxicos L39 e L40Danilo Melo
01/08/20240.3Adição do léxico L41Patrícia Helena
19/08/20240.4Adição dos léxicos L42 a L44 e correçõesCarlos Eduardo
20/08/20240.5Adição do léxico L45Carlos Eduardo
21/08/20240.6Adição do léxico L46 ao L50Patricia Helena
06/09/20240.7Adição do léxico L51Samara Letícia
+

Introdução

+

Este artefato trata-se de um conjunto de termos e definições que possuem o objetivo de eliminar ambiguidades e garantir uma comunicação clara e precisa entre todos os integrantes do grupo.

+

Metodologia

+

Para o levantamento dos termos descritos neste documento, o grupo utilizou palavras chaves já levantadas em artefatos anteriores, como por exemplo o Brainstorming.

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeLéxico
ClassificaçãoClassificação quanto a Estado, Verbo ou Objeto
SinônimosSinônimos do léxico no contexto
NoçãoNoções do léxicos
ImpactoImpacto na aplicação
+

Léxicos

+

L01 Nether

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeNether
ClassificaçãoObjeto
SinônimosInferno, Submundo
NoçãoDimensão alternativa no Minecraft, que é caracterizada por um ambiente hostil e recursos únicos.
ImpactoAcesso a recursos como Netherite e Blaze Rods.
Crucial para progressão no jogo, como alcançar o End.
+

L02 Chefes

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeChefes
ClassificaçãoObjeto
SinônimosBoss, Inimigos Poderosos
NoçãoCriaturas extremamente fortes no jogo, representando desafios para os jogadores.
ImpactoDrops raros e recompensas valiosas.
Elemento central para completar certos objetivos do jogo.
+

L03 Estruturas geradas

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeEstruturas geradas
ClassificaçãoObjeto
Sinônimos-
NoçãoConjuntos de blocos gerados no jogo que podem conter recursos.
ImpactoFonte de exploração e obtenção de itens.
Importantes para a narrativa e progresso do jogo.
+

L04 End

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeEnd
ClassificaçãoObjeto
SinônimosFim, Mundo do Dragão
NoçãoDimensão final do Minecraft, lar do Ender Dragon e de vários recursos valiosos.
ImpactoLocal da batalha final contra o Ender Dragon.
Contém recursos únicos como Ender Pearls e Elytra.
Marca a conclusão do jogo.
+

L05 Overworld

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeOverworld
ClassificaçãoObjeto
SinônimosMundo, Superfície
NoçãoO mundo principal e padrão do Minecraft onde os jogadores começam.
ImpactoAmbiente principal para sobrevivência, construção e exploração.
Contém a maioria dos biomas, criaturas e recursos.
Base para a maioria das atividades dos jogadores.
+

L06 Espectador

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeEspectador
ClassificaçãoEstado
SinônimosObservador, Watcher
NoçãoModo de jogo que permite aos jogadores voar e atravessar blocos, sem interação direta com o mundo.
ImpactoIdeal para explorar e observar o mundo sem interferir.
Útil para entender a mecânica do jogo e planejar construções.
+

L07 Criativo

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeCriativo
ClassificaçãoEstado
SinônimosModo Criativo, Criação
NoçãoModo de jogo onde os jogadores têm acesso ilimitado a todos os blocos e itens, e podem voar.
ImpactoFacilita a construção de grandes estruturas.
Permite criatividade sem restrições de recursos.
+

L08 Aventura

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeAventura
ClassificaçãoEstado
SinônimosModo Aventura, exploração
NoçãoModo de jogo onde os jogadores podem interagir com objetos e mobs, mas não podem destruir blocos sem as ferramentas adequadas.
ImpactoIdeal para mapas customizados e desafios criados pela comunidade.
Incentiva a exploração.
+

L09 Sobrevivência

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeSobrevivência
ClassificaçãoEstado
SinônimosModo Survival, Resistência
NoçãoModo de jogo onde os jogadores devem coletar recursos, construir, e sobreviver contra mobs.
ImpactoDesafio principal do jogo, combina exploração, coleta de recursos e combate.
+

L10 Hardcore

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeHardcore
ClassificaçãoEstado
SinônimosModo Hardcore, Extremo
NoçãoVariante do modo sobrevivência, mas com morte permanente e dificuldade mais alta.
ImpactoAumenta a tensão e o desafio do jogo, cada decisão é crucial.
+

L11 Craft

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeCraft
ClassificaçãoVerbo
SinônimosConstruir, Forjar, Fabricar, criar
NoçãoAção de combinar itens no Minecraft para criar novos itens ou blocos.
ImpactoEssencial para a sobrevivência e progressão no jogo.
Permite a criação de ferramentas, armas, armaduras, e outros itens úteis.
+

L12 Redstone

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeRedstone
ClassificaçãoObjeto
SinônimosCircuitos, Componentes
NoçãoMaterial no Minecraft usado para criar mecanismos e circuitos elétricos.
ImpactoPermite a automação e criação de máquinas complexas.
Usado em portas automáticas, elevadores, e outras construções avançadas.
+

L13 Farms

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeFarms
ClassificaçãoObjeto
SinônimosFazendas, Cultivos
NoçãoEstruturas criadas pelos jogadores para coletar recursos automaticamente ou de maneira eficiente.
ImpactoFonte constante de recursos como alimentos.
Reduz a necessidade de coleta manual.
+

L14 Servidores

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeServidores
ClassificaçãoObjeto
SinônimosHosts, Redes
NoçãoPlataformas online onde jogadores podem se conectar para jogar Minecraft juntos.
ImpactoPermite o jogo multiplayer.
Comunidades e eventos organizados.
+

L15 Skins

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeSkins
ClassificaçãoObjeto
SinônimosAparências, Trajes
NoçãoPersonalizações visuais para os personagens dos jogadores no Minecraft.
ImpactoPersonalização e expressão individual no jogo.
Criação e compartilhamento entre jogadores.
+

L16 Mods

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeMods
ClassificaçãoObjeto
SinônimosModificações
NoçãoAlterações criadas pela comunidade que mudam ou adicionam novos conteúdos ao Minecraft.
ImpactoExpansão das funcionalidades e conteúdos do jogo.
+

L17 Mineração

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeMineração
ClassificaçãoVerbo
SinônimosExtrair, Garimpar
NoçãoAção de cavar e coletar recursos minerais no Minecraft.
ImpactoFonte primária de recursos como carvão, ferro, ouro e diamantes.
Essencial para a criação de ferramentas e construção.
+

L18 Ferramentas

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeFerramentas
ClassificaçãoObjeto
SinônimosUtensílios, Equipamentos
NoçãoObjetos utilizados pelos jogadores para realizar diversas atividades como mineração, construção e combate.
ImpactoEssenciais para a coleta de recursos e defesa contra mobs.
Melhoram a eficiência e a capacidade de sobrevivência do jogador.
+

L19 Criaturas

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeCriaturas
ClassificaçãoObjeto
Sinônimosmobs, Entidades
NoçãoSeres vivos no Minecraft que podem ser pacíficos, neutros ou hostis.
ImpactoInterações diversas como combate, domesticação e comércio.
Fonte de recursos específicos como carne, couro e drops raros.
+

L20 Trocas

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeTrocas
ClassificaçãoVerbo
SinônimosComércio, Negociações
NoçãoAção de trocar itens com NPCs ou outros jogadores no Minecraft.
ImpactoPossibilidade de adquirir itens raros ou valiosos.
Estimula a interação e cooperação entre jogadores.
+

L21 Exploração

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeExploração
ClassificaçãoVerbo
SinônimosAventurar-se, Descobrir, explorar
NoçãoAto de viajar pelo mundo do Minecraft para descobrir novos biomas, estruturas geradas e recursos.
ImpactoIncentiva a descoberta e a expansão do conhecimento do mapa.
Crucial para encontrar recursos e completar desafios.
+

L22 Cooperação

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeCooperação
ClassificaçãoVerbo
SinônimosColaboração, Trabalho em equipe
NoçãoAção de trabalhar junto com outros jogadores para alcançar objetivos comuns.
ImpactoFacilita grandes projetos de construção e defesa.
Promove o jogo em equipe e a construção de comunidades.
+

L23 Chat

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeChat
ClassificaçãoObjeto
SinônimosBate-papo, Conversa
NoçãoFerramenta de comunicação dentro do jogo para os jogadores interagirem.
ImpactoEssencial para a coordenação e socialização entre jogadores.
Utilizado para trocar informações e organizar eventos.
+

L24 Eventos

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeEventos
ClassificaçãoObjeto
Sinônimos-
NoçãoOcasiões especiais organizadas dentro do jogo, tanto automaticamente quanto por jogadores.
ImpactoProporcionam experiências únicas e recompensas.
Estimulam a participação e interação dos jogadores.
+

L25 Criar Mundo

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeCriar Mundo
ClassificaçãoVerbo
SinônimosGerar Mundo
NoçãoAção de iniciar um novo mundo no Minecraft, com configurações personalizáveis.
ImpactoPermite personalização do ambiente de jogo.
Define as condições iniciais e o tipo de experiência do jogador.
+

L26 Socialização

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeSocialização
ClassificaçãoVerbo
SinônimosInteração, Convivência
NoçãoAto de interagir com outros jogadores dentro do jogo.
ImpactoCriação de laços e comunidades dentro do jogo.
Enriquecimento da experiência de jogo através da interação social.
+

L27 Blaze Rods

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeBlaze Rods
ClassificaçãoObjeto
SinônimosBastões de Blaze
NoçãoItens dropados por Blazes no nether, usados para fabricar itens importantes como Poções.
ImpactoEssenciais para progressão no jogo e criação de poções.
Incentivam a exploração e combate no nether.
+

L28 Netherite

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeNetherite
ClassificaçãoObjeto
SinônimosNetherita
NoçãoRecurso raro encontrado no nether, usado para melhorar equipamentos de diamante.
ImpactoFornece as ferramentas e armaduras mais fortes do jogo.
Motiva a exploração e mineração no nether.
+

L29 Blazes

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeBlazes
ClassificaçãoObjeto
Sinônimos-
NoçãoHostis mobs encontrados no nether, conhecidos por seus ataques de fogo.
ImpactoDropam Blaze Rods, essenciais para a criação de poções e olhos do Ender.
Representam um desafio significativo devido aos seus ataques de longo alcance e resistência ao fogo.
+

L30 Drops

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeDrops
ClassificaçãoObjeto
SinônimosItens caídos, Recompensas
NoçãoItens que são deixados no chão quando mobs, blocos ou jogadores são destruídos.
ImpactoFonte de recursos valiosos, como comida, ferramentas e ingredientes de poções.
Incentivam o combate e a exploração, pois mobs e estruturas geradas diferentes têm drops variados e úteis.
+

L31 Recursos

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeRecursos
ClassificaçãoObjeto
SinônimosMateriais, Insumos
NoçãoItens coletados ou obtidos no jogo que são usados para crafting, construção e outras atividades.
ImpactoEssenciais para a criação de ferramentas, armas, armaduras e outros itens necessários para a sobrevivência e progressão no jogo.
Diversos tipos de recursos incentivam a exploração e mineração em diferentes biomas e dimensões.
+

L32 Itens

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeItens
ClassificaçãoObjeto
SinônimosArtigos, Objetos
NoçãoElementos que podem ser coletados, usados, ou armazenados no jogo, e que influenciam a jogabilidade e o progresso do jogador.
ImpactoEssenciais para o avanço do jogo e para a sobrevivência do jogador. Incluem armas, ferramentas, recursos e outros itens que ajudam na exploração e construção.
+

L33 Dimensão

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeDimensão
ClassificaçãoObjeto
SinônimosMundo, Plano, Região
NoçãoEspaços distintos dentro do jogo, cada um com suas próprias características, blocos e regras.
ImpactoOferece diferentes experiências e desafios ao jogador, com variações em recursos e inimigos.
Diversidade de gameplay e exploração.
+

L34 Estruturas

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeEstruturas
ClassificaçãoObjeto
SinônimosConstruções, Edifícios, Criações
NoçãoFormações de blocos e elementos criados pelos jogadores dentro do jogo.
ImpactoPersonaliza o ambiente do jogo e pode influenciar a jogabilidade, a estética e a interação com outros jogadores.
+

L35 Ender Dragon

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeEnder Dragon
ClassificaçãoObjeto
SinônimosDragão do Fim, Chefe do Fim
NoçãoÉ um dragão poderoso que os jogadores devem derrotar para completar uma das principais metas do jogo.
ImpactoRepresenta o desafio final do jogo.
Sua derrota concede experiência e acesso ao portal de saída do Fim, além de desbloquear conquistas e recompensas.
+

L36 Ender Pearls

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeEnder Pearls
ClassificaçãoObjeto
SinônimosPérolas do Ender
NoçãoItens obtidos ao derrotar Endermen ou encontrá-los em baús no Fim.
ImpactoPermitem ao jogador teletransportar-se para um local próximo ao lançar a pérola.
+

L37 Elytra

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeElytra
ClassificaçãoObjeto
SinônimosAsas, Equipamento de Voo
NoçãoEquipamento que permite ao jogador planar e voar no jogo.
ImpactoExpande as possibilidades de exploração e mobilidade.
+

L38 Enderman

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeEnderman
ClassificaçãoObjeto
SinônimosEnderman, Ser do Fim
NoçãoCriatura que pode ser encontrada tanto no Overworld quanto no Fim. Caracteriza-se por sua habilidade de teletransporte.
ImpactoOferece desafios ao jogador com suas habilidades de teletransporte e ataque.
Fonte de Ender Pearls, que são úteis para diversos itens e recursos no jogo.
+

L39 Hotbar

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeHotbar
ClassificaçãoObjeto
SinônimosBarra de atalhos
NoçãoUma parte do inventário que você pode acessar os itens sem precisar abrir o inventário
ImpactoPermite que o usuário acesse os itens de maneira rápida e prática
+

L40 Conquistas

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeConquistas
ClassificaçãoObjeto
SinônimosAchievements
NoçãoManeira de orientar gradualmente novos jogadores no Minecraft e dar-lhes desafios para completar
ImpactoIncentiva o jogador a explorar todas as possibilidades do jogo
+

L41 Multiplayer

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeMultiplayer
ClassificaçãoEstado
SinônimosModo Multijogador, MP
NoçãoModo de jogo onde múltiplos jogadores podem interagir, socializar e competir em um mesmo mundo por meio de servidores.
ImpactoPromove a cooperacao e o trabalho em equipe para construir estruturas e completar objetivos. Permite competições e minijogos entre jogadores.
+

L42 Usuário

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeUsuário
ClassificaçãoSujeito
SinônimosJogador(es)
NoçãoA pessoa que interage com o sistema, tomando decisões e controlando o personagem.
ImpactoCentrais para o funcionamento do jogo.
Criam estruturas, moldam o ambiente e interagem com outros jogadores.
+

L43 Inventário

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeInventário
ClassificaçãoObjeto
Sinônimos-
NoçãoSistema que armazena todos os itens e blocos que o usuário coleta ou cria durante o jogo. Permite ao jogador organizar e utilizar seus recursos.
ImpactoO gerenciamento eficaz do inventário é essencial para a sobrevivência, construção e progresso no jogo, influenciando diretamente as estratégias do jogador.
+

L44 Blocos

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeBlocos
ClassificaçãoObjeto
SinônimosCubos, Elementos de Construção
NoçãoUnidades básicas de construção no usados para criar estruturas, itens e ferramentas.
ImpactoFundamentais para o jogo, permitindo ao jogador construir e modificar o ambiente.
+

L45 Realms

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeRealms
ClassificaçãoObjeto
SinônimosServidor Realms, Mundo Realms
NoçãoServiço de hospedagem de servidores online oferecido pela Mojang, que permite aos jogadores criar e gerenciar mundos privados onde até 10 jogadores podem jogar simultaneamente.
ImpactoFacilita a criação e administração de mundos multiplayer de forma segura e controlada.
Oferece uma experiência de jogo privada para amigos e convidados.
+

L46 Biomas

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeBiomas
ClassificaçãoObjeto
SinônimosAmbientes naturais
NoçãoRegiões distintas no mundo do Minecraft que apresentam diferentes tipos de terrenos, climas, vegetações, e vida selvagem.
ImpactoDiversificação do ambiente de jogo, proporcionando variação na jogabilidade e exploração. Influência no tipo de recursos disponíveis, como madeira e plantas.
+

L47 Villager

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeVillager
ClassificaçãoEntidade
SinônimosAldeão
NoçãoMob que habita as vilas e interage com o jogador através do comércio de itens e profissões, onde suas variam de acordo com biomas e suas profissões
ImpactoImportante para o comércio de recursos e desenvolvimento das vilas. Essencial para a obtenção de itens raros e especializados por meio de trocas. Pode ser usado para fazer farms
+

L48 Pillager

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomePillager
ClassificaçãoEntidade
SinônimosSaqueador
NoçãoMob inimigo hostil que ataca vilas e jogadores, associado às invasões de vilas.
ImpactoAmeaça constante para vilas e jogadores, criando desafios de defesa. Cria situações de conflito que podem levar a batalhas e recompensas valiosas.
+

L49 Spawners

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeSpawners
ClassificaçãoObjeto
SinônimosGeradores de Monstros
NoçãoBlocos que geram constantemente mobs em determinadas áreas, encontrados principalmente em masmorras e fortalezas.
ImpactoFonte contínua de mobs para combate. Pode ser usado para o farms de recursos específicos. Facilita a criação de armadilhas e fazendas automatizadas de mobs para obtenção de itens. Pode aumentar a dificuldade de exploração.
+

L50 Vila

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeVila
ClassificaçãoObjeto
SinônimosAldeia, Povoado
NoçãoConjunto de estruturas geradas e entidades que formam uma comunidade autossustentável no Minecraft. As vilas geralmente incluem casas, plantações, e outras estruturas, sendo habitadas principalmente por villagers.
ImpactoCentro de comércio, onde jogadores podem interagir com villagers para trocar itens e obter recursos valiosos. Fonte de recursos sustentáveis, como alimentos e materiais, através das plantações e criações dentro da vila. Ponto estratégico para defesa contra ataques de pillagers, incentivando a construção de muralhas e outros sistemas de proteção.
+

L51 Texturas

+ + + + + + + + + + + + + + + + + + + + + + + + + +
NomeTexturas
ClassificaçãoObjeto
SinônimosAldeia, Povoado
NoçãoElementos visuais que revestem blocos, itens, criaturas, e outros componentes do jogo, definindo a aparência desses objetos. Recursos visuais aplicados a objetos e superfícies, sendo manipuladas e usadas como parte do design gráfico.
ImpactoDão um visual único ao Minecraft, trazendo uma nova experiência de imersão ao jogo. Podem facilitar a identificação de alguns blocos ou itens. Exigem um maior-desempenho da máquina, tornando o jogo mais lento em alguns computadores
+
+

Referências:

+

Minecraft Wiki. Disponível em: https://minecraft.fandom.com/pt/wiki/Minecraft_Wiki

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/modelagem/personas/index.html b/modelagem/personas/index.html new file mode 100644 index 0000000..3e67fc1 --- /dev/null +++ b/modelagem/personas/index.html @@ -0,0 +1,1684 @@ + + + + + + + + + + + + + + + + + + + + + + + Personas - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Personas

+

Histórico de Versões

+ + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
30/07/20240.1Criação das PersonasSamara Letícia
06/09/20240.2AtualizaçãoSamara Letícia
+

Introdução

+

Personas são perfis fictícios que representam os usuários de um projeto. Elas incorporam histórias pessoais, motivações, objetivos, desafios e preocupações, ajudando a desenvolver estratégias para entender melhor o público-alvo.

+

Metodologia

+

Para essa documentação, além de discutirmos sobre as nossas próprias experiências com o jogo, entrevistamos diferentes jogadores de minecraft para saber sobre suas principais atividades, gameplay e o modo como o utilizavam. A partir disso, criamos as seguintes personas: Sarah, Arthur e Victor.

+

Personas

+

RichPicture - Personas

+

Personas - Versão 0.1 - Visão Geral

+ +

Sarah

+

Persona - Sarah

+

Persona Sarah by Freepik

+ +

Perfil de Sarah

+
    +
  • Idade: 19 anos.
  • +
  • Profissão: Designer.
  • +
+

Introdução

+

Sarah, uma jovem de 19 anos, é apaixonada por criar construções inovadoras que encantam seus seguidores no YouTube. Utilizando o modo criativo do Minecraft, ela transforma sua imaginação em realidade, projetando e edificando estruturas únicas e impressionantes. Seu canal é um espaço onde ela compartilha suas criações detalhadas e oferece dicas sobre como construir no jogo, atraindo uma audiência dedicada que aprecia sua habilidade em transformar blocos digitais em obras de arte arquitetônicas.

+

Frustrações

+
    +
  1. Ela enfrenta desafios devido às limitações do jogo, e a necessidade de adaptar suas ideias dentro das condições impostas pelo jogo.
  2. +
+

Arthur

+

Persona - Arthur

+

Persona Arthur by Freepik

+ +

Perfil de Artur

+
    +
  • Idade: 11 anos.
  • +
  • Profissão: Estudante.
  • +
+

Introdução

+

Artur, um garoto de 11 anos, é um grande fã do Minecraft e adora jogar com seus amigos. Ele se diverte no modo sobrevivência, explorando diferentes biomas e mapas enquanto enfrenta desafios e descobre novos locais. Além disso, Artur gosta de visitar as construções criativas de outros jogadores, buscando inspiração e aprimorando suas próprias habilidades. Para ele, o Minecraft é uma maneira emocionante de se conectar com amigos e mergulhar em um mundo virtual cheio de aventuras.

+

Frustrações

+
    +
  1. O minecraft não possui comando por voz, o que significa que ele precisa digitar pelo chat para se comunicar com seus amigos, tarefa difícil em determinadas situações.
  2. +
  3. Não é possível mandar uma mensagem para um amigo se ele estiver offline.
  4. +
  5. Não é possível entrar em um mundo que você é co-criador com seu amigo se ele estiver offline.
  6. +
+

Victor

+

Persona - Victor

+

Persona Arthur by Freepik

+ +

Perfil de Victor

+
    +
  • Idade: 22 anos.
  • +
  • Profissão: Estudante Universitário.
  • +
+

Introdução

+

Victor é um jogador dedicado do Minecraft que se destaca no modo Hardcore. Seu principal objetivo é derrotar o Ender Dragon e conquistar todas as conquistas disponíveis no jogo. Para intensificar sua experiência e aprimorar a dinâmica do jogo, Victor investe em Minecoins, que usa para adquirir mods e texturas que transformam o ambiente e adicionam novos desafios e elementos ao jogo. Com uma abordagem focada e estratégica, ele busca maximizar sua experiência no Minecraft, explorando todos os recursos que o jogo tem a oferecer.

+

Frustrações

+
    +
  1. Às vezes, mods e texturas adquiridos com Minecoins podem causar bugs ou incompatibilidades que afetam o desempenho do jogo ou a experiência geral.
  2. +
  3. A busca por conquistas e o avanço em um modo tão desafiador podem ser demorados, o que pode levar a uma sensação de progresso lento e frustração.
  4. +
+

Conclusão

+

Essas personas representam diferentes tipos de jogadores de Minecraft que podem se beneficiar de recursos personalizados no jogo. Cada uma delas tem necessidades e desafios específicos que devem ser atendidos para tornar a experiência de jogo mais eficaz e divertida.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/pos-rastreabilidade/forward-from/index.html b/pos-rastreabilidade/forward-from/index.html new file mode 100644 index 0000000..94b2d30 --- /dev/null +++ b/pos-rastreabilidade/forward-from/index.html @@ -0,0 +1,1768 @@ + + + + + + + + + + + + + + + + + + + + + + + Forward-From - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Forward-From

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
07/09/20240.1Criação do documento e adição das telas RF1 a RF4, RF6 a RF8, RF14, RF16 a RF18Carlos Eduardo Rodrigues
08/09/20240.2Adição das telas RF15, RF19, RF20, RF24, RF26 a RF28, RF30, RF31, RF34 a RF36Carlos Eduardo Rodrigues
08/09/20240.3Linkagem das demais telas dos requisitos funcionaisCarlos Eduardo Rodrigues
+ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
CódigoRequisitoTelaArtefato(s)
RF1O usuário deve ser capaz de criar, entrar e gerenciar uma conta no Minecraft.Veja aqui
RF2O usuário deve ser capaz de se locomover utilizando o teclado.Veja aqui
RF3O usuário deve ser capaz de interagir com o mundo utilizando o mouse.Veja aqui
RF4Os recursos devem ser armazenados no inventário do usuário.Veja aqui
RF5O jogo deve possuir um dicionário com a explicação de todos os itens descobertos pelo usuário.Veja aqui
RF6O usuário deve precisar de uma mesa de trabalho para fabricar ferramentas eficientes.Veja aqui
RF7O jogo deve permitir que, através de minérios, o usuário crie novas ferramentas.Veja aqui
RF8O jogo deve oferecer diferentes tipos de alimentos para evitar que o personagem do usuário morra de fome.Veja aqui
RF9No modo hardcore, o usuário deve ter apenas uma vida, tornando o jogo mais desafiador e definitivo.Veja aqui
RF10No modo hardcore, após a morte, o usuário deve ser capaz de entrar apenas no modo espectador, sem interagir com o mundo.Veja aqui
RF11No modo hardcore, o jogo deve ser definido automaticamente na dificuldade mais alta e não pode ser alterado.Veja aqui
RF12No modo hardcore, os comandos de cheats devem estar desabilitados para garantir a integridade do desafio.Veja aqui
RF13Deve existir um modo de jogo onde o jogador pode exercitar a sua criatividadeVeja aqui
RF14No modo criativo, o usuário deve ser capaz de sobrevoar rapidamente pelo mapa para facilitar as criações.Veja aqui
RF15O usuário deve ser capaz de colocar e quebrar blocos com apenas um comando no modo criativo.Veja aqui
RF16O usuário deve ter acesso a todos os itens do jogo no modo criativo.Veja aqui
RF17O usuário não deve precisar se preocupar com vida ou barra de fome no modo criativo, focando apenas em criar.Veja aqui
RF18Mobs hostis devem ignorar a presença do usuário no modo criativo.Veja aqui
RF19No modo criativo, usuário deve ser capaz de alterar o clima e a hora do dia conforme necessário para suas criações.Veja aqui
RF20Deve haver um sistema de chat para comunicação entre os jogadores, com suporte a comandos especiais.Veja aqui
RF21Jogos multiplayer devem permitir a criação e personalização de diversos modos de jogo, como construção, sobrevivência e PvP.Veja aqui
RF22Jogos multiplayer devem fornecer um sistema de votação justo e intuitivo durante competições para escolher as melhores construções ou desempenhos.Veja aqui
RF23Em Jogos multiplayer deve ser possível a criação e agendamento de eventos e competições especiais para os jogadores.Veja aqui
RF24O jogador dever ser capaz de colocar alguns blocos na hotbar.Veja aqui
RF25O jogador deve ser capaz de compartilhar o seu mapa com outro jogador.Veja aqui
RF26Deve existir um modo de jogo onde o jogador pode morrer (sobrevivência)Veja aqui
RF27Com exceção dos modos Criativo e Espectador, o jogador deve ter uma quantidade limitada de vidaVeja aqui
RF28O jogador deve ser capaz de criar ferramentasVeja aqui
RF29O jogador deve ser capaz de atacar os inimigosVeja aqui
RF30Com exceção do modo hardcore, o jogador deve ser capaz de escolher a dificuldade do jogoVeja aqui
RF31O mundo deve ser gerado com diversos biomasVeja aqui
RF32O jogador deve ser capaz de melhorar o material dos seus itensVeja aqui
RF33O jogador deve ser capaz de encantar os seus itensVeja aqui
RF34Quando um inimigo morrer ele deve deixar um dropVeja aqui
RF35O jogador deve ter uma barra de fomeVeja aqui
RF36Cada dimensão deve ter diferentes inimigosVeja aqui
RF37Devem existir inimigos de diferentes dificuldadesVeja aqui
RF38O jogo deve apresentar um sistema de conquistasVeja aqui
RF39O jogador deve poder acessar o sistema de conquistas a qualquer momentoVeja aqui
RF40O jogador deve ser capaz de compartilhar suas conquistas com outros jogadoresVeja aqui
RF41O jogo deve possuir chefesVeja aqui
RF42Deve haver blocos decorativos para expandir as opções de construção e paisagismo.Veja aqui
RF43Deve haver ruínas, cavernas, montanhas e masmorras subterrâneas, com desafios e recompensas para que os jogadores realizem explorações.Veja aqui
RF44Deve haver armaduras para os jogadores e seus animais de combate.Veja aqui
RF45Deve haver armas de dano em área para facilitar combates enfrentando múltiplos inimigos de uma só vezVeja aqui
RF46Os biomas do Nether, devem possuir desafios e recompensas únicas para incentivar a exploração do submundo.Veja aqui
RF47Deve haver mobs pacíficos com profissõesVeja aqui
RF48Os jogadores devem ser capazes de personalizar os seus mobs de estimação.Veja aqui
RF49Deve haver um sistema de crafting automático, que permita aos jogadores automatizar processos.Veja aqui
RF50Deve haver diferentes tipos de minérios e recursosVeja aqui
RF51Deve haver diferentes tipos de mobs de animais.Veja aqui
RF52Deve haver eventos e desafios temporários com recompensas exclusivasVeja aqui
RF53O jogador deve ser capaz de criar novos mundos no minecraftVeja aqui
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/pos-rastreabilidade/imgs/1.png b/pos-rastreabilidade/imgs/1.png new file mode 100644 index 0000000..15d72b4 Binary files /dev/null and b/pos-rastreabilidade/imgs/1.png differ diff --git a/pos-rastreabilidade/imgs/10.png b/pos-rastreabilidade/imgs/10.png new file mode 100644 index 0000000..e983e1b Binary files /dev/null and b/pos-rastreabilidade/imgs/10.png differ diff --git a/pos-rastreabilidade/imgs/11.png b/pos-rastreabilidade/imgs/11.png new file mode 100644 index 0000000..fcf0a24 Binary files /dev/null and b/pos-rastreabilidade/imgs/11.png differ diff --git a/pos-rastreabilidade/imgs/12.png b/pos-rastreabilidade/imgs/12.png new file mode 100644 index 0000000..fcf0a24 Binary files /dev/null and b/pos-rastreabilidade/imgs/12.png differ diff --git a/pos-rastreabilidade/imgs/13.png b/pos-rastreabilidade/imgs/13.png new file mode 100644 index 0000000..e2003da Binary files /dev/null and b/pos-rastreabilidade/imgs/13.png differ diff --git a/pos-rastreabilidade/imgs/14.png b/pos-rastreabilidade/imgs/14.png new file mode 100644 index 0000000..bbbc5ef Binary files /dev/null and b/pos-rastreabilidade/imgs/14.png differ diff --git a/pos-rastreabilidade/imgs/15.gif b/pos-rastreabilidade/imgs/15.gif new file mode 100644 index 0000000..93c6283 Binary files /dev/null and b/pos-rastreabilidade/imgs/15.gif differ diff --git a/pos-rastreabilidade/imgs/16.png b/pos-rastreabilidade/imgs/16.png new file mode 100644 index 0000000..05574ab Binary files /dev/null and b/pos-rastreabilidade/imgs/16.png differ diff --git a/pos-rastreabilidade/imgs/17.png b/pos-rastreabilidade/imgs/17.png new file mode 100644 index 0000000..9aa2974 Binary files /dev/null and b/pos-rastreabilidade/imgs/17.png differ diff --git a/pos-rastreabilidade/imgs/18.png b/pos-rastreabilidade/imgs/18.png new file mode 100644 index 0000000..6b078e1 Binary files /dev/null and b/pos-rastreabilidade/imgs/18.png differ diff --git a/pos-rastreabilidade/imgs/19.gif b/pos-rastreabilidade/imgs/19.gif new file mode 100644 index 0000000..9cb907a Binary files /dev/null and b/pos-rastreabilidade/imgs/19.gif differ diff --git a/pos-rastreabilidade/imgs/2.png b/pos-rastreabilidade/imgs/2.png new file mode 100644 index 0000000..a14d5f7 Binary files /dev/null and b/pos-rastreabilidade/imgs/2.png differ diff --git a/pos-rastreabilidade/imgs/20.jpeg b/pos-rastreabilidade/imgs/20.jpeg new file mode 100644 index 0000000..d331dff Binary files /dev/null and b/pos-rastreabilidade/imgs/20.jpeg differ diff --git a/pos-rastreabilidade/imgs/21.png b/pos-rastreabilidade/imgs/21.png new file mode 100644 index 0000000..c35867e Binary files /dev/null and b/pos-rastreabilidade/imgs/21.png differ diff --git a/pos-rastreabilidade/imgs/22.png b/pos-rastreabilidade/imgs/22.png new file mode 100644 index 0000000..33d7a83 Binary files /dev/null and b/pos-rastreabilidade/imgs/22.png differ diff --git a/pos-rastreabilidade/imgs/23.png b/pos-rastreabilidade/imgs/23.png new file mode 100644 index 0000000..2d74f8d Binary files /dev/null and b/pos-rastreabilidade/imgs/23.png differ diff --git a/pos-rastreabilidade/imgs/24.jpeg b/pos-rastreabilidade/imgs/24.jpeg new file mode 100644 index 0000000..8511b79 Binary files /dev/null and b/pos-rastreabilidade/imgs/24.jpeg differ diff --git a/pos-rastreabilidade/imgs/26.png b/pos-rastreabilidade/imgs/26.png new file mode 100644 index 0000000..c36517a Binary files /dev/null and b/pos-rastreabilidade/imgs/26.png differ diff --git a/pos-rastreabilidade/imgs/27.png b/pos-rastreabilidade/imgs/27.png new file mode 100644 index 0000000..29fd94f Binary files /dev/null and b/pos-rastreabilidade/imgs/27.png differ diff --git a/pos-rastreabilidade/imgs/28.png b/pos-rastreabilidade/imgs/28.png new file mode 100644 index 0000000..c9b7039 Binary files /dev/null and b/pos-rastreabilidade/imgs/28.png differ diff --git a/pos-rastreabilidade/imgs/29.gif b/pos-rastreabilidade/imgs/29.gif new file mode 100644 index 0000000..ca0176a Binary files /dev/null and b/pos-rastreabilidade/imgs/29.gif differ diff --git a/pos-rastreabilidade/imgs/3.png b/pos-rastreabilidade/imgs/3.png new file mode 100644 index 0000000..f1fbb80 Binary files /dev/null and b/pos-rastreabilidade/imgs/3.png differ diff --git a/pos-rastreabilidade/imgs/30.png b/pos-rastreabilidade/imgs/30.png new file mode 100644 index 0000000..826db84 Binary files /dev/null and b/pos-rastreabilidade/imgs/30.png differ diff --git a/pos-rastreabilidade/imgs/31.png b/pos-rastreabilidade/imgs/31.png new file mode 100644 index 0000000..4ad4c4a Binary files /dev/null and b/pos-rastreabilidade/imgs/31.png differ diff --git a/pos-rastreabilidade/imgs/32.gif b/pos-rastreabilidade/imgs/32.gif new file mode 100644 index 0000000..760508b Binary files /dev/null and b/pos-rastreabilidade/imgs/32.gif differ diff --git a/pos-rastreabilidade/imgs/33.gif b/pos-rastreabilidade/imgs/33.gif new file mode 100644 index 0000000..ac25695 Binary files /dev/null and b/pos-rastreabilidade/imgs/33.gif differ diff --git a/pos-rastreabilidade/imgs/34.png b/pos-rastreabilidade/imgs/34.png new file mode 100644 index 0000000..e9a1e76 Binary files /dev/null and b/pos-rastreabilidade/imgs/34.png differ diff --git a/pos-rastreabilidade/imgs/35.png b/pos-rastreabilidade/imgs/35.png new file mode 100644 index 0000000..6965f14 Binary files /dev/null and b/pos-rastreabilidade/imgs/35.png differ diff --git a/pos-rastreabilidade/imgs/36.png b/pos-rastreabilidade/imgs/36.png new file mode 100644 index 0000000..ad401c8 Binary files /dev/null and b/pos-rastreabilidade/imgs/36.png differ diff --git a/pos-rastreabilidade/imgs/37.png b/pos-rastreabilidade/imgs/37.png new file mode 100644 index 0000000..5ae5bf0 Binary files /dev/null and b/pos-rastreabilidade/imgs/37.png differ diff --git a/pos-rastreabilidade/imgs/38.png b/pos-rastreabilidade/imgs/38.png new file mode 100644 index 0000000..1458edc Binary files /dev/null and b/pos-rastreabilidade/imgs/38.png differ diff --git a/pos-rastreabilidade/imgs/39.gif b/pos-rastreabilidade/imgs/39.gif new file mode 100644 index 0000000..fe5c65b Binary files /dev/null and b/pos-rastreabilidade/imgs/39.gif differ diff --git a/pos-rastreabilidade/imgs/4.png b/pos-rastreabilidade/imgs/4.png new file mode 100644 index 0000000..8f6f669 Binary files /dev/null and b/pos-rastreabilidade/imgs/4.png differ diff --git a/pos-rastreabilidade/imgs/41.png b/pos-rastreabilidade/imgs/41.png new file mode 100644 index 0000000..9997489 Binary files /dev/null and b/pos-rastreabilidade/imgs/41.png differ diff --git a/pos-rastreabilidade/imgs/42.png b/pos-rastreabilidade/imgs/42.png new file mode 100644 index 0000000..9c787db Binary files /dev/null and b/pos-rastreabilidade/imgs/42.png differ diff --git a/pos-rastreabilidade/imgs/43.png b/pos-rastreabilidade/imgs/43.png new file mode 100644 index 0000000..df2bd30 Binary files /dev/null and b/pos-rastreabilidade/imgs/43.png differ diff --git a/pos-rastreabilidade/imgs/44.png b/pos-rastreabilidade/imgs/44.png new file mode 100644 index 0000000..66e000d Binary files /dev/null and b/pos-rastreabilidade/imgs/44.png differ diff --git a/pos-rastreabilidade/imgs/45.gif b/pos-rastreabilidade/imgs/45.gif new file mode 100644 index 0000000..5c74403 Binary files /dev/null and b/pos-rastreabilidade/imgs/45.gif differ diff --git a/pos-rastreabilidade/imgs/46.png b/pos-rastreabilidade/imgs/46.png new file mode 100644 index 0000000..984ea8e Binary files /dev/null and b/pos-rastreabilidade/imgs/46.png differ diff --git a/pos-rastreabilidade/imgs/47.png b/pos-rastreabilidade/imgs/47.png new file mode 100644 index 0000000..c781fa0 Binary files /dev/null and b/pos-rastreabilidade/imgs/47.png differ diff --git a/pos-rastreabilidade/imgs/48.png b/pos-rastreabilidade/imgs/48.png new file mode 100644 index 0000000..29da2f2 Binary files /dev/null and b/pos-rastreabilidade/imgs/48.png differ diff --git a/pos-rastreabilidade/imgs/49.png b/pos-rastreabilidade/imgs/49.png new file mode 100644 index 0000000..333984f Binary files /dev/null and b/pos-rastreabilidade/imgs/49.png differ diff --git a/pos-rastreabilidade/imgs/5.jpeg b/pos-rastreabilidade/imgs/5.jpeg new file mode 100644 index 0000000..4a658ee Binary files /dev/null and b/pos-rastreabilidade/imgs/5.jpeg differ diff --git a/pos-rastreabilidade/imgs/50.png b/pos-rastreabilidade/imgs/50.png new file mode 100644 index 0000000..21c7dbd Binary files /dev/null and b/pos-rastreabilidade/imgs/50.png differ diff --git a/pos-rastreabilidade/imgs/51.png b/pos-rastreabilidade/imgs/51.png new file mode 100644 index 0000000..f91b109 Binary files /dev/null and b/pos-rastreabilidade/imgs/51.png differ diff --git a/pos-rastreabilidade/imgs/52.jpeg b/pos-rastreabilidade/imgs/52.jpeg new file mode 100644 index 0000000..d5e806f Binary files /dev/null and b/pos-rastreabilidade/imgs/52.jpeg differ diff --git a/pos-rastreabilidade/imgs/53.png b/pos-rastreabilidade/imgs/53.png new file mode 100644 index 0000000..4517c6a Binary files /dev/null and b/pos-rastreabilidade/imgs/53.png differ diff --git a/pos-rastreabilidade/imgs/6.png b/pos-rastreabilidade/imgs/6.png new file mode 100644 index 0000000..8f44a71 Binary files /dev/null and b/pos-rastreabilidade/imgs/6.png differ diff --git a/pos-rastreabilidade/imgs/7.png b/pos-rastreabilidade/imgs/7.png new file mode 100644 index 0000000..b48ca09 Binary files /dev/null and b/pos-rastreabilidade/imgs/7.png differ diff --git a/pos-rastreabilidade/imgs/8.png b/pos-rastreabilidade/imgs/8.png new file mode 100644 index 0000000..c0181d2 Binary files /dev/null and b/pos-rastreabilidade/imgs/8.png differ diff --git a/pos-rastreabilidade/imgs/9.png b/pos-rastreabilidade/imgs/9.png new file mode 100644 index 0000000..09529f4 Binary files /dev/null and b/pos-rastreabilidade/imgs/9.png differ diff --git a/pre-rastreabilidade/Rich Picture/index.html b/pre-rastreabilidade/Rich Picture/index.html new file mode 100644 index 0000000..0ac6823 --- /dev/null +++ b/pre-rastreabilidade/Rich Picture/index.html @@ -0,0 +1,1622 @@ + + + + + + + + + + + + + + + + + + + + + + + Rich Picture - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Rich Picture

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
26/07/20240.1Criação do documento e adição da visão geral, exploração, personagem e criação de mundos.Danilo Melo
08/09/20240.2Adição da descrição das imagensDanilo Melo
+
+

Introdução

+

A técnica Rich Picture é uma ferramenta visual usada para compreender e comunicar sistemas complexos e suas interações de maneira intuitiva e acessível. Originada na Soft Systems Methodology - SSM, desenvolvida por Peter Checkland, essa técnica permite que indivíduos e equipes ilustrem problemas, contextos e relacionamentos de forma gráfica, utilizando desenhos, ícones, símbolos e texto. O objetivo principal é proporcionar uma visão holística do sistema, capturando tanto os aspectos técnicos quanto os sociais e culturais envolvidos, facilitando a compreensão mútua e o diálogo entre stakeholders com diferentes perspectivas.

+

Objetivos

+
    +
  • Compreensão Holística: Proporcionar uma visão completa e integrada do sistema, incluindo aspectos técnicos, sociais e culturais.
  • +
  • Identificação de Problemas e Oportunidades: Ajudar na identificação de problemas, conflitos, oportunidades e pontos de melhoria dentro do sistema.
  • +
  • Interações e Relacionamentos: Linhas, setas e símbolos que ilustram as interações, fluxos de comunicação e relacionamentos entre os diferentes elementos do sistema.
  • +
+

Metodologia

+

Para o desenvolvimento do Rich Picture neste projeto, utilizou-se a ferramenta Miro, devido à sua capacidade de proporcionar um ambiente de trabalho livre e flexível. Além disso, o Miro facilita a colaboração em tempo real, permitindo que equipes trabalhem juntas de maneira eficiente e integrada.

+

Visão Geral

+

RichPicture - Visão geral

+

Versão 1 - Autor: Danilo Melo

+ +

Exploração

+

RichPicture - Exploração

+

Versão 1 - Autor: Danilo Melo

+ +

Personagem

+

RichPicture - Personagem

+

Versão 1 - Autor: Danilo Melo

+ +

Criação de Mundos

+

RichPicture - Criação de mundo.jpg

+

Versão 1 - Autor: Danilo Melo

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/pre-rastreabilidade/argumentacao/index.html b/pre-rastreabilidade/argumentacao/index.html new file mode 100644 index 0000000..b8c0281 --- /dev/null +++ b/pre-rastreabilidade/argumentacao/index.html @@ -0,0 +1,1579 @@ + + + + + + + + + + + + + + + + + + + + + + + Argumentação - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + + + + + +
+
+ + + + + + + +

Argumentação

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor
20/08/20240.1Criação dos ArgumentosSamara Letícia
+

A argumentação em requisitos de software é o processo de justificar e validar as necessidades de um sistema, construindo uma base lógica e convincente para cada requisito. Ela visa garantir que os requisitos sejam claros, completos e alinhados com os objetivos do projeto, evitando mal-entendidos e facilitando a tomada de decisões durante o desenvolvimento.

+

Diagrama - Argumentacao 1

+

Versão 1 - Diagrama de Argumentação 1

+ +

Questão: Fazer apenas dois casos de uso será o suficiente para o nosso projeto?

+

P1 - Sim, pois eles cobrem os principais fluxos do sistema, garantindo que as funcionalidades essenciais estejam completamente descritas e validadas.

+

P2 - Sim, pois não seria possível capturar todos os cenários possíveis uma vez que é um jogo de exploração livre.

+

P3 - Não, pois dois casos de uso podem não capturar todas as variáveis e cenários possíveis, o que pode resultar em lacunas na cobertura de requisitos e funcionalidades importantes do sistema.

+

Conclusão

+

Terão apenas dois casos de uso, e se necessário, faremos mais.

+

Diagrama - Argumentacao 2

+

Versão 1 - Diagrama de Argumentação 2

+ +

Questão: É necessário fazer uma pesquisa de interesses com jogadores de minecraft para cobrir bem os requisitos?

+

P1 - Sim. A pesquisa de interesses reduz o risco de falhas ao detalhar os recursos ou projetos relacionados a Minecraft.

+

P2 - Sim, com uma pesquisa bem conduzida, é possível identificar as funcionalidades ou elementos do projeto que têm maior impacto.

+

P3 - Não acho que seja necessário porque sozinhos já conseguiríamos identificar os pontos principais do jogo.

+

Conclusão

+

Fizemos um questionário para jogadores de minecraft a respeito do jogo.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/reunioes/ata-14-08-24/index.html b/reunioes/ata-14-08-24/index.html new file mode 100644 index 0000000..b57c824 --- /dev/null +++ b/reunioes/ata-14-08-24/index.html @@ -0,0 +1,1565 @@ + + + + + + + + + + + + + + + + + + + + + + + Ata do dia 14/08/2024 - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ata do dia 14/08/2024

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + + + + +
DataDescriçãoAutor(es)
17/08/2024Criação do documentoCarlos Eduardo
18/08/2024Pequena correçãoCarlos Eduardo
+

Data, horário, duração e local

+ + + + + + + + + + + + + + + + + +
Data da reuniãoHorário de inícioDuraçãoLocal
14/08/202420:0050mMicrosoft Teams
+

Participantes

+

Participaram da reunião:

+
    +
  • Carlos Eduardo
  • +
  • Danilo César
  • +
  • Patrícia Helena
  • +
  • Samara Letícia
  • +
+

Objetivos e pontos discutidos

+

A segunda reunião do grupo teve como objetivo definir as duplas e as tarefas que cada uma delas seria responsável para a segunda entrega do trabalho. Cada dupla será responsável também por revisar o trabalho feito pela outra dupla.

+

Como ficou a divisão:

+

Carlos e Samara:

+
    +
  • Caso de uso
  • +
  • Argumentação
  • +
  • Especificação suplementar
  • +
  • Requisitos não funcionais
  • +
+

Danilo e Patrícia:

+
    +
  • Backlog
  • +
  • Gore NFR
  • +
  • User stories
  • +
  • Gore i*
  • +
+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/reunioes/ata-24-07-24/index.html b/reunioes/ata-24-07-24/index.html new file mode 100644 index 0000000..94b4981 --- /dev/null +++ b/reunioes/ata-24-07-24/index.html @@ -0,0 +1,1544 @@ + + + + + + + + + + + + + + + + + + + + + + + Ata do dia 27/07/2024 - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+
+
+ + + +
+
+
+ + + +
+
+ + + + + + + +

Ata do dia 27/07/2024

+

Histórico de Revisão

+ + + + + + + + + + + + + + + +
DataDescriçãoAutor(es)
01/08/2024Criação do documentoCarlos Eduardo
+

Data, horário, duração e local

+ + + + + + + + + + + + + + + + + +
Data da reuniãoHorário de inícioDuraçãoLocal
24/07/202410:001h e 50m.Google Meet
+

Participantes

+

Participaram da reunião:

+
    +
  • Carlos Eduardo Rodrigues
  • +
  • Danilo César
  • +
  • Patrícia Helena
  • +
+

Objetivos e pontos discutidos

+

Nesta primeira reunião, os integrantes presentes trabalharam em conjunto para a realização da primeira versão dos artefatos: brainstorming e moscow.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file diff --git a/search/search_index.json b/search/search_index.json new file mode 100644 index 0000000..cad395e --- /dev/null +++ b/search/search_index.json @@ -0,0 +1 @@ +{"config":{"lang":["pt"],"separator":"[\\s\\-]+","pipeline":["stopWordFilter"]},"docs":[{"location":"","title":"Requisitos Minecraft","text":"

Este reposit\u00f3rio cont\u00e9m a documenta\u00e7\u00e3o e artefatos que foram produzidos durante a disciplina de Requisitos de software do curso Engenharia de Software da Universidade de Bras\u00edlia - Campus Gama (UnB - Gama).

"},{"location":"#colaboradores","title":"\ud83e\udd1d Colaboradores","text":"Foto Nome Matr\u00edcula Github Carlos Eduardo 221031265 Carlos-kadu Danilo C\u00e9sar 221031149 DaniloCTM Patr\u00edcia Helena 221037993 patyhelenaa Samara Let\u00edcia 221008445 samarawwleticia"},{"location":"visao-geral/","title":"Vis\u00e3o Geral","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 28/07/2024 0.1 Cria\u00e7\u00e3o da vers\u00e3o inicial do documento Carlos Eduardo Rodrigues 06/09/2024 0.2 Foram adicionados os t\u00f3picos de Oportunidades, Riscos e Concorrentes Carlos Eduardo Rodrigues

"},{"location":"visao-geral/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Minecraft \u00e9 um jogo eletr\u00f4nico criado por Markus Persson que foi lan\u00e7ado oficialmente em novembro de 2011 pela Mojang Studios. Antes disso, em 2009, Persson desenvolveu a primeira vers\u00e3o do jogo, tamb\u00e9m conhecida como Minecraft \"Classic\". Em 2014 a Mojang Studios foi adquirida pela Microsoft por US$ 2,5 bilh\u00f5es.

O jogo permite aos jogadores explorar um mundo tridimensional, coletar recursos, construir estruturas e combater inimigos.

Markus Persson criador do Minecraft.

"},{"location":"visao-geral/#objetivo","title":"Objetivo","text":"

Este documento tem como objetivo fornecer uma vis\u00e3o geral do Minecraft na etapa de pr\u00e9-rastreabilidade.

"},{"location":"visao-geral/#descricao-geral","title":"Descri\u00e7\u00e3o Geral","text":"

A jornada t\u00edpica no Minecraft come\u00e7a com a coleta de madeira ao derrubar uma \u00e1rvore. A partir da\u00ed, o jogador deve criar ferramentas, minerar recursos e construir um abrigo para sobreviver em seguran\u00e7a. Por\u00e9m o Minecraft possui diversos modos de jogo, incluindo:

  • Sobreviv\u00eancia: Os jogadores devem coletar recursos para a sua sobreviv\u00eancia e tamb\u00e9m lutar contra criaturas perigosas.
  • Criativo: Os jogadores t\u00eam acesso ilimitado a recursos, imunidade a danos e capacidade de voar, permitindo a constru\u00e7\u00e3o livre. Aqui nada impede que o jogador liberte a sua imagina\u00e7\u00e3o.
  • Aventura: \u00c9 semelhante ao modo Sobreviv\u00eancia, mas possui alguas restri\u00e7\u00f5es para tornar o jogo mais desafiador.
  • Espectador: Os jogadores podem voar e atravessar blocos, mas n\u00e3o podem interagir com o ambiente.
  • Hardcore: Uma variante do modo Sobreviv\u00eancia, mas com o maior n\u00edvel de dif\u00edculdade e morte permanente. Quando o jogador morre, ele n\u00e3o pode renascer e o mundo \u00e9 exclu\u00eddo.
"},{"location":"visao-geral/#pontos-fortes","title":"Pontos Fortes","text":"
  • Liberdade criativa: Permite que os jogadores construam praticamente qualquer coisa que possam imaginar.
  • Comunidade e mods: O Minecraft possui uma grande comunidade de jogadores e desenvolvedores de mods, que ajudam na expans\u00e3o do jogo com novas mec\u00e2nicas, texturas e funcionalidades.
  • Multiplataforma: Est\u00e1 dispon\u00edvel em diversos dispositivos, como PC, consoles, e smartphones.
  • Atualiza\u00e7\u00f5es regulares: Atualiza\u00e7\u00f5es s\u00e3o lan\u00e7adas frequentemente, adicionando novos conte\u00fados e corrigindo problemas.
"},{"location":"visao-geral/#pontos-fracos","title":"Pontos Fracos","text":"
  • Gr\u00e1ficos pixelados: O estilo pode n\u00e3o atrair jogadores que prefiram visuais mais realistas.
  • Curva de Aprendizado: O jogo pode ser confuso para novos jogadores.
  • Monotonia: Alguns jogadores podem achar a jogabilidade repetitiva. A minera\u00e7\u00e3o e coleta de recursos, pode se tornar mon\u00f3tona.
  • Performance: Em dispositivos menos potentes, o jogo pode ter problemas de desempenho, principalmente ao usar mods ou recursos gr\u00e1ficos avan\u00e7ados.
  • Hist\u00f3ria n\u00e3o linear: O Minecraft n\u00e3o possui uma hist\u00f3ria, o que pode n\u00e3o agradar todos os jogadores.
"},{"location":"visao-geral/#oportunidades","title":"Oportunidades","text":"
  • Realidade Virtual e Aumentada: A integra\u00e7\u00e3o entre o Minecraft com VR e AR pode proporcionar uma nova experi\u00eancia imersiva e atrair novos jogadores.
  • Integra\u00e7\u00e3o com Streaming e Plataformas de V\u00eddeo: Facilitar a cria\u00e7\u00e3o de conte\u00fado por meio de integra\u00e7\u00f5es entre plataformas como Twitch e YouTube pode atrair mais jogadores e streamers.
  • Mais Conte\u00fados Personalizados: Proporcionar mais oportunidades para criadores de conte\u00fado como mods e skins, pode aumentar o engajamento da comunidade.
"},{"location":"visao-geral/#riscos","title":"Riscos","text":"
  • Concorr\u00eancia de novos jogos sandbox e survival
  • Depend\u00eancia de Modders e da Comunidade: A comunidade de mods \u00e9 uma grande for\u00e7a para o jogo, mas depender muito dela n\u00e3o \u00e9 uma boa escolha, especialmente se n\u00e3o houver incentivos para os criadores.
  • N\u00edvel de Interesse dos Jogadores: Se n\u00e3o houver atualiza\u00e7\u00f5es frequentes ou novas funcionalidades significativas, o interesse dos jogadores pode come\u00e7ar a diminuir.
  • Monetiza\u00e7\u00e3o Excessiva.
  • Atualiza\u00e7\u00f5es com Mudan\u00e7as Negativas: As mudan\u00e7as negativas no jogo podem gerar insatisfa\u00e7\u00e3o e consequentemente a diminui\u00e7\u00e3o no n\u00famero de jogadores.
"},{"location":"visao-geral/#concorrentes","title":"Concorrentes","text":"
  • Roblox: Outro jogo sandbox focado na cria\u00e7\u00e3o de mundos personalizados pelos usu\u00e1rios e que possui uma base de jogadores jovem muito engajada.
  • Terraria: Um jogo sandbox 2D com foco na explora\u00e7\u00e3o e constru\u00e7\u00e3o, com uma jogabilidade que compartilha algumas semelhan\u00e7as com Minecraft.
  • ARK: Survival Evolved: Jogo de sobreviv\u00eancia com elementos sandbox, focado em um ambiente mais realista com dinossauros, onde os jogadores constroem, ca\u00e7am e sobrevivem.
  • Stardew Valley: Jogo de simula\u00e7\u00e3o de fazenda que combina elementos de sandbox, sobreviv\u00eancia e RPG.
"},{"location":"visao-geral/#conclusao","title":"Conclus\u00e3o","text":"

O Minecraft \u00e9 um jogo vers\u00e1til e popular. Seus pontos fortes como a liberdade criativa e a grande comunidade, garantiram que o jogo alcan\u00e7asse em 2021, 238 milh\u00f5es de c\u00f3pias vendidas, al\u00e9m de 140 milh\u00f5es de usu\u00e1rios mensais.

"},{"location":"visao-geral/#referencias","title":"Refer\u00eancias:","text":"

Minecraft. O que \u00e9 o Minecraft? Construa, descubra realms e muito mais. Acesso em: jul de 2024. Dispon\u00edvel em: https://www.minecraft.net/pt-br/about-minecraft

Minecraft Wiki. Hardcore. Acesso em: jul de 2024. Dispon\u00edvel em: https://minecraft.fandom.com/pt/wiki/Hardcore

Reda\u00e7\u00e3o Impacta. Conhe\u00e7a a Inspiradora Hist\u00f3ria do Desenvolvedor do Minecraft. Acesso em: jul de 2024. Dispon\u00edvel em: https://www.impacta.com.br/blog/conheca-historia-desenvolvedor-minecraft/.

"},{"location":"Analise/CasosDeUso/","title":"Inspe\u00e7\u00e3o dos casos de uso","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 08/09/2024 0.1 Cria\u00e7\u00e3o do documento Danilo Melo"},{"location":"Analise/CasosDeUso/#metodologia","title":"Metodologia","text":"

Durante o processo de inspe\u00e7\u00e3o dos casos de uso, cada item foi verificado individualmente, utilizando uma metodologia baseada em checklist. Para cada item do checklist, uma resposta bin\u00e1ria foi atribu\u00edda, avaliando se o item atende aos crit\u00e9rios de qualidade previamente definidos. Esse processo garante que cada caso de uso esteja em conformidade com os padr\u00f5es esperados e pronto para ser considerado no ciclo de desenvolvimento.

"},{"location":"Analise/CasosDeUso/#checklist","title":"Checklist","text":"N\u00ba Itens 1 O caso de uso apresenta uma descri\u00e7\u00e3o clara? 2 O caso de uso apresenta o fluxo principal? 3 O caso de uso apresenta o fluxo alternativo? 4 O caso de uso apresenta o fluxo de exce\u00e7\u00e3o? 5 O caso de uso apresenta uma p\u00f3s-condi\u00e7\u00e3o? 6 O caso de uso apresenta rastreabilidade? UC 1 2 3 4 3 4 UC01 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC02 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC03 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC04 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC05 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC06 \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC07 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC08 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC09 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC10 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC11 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC12 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC13 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC14 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC15 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC16 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC17 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC18 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC19 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC20 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f UC21 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f"},{"location":"Analise/EspecificacaoSuplementar/","title":"Inspe\u00e7\u00e3o Especifica\u00e7\u00f5es Suplementares","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 08/09/2024 0.1 Cria\u00e7\u00e3o do documento Patricia Helena"},{"location":"Analise/EspecificacaoSuplementar/#metodologia","title":"Metodologia","text":"

Utilizando a metodologia de inspe\u00e7\u00e3o por meio de um checklist, as caracter\u00edsticas das Especifica\u00e7\u00f5es Suplementares foram verificadas individualmente, resultando em uma resposta para cada pergunta do checklist, podendo ser 'sim' ou 'n\u00e3o'. Esse processo permite uma averigua\u00e7\u00e3o da qualidade de cada um dos itens, assegurando que os requisitos estejam em conformidade com os padr\u00f5es esperados.

"},{"location":"Analise/EspecificacaoSuplementar/#checklist","title":"Checklist","text":"N\u00ba Perguntas 1 Todos os requisitos est\u00e3o descritos de forma clara? 2 A especifica\u00e7\u00e3o abrange todos os aspectos essenciais relacionados aos requisitos n\u00e3o funcionais? 3 Os requisitos de desempenho descrevem de forma clara as condi\u00e7\u00f5es e n\u00edveis de opera\u00e7\u00e3o? 4 Os requisitos de seguran\u00e7a descrevem de forma clara as condi\u00e7\u00f5es e n\u00edveis de prote\u00e7\u00e3o? 5 Os requisitos de usabilidade descrevem de forma clara as condi\u00e7\u00f5es e n\u00edveis de facilidade de uso? 6 Os requisitos de compatibilidade descrevem de forma clara as condi\u00e7\u00f5es e n\u00edveis de integra\u00e7\u00e3o com outros sistemas? 7 Os requisitos de manuten\u00e7\u00e3o descrevem de forma clara as condi\u00e7\u00f5es e n\u00edveis de suporte e atualiza\u00e7\u00e3o?"},{"location":"Analise/EspecificacaoSuplementar/#matriz-de-avaliacao","title":"Matriz de Avalia\u00e7\u00e3o","text":"Especifica\u00e7\u00f5es Suplementares 1 2 3 4 5 6 7 Especifica\u00e7\u00e3o Suplementar \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f"},{"location":"Analise/NFR/","title":"Inspe\u00e7\u00e3o NFR","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 08/09/2024 0.1 Cria\u00e7\u00e3o do documento Samara Let\u00edcia"},{"location":"Analise/NFR/#metodologia","title":"Metodologia","text":"

O processo de inspe\u00e7\u00e3o dos NFR Framework foi realizado utilizando uma metodologia baseada em checklist. Para cada pergunta do checklist, uma resposta bin\u00e1ria foi atribu\u00edda, avaliando se o item atende aos crit\u00e9rios.

"},{"location":"Analise/NFR/#checklist","title":"Checklist","text":"N\u00ba Perguntas 1 Todos os requisitos n\u00e3o funcionais relevantes foram identificados? 2 As metas de qualidade foram devidamente classificadas? 3 Cada meta foi descrita como um softgoal, permitindo a flexibilidade necess\u00e1ria para ajustes? 4 As depend\u00eancias entre softgoals foram mapeadas e documentadas? 5 A nota\u00e7\u00e3o gr\u00e1fica do NFR Framework est\u00e1 bem organizada e f\u00e1cil de seguir? 6 O diagrama visual representa corretamente as intera\u00e7\u00f5es e impactos entre os softgoals?"},{"location":"Analise/NFR/#matriz-de-avaliacao","title":"Matriz de Avalia\u00e7\u00e3o","text":"Diagrama 1 2 3 4 5 6 Usabilidade \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f Desempenho \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f"},{"location":"Analise/argumentacao/","title":"Inspe\u00e7\u00e3o Argumenta\u00e7\u00e3o","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 08/09/2024 0.1 Cria\u00e7\u00e3o do documento Patricia Helena"},{"location":"Analise/argumentacao/#metodologia","title":"Metodologia","text":"

Utilizando a metodologia de inspe\u00e7\u00e3o por meio de um checklist, as caracter\u00edsticas da Argumenta\u00e7\u00e3o foram verificadas individualmente, resultando em uma resposta para cada pergunta do checklist, podendo ser 'sim' ou 'n\u00e3o'. Esse processo permite uma averigua\u00e7\u00e3o da qualidade de cada um dos itens, assegurando que os requisitos estejam em conformidade com os padr\u00f5es esperados.

"},{"location":"Analise/argumentacao/#checklist","title":"Checklist","text":"N\u00ba Perguntas 1 As legendas e explica\u00e7\u00f5es est\u00e3o claras? 2 A argumenta\u00e7\u00e3o atinge uma conclus\u00e3o consistente? 3 A nota\u00e7\u00e3o de argumento utilizada segue um padr\u00e3o espec\u00edfico e \u00e9 respeitada ao longo do documento? 4 As quest\u00e3o citadas foram devidamente respondidas? 5 \u00c9 poss\u00edvel rastrear a origem dos argumentos?"},{"location":"Analise/argumentacao/#matriz-de-avaliacao","title":"Matriz de Avalia\u00e7\u00e3o","text":"Argumenta\u00e7\u00e3o 1 2 3 4 5 A01 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f A02 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f"},{"location":"Analise/backlog/","title":"Inspe\u00e7\u00e3o Backlog do Produto","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 07/09/2024 0.1 Cria\u00e7\u00e3o do documento Carlos Eduardo Rodrigues"},{"location":"Analise/backlog/#metodologia","title":"Metodologia","text":"

Durante o processo de inspe\u00e7\u00e3o dos itens do backlog, cada item foi verificado individualmente, utilizando uma metodologia baseada em checklist. Para cada pergunta do checklist, uma resposta bin\u00e1ria foi atribu\u00edda, avaliando se o item atende aos crit\u00e9rios de qualidade previamente definidos. Esse processo garante que cada requisito esteja em conformidade com os padr\u00f5es esperados e pronto para ser considerado no ciclo de desenvolvimento.

"},{"location":"Analise/backlog/#checklist","title":"Checklist","text":"N\u00ba Perguntas 1 A hist\u00f3ria \u00e9 clara e objetiva? 2 A hist\u00f3ria apresenta \u00e9pico? 3 A hist\u00f3ria \u00e9 separada por tema? 4 A hist\u00f3ria possui um ID em ordem crescente? 5 A hist\u00f3ria \u00e9 priorizada pelo modelo MoSCoW? 6 A hist\u00f3ria identifica o usu\u00e1rio principal? 7 A hist\u00f3ria apresenta link(s) do(s) seu(s) respectivo(s) rastreamento(s)? 8 A hist\u00f3ria \u00e9 suficientemente pequena para ser conclu\u00edda dentro de um ciclo de sprint?"},{"location":"Analise/backlog/#matriz-de-avaliacao","title":"Matriz de Avalia\u00e7\u00e3o","text":"US 1 2 3 4 5 6 7 8 US001 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US002 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US002 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US003 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US004 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US005 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US006 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US007 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US008 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u274c US009 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u274c US010 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u274c US011 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u274c US012 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u274c US013 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u274c US014 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US015 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US016 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US017 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US018 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US019 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US020 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US021 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US022 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US023 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u274c US024 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US025 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US026 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u274c US027 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u274c US028 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US029 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US030 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f US031 \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c \u274c"},{"location":"Analise/cenarios/","title":"Inspe\u00e7\u00e3o Cen\u00e1rios","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 07/09/2024 0.1 Cria\u00e7\u00e3o do documento Patricia Helena"},{"location":"Analise/cenarios/#metodologia","title":"Metodologia","text":"

Utilizando a metodologia de inspe\u00e7\u00e3o por meio de um checklist, as caracter\u00edsticas de cada cen\u00e1rio foram verificadas individualmente, resultando em uma resposta para cada pergunta do checklist, podendo ser 'sim' ou 'n\u00e3o'. Esse processo permite uma averigua\u00e7\u00e3o da qualidade de cada um dos cen\u00e1rios, assegurando que os requisitos estejam em conformidade com os padr\u00f5es esperados.

"},{"location":"Analise/cenarios/#checklist","title":"Checklist","text":"N\u00ba Perguntas 1 O cen\u00e1rio possui um t\u00edtulo descritivo? 2 O objetivo usado naquele cen\u00e1rio esta claro? 3 O cen\u00e1rio possui um contexto claro? 4 Os atores pertencentes do cen\u00e1rio est\u00e3o descritos? 5 O cen\u00e1rio descreve os recursos necess\u00e1rios? 6 O cen\u00e1rio possui epis\u00f3dios coerentes? 7 As possiveis restri\u00e7\u00f5es estao descritas? 8 O cen\u00e1rio possui (hyperlinks) com os l\u00e9xicos? Se sim, est\u00e3o todos em ordem?"},{"location":"Analise/cenarios/#matriz-de-avaliacao","title":"Matriz de Avalia\u00e7\u00e3o","text":"C 1 2 3 4 5 6 7 8 C01 \u2714\ufe0f \u274c \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f C02 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f C02 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f C03 \u2714\ufe0f \u274c \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f C04 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f C05 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c C06 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c C07 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c C08 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c C09 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c C10 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c C11 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c C12 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c C13 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c"},{"location":"Analise/epics/","title":"Inspe\u00e7\u00e3o Epics","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 08/09/2024 0.1 Cria\u00e7\u00e3o do documento Samara Let\u00edcia"},{"location":"Analise/epics/#metodologia","title":"Metodologia","text":"

O processo de inspe\u00e7\u00e3o dos modelos Epic foi realizado utilizando uma metodologia baseada em checklist. Para cada pergunta do checklist, uma resposta bin\u00e1ria foi atribu\u00edda, avaliando se o item atende aos crit\u00e9rios.

"},{"location":"Analise/epics/#checklist","title":"Checklist","text":"N\u00ba Perguntas 1 O modelo est\u00e1 claramente definido, com uma descri\u00e7\u00e3o concisa e compreens\u00edvel? 2 O modelo est\u00e1 alinhado aos seus objetivos? 3 O escopo do modelo est\u00e1 bem delimitado, sem ser muito amplo ou vago? 4 O modelo foi dividido em User Stories ou tarefas menores e gerenci\u00e1veis? 5 Cada hist\u00f3ria ou tarefa derivada tem um objetivo claro e pode ser entregue de forma independente? 6 Todas as depend\u00eancias e impactos foram identificados e documentados? 7 A estimativa de tempo e esfor\u00e7o foi feita para o Modelo e suas hist\u00f3rias derivadas?"},{"location":"Analise/epics/#matriz-de-avaliacao","title":"Matriz de Avalia\u00e7\u00e3o","text":"Diagrama 1 2 3 4 5 6 7 Modo de Jogo \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c Explora\u00e7\u00e3o \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u274c"},{"location":"Analise/lexicos/","title":"Inspe\u00e7\u00e3o dos l\u00e9xicos","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 08/09/2024 0.1 Cria\u00e7\u00e3o do documento Danilo Melo"},{"location":"Analise/lexicos/#metodologia","title":"Metodologia","text":"

Durante o processo de inspe\u00e7\u00e3o dos itens do l\u00e9xico, cada item foi verificado individualmente, utilizando uma metodologia baseada em checklist. Para cada item do checklist, uma resposta bin\u00e1ria foi atribu\u00edda, avaliando se o item atende aos crit\u00e9rios de qualidade previamente definidos. Esse processo garante que cada l\u00e9xico esteja em conformidade com os padr\u00f5es esperados e pronto para ser considerado no ciclo de desenvolvimento.

"},{"location":"Analise/lexicos/#checklist","title":"Checklist","text":"N\u00ba Itens 1 Clareza e Simplicidade: Cada termo \u00e9 descrito de maneira clara e objetiva, evitando ambiguidade. 2 Consist\u00eancia: A documenta\u00e7\u00e3o \u00e9 feita de maneira consistente seguindo um padr\u00e3o em todo o documento. 3 Inclus\u00e3o de Sin\u00f4nimos: O l\u00e9xico deve listar sin\u00f4nimos ou termos alternativos comuns para cada conceito 4 Defini\u00e7\u00e3o Contextual: As defini\u00e7\u00f5es fornecem o contexto de uso, indicando onde e como cada termo \u00e9 utilizado no sistema. L 1 2 3 4 L01 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L01 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L01 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f L01 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L05 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L06 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L07 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L08 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L09 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L10 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L11 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L12 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L13 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L14 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L15 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L16 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L17 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L18 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L19 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L20 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L21 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L22 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L23 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L24 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f L25 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L26 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L27 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L28 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L29 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f L30 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L31 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L32 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L33 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L34 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L35 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L36 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L37 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L38 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L39 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L40 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L41 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L42 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L43 \u2714\ufe0f \u2714\ufe0f \u274c \u2714\ufe0f L44 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L45 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L46 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L47 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L48 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L49 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L50 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f L51 \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f"},{"location":"Analise/personas/","title":"Inspe\u00e7\u00e3o Personas","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 07/09/2024 0.1 Cria\u00e7\u00e3o do documento Carlos Eduardo Rodrigues"},{"location":"Analise/personas/#metodologia","title":"Metodologia","text":"

O processo de inspe\u00e7\u00e3o das personas foi realizado utilizando uma metodologia baseada em checklist. Para cada pergunta do checklist, uma resposta bin\u00e1ria foi atribu\u00edda, avaliando se o item atende aos crit\u00e9rios.

"},{"location":"Analise/personas/#checklist","title":"Checklist","text":"N\u00ba Perguntas 1 A persona tem uma descri\u00e7\u00e3o clara e objetiva? 2 A persona inclui informa\u00e7\u00f5es sobre idade, profiss\u00e3o e contexto de vida? 3 A persona apresenta motiva\u00e7\u00f5es e objetivos espec\u00edficos relacionados ao jogo? 4 A persona possui frustra\u00e7\u00f5es ou desafios bem definidos? 5 A persona identifica as principais necessidades do usu\u00e1rio? 6 A persona est\u00e1 baseada em dados reais ou entrevistas com usu\u00e1rios? 7 A persona inclui uma representa\u00e7\u00e3o visual?"},{"location":"Analise/personas/#matriz-de-avaliacao","title":"Matriz de Avalia\u00e7\u00e3o","text":"Persona 1 2 3 4 5 6 7 Sarah \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f Arthur \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f Victor \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f"},{"location":"Analise/richpicture/","title":"Inspe\u00e7\u00e3o Rich Picture","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 08/09/2024 0.1 Cria\u00e7\u00e3o do documento Samara Let\u00edcia"},{"location":"Analise/richpicture/#metodologia","title":"Metodologia","text":"

O processo de inspe\u00e7\u00e3o dos diagramas Rich Picture foi realizado utilizando uma metodologia baseada em checklist. Para cada pergunta do checklist, uma resposta bin\u00e1ria foi atribu\u00edda, avaliando se o item atende aos crit\u00e9rios.

"},{"location":"Analise/richpicture/#checklist","title":"Checklist","text":"N\u00ba Perguntas 1 O diagrama \u00e9 f\u00e1cil de entender sem explica\u00e7\u00f5es adicionais? 2 Os elementos visuais (s\u00edmbolos, \u00edcones, desenhos) s\u00e3o claros e consistentes? 3 Todos os componentes principais do sistema ou problema est\u00e3o representados? 4 As intera\u00e7\u00f5es e relacionamentos importantes entre os elementos est\u00e3o bem ilustrados? 5 Todos os atores relevantes est\u00e3o representados? 6 O diagrama est\u00e1 organizado visualmente, facilitando a leitura? 7 O diagrama simplifica adequadamente a complexidade do sistema sem perder informa\u00e7\u00f5es essenciais?"},{"location":"Analise/richpicture/#matriz-de-avaliacao","title":"Matriz de Avalia\u00e7\u00e3o","text":"Diagrama 1 2 3 4 5 6 7 Vis\u00e3o Geral \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f Explora\u00e7\u00e3o \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f Personagem \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f Cria\u00e7\u00e3o de Mundos \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f \u2714\ufe0f"},{"location":"Analise/validacao/","title":"Valida\u00e7\u00e3o","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 08/09/2024 0.1 Cria\u00e7\u00e3o do documento e adi\u00e7\u00e3o dos requisitos funcionais Samara Let\u00edcia"},{"location":"Analise/validacao/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Valida\u00e7\u00e3o \u00e9 o processo de submeter os requisitos \u00e0 aprova\u00e7\u00e3o externa da equipe de software, verificando se atendem \u00e0s necessidades dos stakeholders e evitando custos de corre\u00e7\u00f5es.

"},{"location":"Analise/validacao/#metodologia","title":"Metodologia","text":"

Ap\u00f3s levantarmos os requisitos, testamos e validamos cada um em diferentes ambientes do jogo.

"},{"location":"Analise/validacao/#rf01-o-usuario-deve-ser-capaz-de-criar-entrar-e-gerenciar-uma-conta-no-minecraft","title":"RF01 - O usu\u00e1rio deve ser capaz de criar, entrar e gerenciar uma conta no Minecraft.","text":""},{"location":"Analise/validacao/#rf02-o-usuario-deve-ser-capaz-de-se-locomover-utilizando-o-teclado","title":"RF02 - O usu\u00e1rio deve ser capaz de se locomover utilizando o teclado.","text":""},{"location":"Analise/validacao/#rf03-o-usuario-deve-ser-capaz-de-interagir-com-o-mundo-utilizando-o-mouse","title":"RF03 - O usu\u00e1rio deve ser capaz de interagir com o mundo utilizando o mouse.","text":""},{"location":"Analise/validacao/#rf04-os-recursos-devem-ser-armazenados-no-inventario-do-usuario","title":"RF04 - Os recursos devem ser armazenados no invent\u00e1rio do usu\u00e1rio.","text":""},{"location":"Analise/validacao/#rf05-o-jogo-deve-possuir-um-dicionario-com-a-explicacao-de-todos-os-itens-descobertos-pelo-usuario","title":"RF05 - O jogo deve possuir um dicion\u00e1rio com a explica\u00e7\u00e3o de todos os itens descobertos pelo usu\u00e1rio.","text":""},{"location":"Analise/validacao/#rf06-o-usuario-deve-precisar-de-uma-mesa-de-trabalho-para-fabricar-ferramentas-eficientes","title":"RF06 - O usu\u00e1rio deve precisar de uma mesa de trabalho para fabricar ferramentas eficientes.","text":""},{"location":"Analise/validacao/#rf7-o-jogo-deve-permitir-que-atraves-de-minerios-o-usuario-crie-novas-ferramentas","title":"RF7 - O jogo deve permitir que, atrav\u00e9s de min\u00e9rios, o usu\u00e1rio crie novas ferramentas.","text":""},{"location":"Analise/validacao/#rf08-o-jogo-deve-oferecer-diferentes-tipos-de-alimentos-para-evitar-que-o-personagem-do-usuario-morra-de-fome","title":"RF08 - O jogo deve oferecer diferentes tipos de alimentos para evitar que o personagem do usu\u00e1rio morra de fome.","text":""},{"location":"Analise/validacao/#rf09-no-modo-hardcore-o-usuario-deve-ter-apenas-uma-vida-tornando-o-jogo-mais-desafiador-e-definitivo","title":"RF09 - No modo hardcore, o usu\u00e1rio deve ter apenas uma vida, tornando o jogo mais desafiador e definitivo.","text":""},{"location":"Analise/validacao/#rf10-no-modo-hardcore-apos-a-morte-o-usuario-deve-ser-capaz-de-entrar-apenas-no-modo-espectador-sem-interagir-com-o-mundo","title":"RF10 - No modo hardcore, ap\u00f3s a morte, o usu\u00e1rio deve ser capaz de entrar apenas no modo espectador, sem interagir com o mundo.","text":""},{"location":"Analise/validacao/#rf11-no-modo-hardcore-o-jogo-deve-ser-definido-automaticamente-na-dificuldade-mais-alta-e-nao-pode-ser-alterado","title":"RF11 - No modo hardcore, o jogo deve ser definido automaticamente na dificuldade mais alta e n\u00e3o pode ser alterado.","text":""},{"location":"Analise/validacao/#rf12-no-modo-hardcore-os-comandos-de-cheats-devem-estar-desabilitados-para-garantir-a-integridade-do-desafio","title":"RF12 - No modo hardcore, os comandos de cheats devem estar desabilitados para garantir a integridade do desafio.","text":""},{"location":"Analise/validacao/#rf13-deve-existir-um-modo-de-jogo-onde-o-jogador-pode-exercitar-a-sua-criatividade","title":"RF13 - Deve existir um modo de jogo onde o jogador pode exercitar a sua criatividade","text":""},{"location":"Analise/validacao/#rf14-no-modo-criativo-o-usuario-deve-ser-capaz-de-sobrevoar-rapidamente-pelo-mapa-para-facilitar-as-criacoes","title":"RF14 - No modo criativo, o usu\u00e1rio deve ser capaz de sobrevoar rapidamente pelo mapa para facilitar as cria\u00e7\u00f5es.","text":""},{"location":"Analise/validacao/#rf15-o-usuario-deve-ser-capaz-de-colocar-e-quebrar-blocos-com-apenas-um-comando-no-modo-criativo","title":"RF15 - O usu\u00e1rio deve ser capaz de colocar e quebrar blocos com apenas um comando no modo criativo.","text":""},{"location":"Analise/validacao/#rf16-o-usuario-deve-ter-acesso-a-todos-os-itens-do-jogo-no-modo-criativo","title":"RF16 - O usu\u00e1rio deve ter acesso a todos os itens do jogo no modo criativo.","text":""},{"location":"Analise/validacao/#rf17-o-usuario-nao-deve-precisar-se-preocupar-com-vida-ou-barra-de-fome-no-modo-criativo-focando-apenas-em-criar","title":"RF17 - O usu\u00e1rio n\u00e3o deve precisar se preocupar com vida ou barra de fome no modo criativo, focando apenas em criar.","text":""},{"location":"Analise/validacao/#rf18-mobs-hostis-devem-ignorar-a-presenca-do-usuario-no-modo-criativo","title":"RF18 - Mobs hostis devem ignorar a presen\u00e7a do usu\u00e1rio no modo criativo.","text":""},{"location":"Analise/validacao/#rf19-no-modo-criativo-usuario-deve-ser-capaz-de-alterar-o-clima-e-a-hora-do-dia-conforme-necessario-para-suas-criacoes","title":"RF19 - No modo criativo, usu\u00e1rio deve ser capaz de alterar o clima e a hora do dia conforme necess\u00e1rio para suas cria\u00e7\u00f5es.","text":""},{"location":"Analise/validacao/#rf20-deve-haver-um-sistema-de-chat-para-comunicacao-entre-os-jogadores-com-suporte-a-comandos-especiais","title":"RF20 - Deve haver um sistema de chat para comunica\u00e7\u00e3o entre os jogadores, com suporte a comandos especiais.","text":""},{"location":"Analise/validacao/#rf21-jogos-multiplayer-devem-permitir-a-criacao-e-personalizacao-de-diversos-modos-de-jogo-como-construcao-sobrevivencia-e-pvp","title":"RF21 - Jogos multiplayer devem permitir a cria\u00e7\u00e3o e personaliza\u00e7\u00e3o de diversos modos de jogo, como constru\u00e7\u00e3o, sobreviv\u00eancia e PvP.","text":""},{"location":"Analise/validacao/#rf22-jogos-multiplayer-devem-fornecer-um-sistema-de-votacao-justo-e-intuitivo-durante-competicoes-para-escolher-as-melhores-construcoes-ou-desempenhos","title":"RF22 - Jogos multiplayer devem fornecer um sistema de vota\u00e7\u00e3o justo e intuitivo durante competi\u00e7\u00f5es para escolher as melhores constru\u00e7\u00f5es ou desempenhos.","text":""},{"location":"Analise/validacao/#rf23-em-jogos-multiplayer-deve-ser-possivel-a-criacao-e-agendamento-de-eventos-e-competicoes-especiais-para-os-jogadores","title":"RF23 - Em Jogos multiplayer deve ser poss\u00edvel a cria\u00e7\u00e3o e agendamento de eventos e competi\u00e7\u00f5es especiais para os jogadores.","text":""},{"location":"Analise/validacao/#rf24-o-jogador-dever-ser-capaz-de-colocar-alguns-blocos-na-hotbar","title":"RF24 - O jogador dever ser capaz de colocar alguns blocos na hotbar.","text":""},{"location":"Analise/validacao/#rf25-o-jogador-deve-ser-capaz-de-compartilhar-o-seu-mapa-com-outro-jogador","title":"RF25 - O jogador deve ser capaz de compartilhar o seu mapa com outro jogador.","text":""},{"location":"Analise/validacao/#rf26-deve-existir-um-modo-de-jogo-onde-o-jogador-pode-morrer-sobrevivencia","title":"RF26 - Deve existir um modo de jogo onde o jogador pode morrer (sobreviv\u00eancia)","text":""},{"location":"Analise/validacao/#rf27-com-excecao-dos-modos-criativo-e-espectador-o-jogador-deve-ter-uma-quantidade-limitada-de-vida","title":"RF27 - Com exce\u00e7\u00e3o dos modos Criativo e Espectador, o jogador deve ter uma quantidade limitada de vida","text":""},{"location":"Analise/validacao/#rf28-o-jogador-deve-ser-capaz-de-criar-ferramentas","title":"RF28 - O jogador deve ser capaz de criar ferramentas","text":""},{"location":"Analise/validacao/#rf29-o-jogador-deve-ser-capaz-de-atacar-os-inimigos","title":"RF29 - O jogador deve ser capaz de atacar os inimigos","text":""},{"location":"Analise/validacao/#rf30-com-excecao-do-modo-hardcore-o-jogador-deve-ser-capaz-de-escolher-a-dificuldade-do-jogo","title":"RF30 - Com exce\u00e7\u00e3o do modo hardcore, o jogador deve ser capaz de escolher a dificuldade do jogo","text":""},{"location":"Analise/validacao/#rf31-o-mundo-deve-ser-gerado-com-diversos-biomas","title":"RF31 - O mundo deve ser gerado com diversos biomas","text":""},{"location":"Analise/validacao/#rf32-o-jogador-deve-ser-capaz-de-melhorar-o-material-dos-seus-itens","title":"RF32 - O jogador deve ser capaz de melhorar o material dos seus itens","text":""},{"location":"Analise/validacao/#rf33-o-jogador-deve-ser-capaz-de-encantar-os-seus-itens","title":"RF33 - O jogador deve ser capaz de encantar os seus itens","text":""},{"location":"Analise/validacao/#rf34-quando-um-inimigo-morrer-ele-deve-deixar-um-drop","title":"RF34 - Quando um inimigo morrer ele deve deixar um drop","text":""},{"location":"Analise/validacao/#rf35-o-jogador-deve-ter-uma-barra-de-fome","title":"RF35 - O jogador deve ter uma barra de fome","text":""},{"location":"Analise/validacao/#rf36-cada-dimensao-deve-ter-diferentes-inimigos","title":"RF36 - Cada dimens\u00e3o deve ter diferentes inimigos","text":""},{"location":"Analise/validacao/#rf37-devem-existir-inimigos-de-diferentes-dificuldades","title":"RF37 - Devem existir inimigos de diferentes dificuldades","text":""},{"location":"Analise/validacao/#rf38-o-jogo-deve-apresentar-um-sistema-de-conquistas","title":"RF38 - O jogo deve apresentar um sistema de conquistas","text":""},{"location":"Analise/validacao/#rf39-o-jogador-deve-poder-acessar-o-sistema-de-conquistas-a-qualquer-momento","title":"RF39 - O jogador deve poder acessar o sistema de conquistas a qualquer momento","text":""},{"location":"Analise/validacao/#rf40-o-jogador-deve-ser-capaz-de-compartilhar-suas-conquistas-com-outros-jogadores","title":"RF40 - O jogador deve ser capaz de compartilhar suas conquistas com outros jogadores","text":""},{"location":"Analise/validacao/#rf41-o-jogo-deve-possuir-chefes","title":"RF41 - O jogo deve possuir chefes","text":""},{"location":"Analise/validacao/#rf42-deve-haver-blocos-decorativos-para-expandir-as-opcoes-de-construcao-e-paisagismo","title":"RF42 - Deve haver blocos decorativos para expandir as op\u00e7\u00f5es de constru\u00e7\u00e3o e paisagismo.","text":""},{"location":"Analise/validacao/#rf43-deve-haver-ruinas-cavernas-montanhas-e-masmorras-subterraneas-com-desafios-e-recompensas-para-que-os-jogadores-realizem-exploracoes","title":"RF43 - Deve haver ru\u00ednas, cavernas, montanhas e masmorras subterr\u00e2neas, com desafios e recompensas para que os jogadores realizem explora\u00e7\u00f5es.","text":""},{"location":"Analise/validacao/#rf44-deve-haver-armaduras-para-os-jogadores-e-seus-animais-de-combate","title":"RF44 - Deve haver armaduras para os jogadores e seus animais de combate.","text":""},{"location":"Analise/validacao/#rf45-deve-haver-armas-de-dano-em-area-para-facilitar-combates-enfrentando-multiplos-inimigos-de-uma-so-vez","title":"RF45 - Deve haver armas de dano em \u00e1rea para facilitar combates enfrentando m\u00faltiplos inimigos de uma s\u00f3 vez","text":""},{"location":"Analise/validacao/#rf46-os-biomas-do-nether-devem-possuir-desafios-e-recompensas-unicas-para-incentivar-a-exploracao-do-submundo","title":"RF46 - Os biomas do Nether, devem possuir desafios e recompensas \u00fanicas para incentivar a explora\u00e7\u00e3o do submundo.","text":""},{"location":"Analise/validacao/#rf47-deve-haver-mobs-pacificos-com-profissoes","title":"RF47 - Deve haver mobs pac\u00edficos com profiss\u00f5es","text":""},{"location":"Analise/validacao/#rf48-os-jogadores-devem-ser-capazes-de-personalizar-os-seus-mobs-de-estimacao","title":"RF48 - Os jogadores devem ser capazes de personalizar os seus mobs de estima\u00e7\u00e3o.","text":""},{"location":"Analise/validacao/#rf49-deve-haver-um-sistema-de-crafting-automatico-que-permita-aos-jogadores-automatizar-processos","title":"RF49 - Deve haver um sistema de crafting autom\u00e1tico, que permita aos jogadores automatizar processos.","text":""},{"location":"Analise/validacao/#rf50-deve-haver-diferentes-tipos-de-minerios-e-recursos","title":"RF50 - Deve haver diferentes tipos de min\u00e9rios e recursos","text":""},{"location":"Analise/validacao/#rf51-deve-haver-diferentes-tipos-de-mobs-de-animais","title":"RF51 - Deve haver diferentes tipos de mobs de animais.","text":""},{"location":"Analise/validacao/#rf52-deve-haver-eventos-e-desafios-temporarios-com-recompensas-exclusivas","title":"RF52 - Deve haver eventos e desafios tempor\u00e1rios com recompensas exclusivas","text":""},{"location":"Analise/validacao/#rf53-o-jogador-deve-ser-capaz-de-criar-novos-mundos-no-minecraft","title":"RF53 - O jogador deve ser capaz de criar novos mundos no minecraft","text":""},{"location":"Elicitacoes/AnaliseProtocolo/","title":"An\u00e1lise de Protocolo","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 31/07/2024 0.1 Cria\u00e7\u00e3o do documento inicial e adi\u00e7\u00e3o da introdu\u00e7\u00e3o Patr\u00edcia Helena 31/07/2024 0.2 Analise de Protocolo 1 e 2 Samara Let\u00edcia 31/07/2024 0.3 Analise de Protocolo 3 e 4 Patr\u00edcia Helena 01/08/2024 1.0 Aplica\u00e7\u00e3o de MoSCoW em todas as an\u00e1lises Patr\u00edcia Helena"},{"location":"Elicitacoes/AnaliseProtocolo/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Trata-se de um m\u00e9todo onde o usu\u00e1rio \u00e9 solicitado a realizar uma tarefa enquanto, simultaneamente, explica em voz alta o processo que est\u00e1 seguindo. Analisamos diferentes modos de jogo do minecraft.

"},{"location":"Elicitacoes/AnaliseProtocolo/#metodologia","title":"Metodologia","text":"

Todas as descri\u00e7\u00f5es e a\u00e7\u00f5es do usu\u00e1rio s\u00e3o feitas em voz alta para que o Analisador consiga acompanhar cada passo e classifica-los por prioridades.

V\u00eddeo da Analise do modo sobreviv\u00eancia, Hardcore e multiplayer

V\u00eddeo da Analise do criativo

"},{"location":"Elicitacoes/AnaliseProtocolo/#ap01","title":"AP01","text":""},{"location":"Elicitacoes/AnaliseProtocolo/#analise-de-protocolo-1","title":"An\u00e1lise de Protocolo 1","text":"

Relator: Patr\u00edcia Helena Analisador: Samara Let\u00edcia Modo de jogo : Sobreviv\u00eancia

O m\u00e9todo foi realizado com uma pessoa que j\u00e1 conhecia o minecraft, os objetivos eram explorar um pouco o mapa, conseguir recursos, descobrir estruturas e interagir com os mobs.

"},{"location":"Elicitacoes/AnaliseProtocolo/#resumo-da-narracao","title":"Resumo da Narra\u00e7\u00e3o","text":"

Ela entra no Minecraft Launcher com sua conta j\u00e1 logada e cria o mundo no modo Sobreviv\u00eancia. Anda pelo mapa atrav\u00e9s do teclado com as teclas w, a, s e d. Coleta um pouco de madeira e usa a ferramenta crafting do jogo para criar uma mesa de trabalho. Cria uma ferramenta com ela e a usa para coletar carv\u00e3o e pedra. Ela explora outras partes do mapa como o rio, e ap\u00f3s minerar um pouco chega a uma caverna. Ap\u00f3s explorar um pouco a caverna ela encontra um mob e tem um combate com ele, que ap\u00f3s ser derrotado, libera drops usu\u00e1ria. Ap\u00f3s explorar um pouco a caverna a usu\u00e1ria encontra um min\u00e9rio raro e uma nova estrutura da atualiza\u00e7\u00e3o, chamada de Trial Chamber. Ap\u00f3s explorar um pouco essa estrutura, o personagem da usu\u00e1ria morre ap\u00f3s ser espetado por um cacto e volta no local de in\u00edcio do jogo.

"},{"location":"Elicitacoes/AnaliseProtocolo/#ap01-requisitos-elicitados","title":"AP01 Requisitos Elicitados","text":"C\u00f3digo Requisito Descri\u00e7\u00e3o Prioridade AP1.1 Cadastro Usu\u00e1rio ter conta no minecraft C AP1.2 Uso do Teclado O usu\u00e1rio se locomove atrav\u00e9s do teclado M AP1.3 Mouse O usu\u00e1rio interage com o mundo atrav\u00e9s do mouse S AP1.4 Invent\u00e1rio Os recursos ficam no invent\u00e1rio do usu\u00e1rio M AP1.5 Dicion\u00e1rio de Itens Recurso com explica\u00e7\u00e3o de todos os itens ja descobertos M AP1.6 Mesa de trabalho O usu\u00e1rio precisa dela para fazer ferramentas eficientes S AP1.7 Min\u00e9rios Atrav\u00e9s dos min\u00e9rios \u00e9 poss\u00edvel conseguir novas ferramentas S AP1.8 Alimento O jogo oferece diferentes tipos de alimento para o personagem do usu\u00e1rio n\u00e3o morrer de fome M

Legenda - t\u00e9cnica de prioriza\u00e7\u00e3o:

  • M: Must have; S: Should have; C: Could have; W: Would have.
"},{"location":"Elicitacoes/AnaliseProtocolo/#ap02","title":"AP02","text":""},{"location":"Elicitacoes/AnaliseProtocolo/#analise-de-protocolo-2","title":"An\u00e1lise de Protocolo 2","text":"

Relator: Patr\u00edcia Helena Analisador: Samara Let\u00edcia Modo de jogo : Hardcore

O m\u00e9todo foi realizado com uma pessoa j\u00e1 familiarizada com Minecraft, tendo experimentado anteriormente todos os recursos do modo [sobreviv\u00eancia]. Desta vez, a usu\u00e1ria explorou as caracter\u00edsticas \u00fanicas do modo Hardcore.

"},{"location":"Elicitacoes/AnaliseProtocolo/#resumo-da-narracao_1","title":"Resumo da Narra\u00e7\u00e3o","text":"

Ap\u00f3s criar um novo mundo, ela notou imediatamente a diferen\u00e7a na interface de vida do modo Hardcore. Para explorar a mec\u00e2nica de vida \u00fanica desse modo, ela subiu em uma colina alta e deliberadamente caiu, esvaziando sua barra de vida. Ao fazer isso, ela percebeu que n\u00e3o podia retornar ao jogo no mesmo local, sendo for\u00e7ada a entrar no modo espectador. Assim, sua jornada naquele mapa chegou ao fim, destacando a intensidade das consequ\u00eancias no modo Hardcore.

"},{"location":"Elicitacoes/AnaliseProtocolo/#ap02-requisitos-elicitados","title":"AP02 Requisitos Elicitados","text":"C\u00f3digo Requisito Descri\u00e7\u00e3o Prioridade AP2.1 Vida \u00fanica O usu\u00e1rio tem apenas uma vida, tornando o jogo mais desafiador e definitivo S AP2.2 Modo espectador ap\u00f3s a morte Ap\u00f3s a morte, o usu\u00e1rio s\u00f3 pode entrar no modo espectador e n\u00e3o pode interagir mais com o mundo M AP2.3 Dificuldade Fixa O jogo \u00e9 automaticamente definido na dificuldade mais alta e n\u00e3o pode ser alterado M AP2.4 Sem cheats Os comandos de cheats s\u00e3o desabilitados, garantindo a integridade do desafio S

Legenda - t\u00e9cnica de prioriza\u00e7\u00e3o:

  • M: Must have; S: Should have; C: Could have; W: Would have.
"},{"location":"Elicitacoes/AnaliseProtocolo/#ap03","title":"AP03","text":""},{"location":"Elicitacoes/AnaliseProtocolo/#analise-de-protocolo-3","title":"An\u00e1lise de Protocolo 3","text":"

Relator: Samara Let\u00edcia Analisador: Pat\u00edcia Helena Modo de jogo : Criativo

O m\u00e9todo foi realizado com uma pessoa que j\u00e1 conhecia o minecraft, com objetivo de Criatividade e contru\u00e7\u00e3o

"},{"location":"Elicitacoes/AnaliseProtocolo/#resumo-da-narracao_2","title":"Resumo da Narra\u00e7\u00e3o","text":"

A usu\u00e1ria, j\u00e1 experiente no jogo e com cadastro feito na plataforma, entrou no modo Criativo e [criou um novo mundo] do zero. Imediatamente, notou as diferen\u00e7as da HUB em rela\u00e7\u00e3o aos outros modos de jogo. Aproveitando a principal caracter\u00edstica do modo Criativo, que \u00e9 a capacidade de voar, ele explorou o ambiente. Ao acessar o invent\u00e1rio, que cont\u00e9m todos os itens dispon\u00edveis no jogo, decidiu iniciar um dos diversos objetivos poss\u00edveis: a constru\u00e7\u00e3o de estruturas. Utilizando os recursos ilimitados do invent\u00e1rio(diferencial do modo Criativo), o usu\u00e1rio construiu uma casa simples como demonstra\u00e7\u00e3o.

"},{"location":"Elicitacoes/AnaliseProtocolo/#ap03-requisitos-elicitados","title":"AP03 Requisitos Elicitados","text":"C\u00f3digo Requisito Descri\u00e7\u00e3o Prioridade AP3.1 Invent\u00e1rio criativo Neste modo o inventario possui TODOS os itens do jogo M AP3.2 Locomo\u00e7\u00e3o eficiente O usu\u00e1rio consegue sobrevoar com rapidez pelo mapa, facilitando as cria\u00e7\u00f5es S AP3.3 Blocos com mesma resist\u00eancia O usu\u00e1rio consegue colocar blocos e quebra-los com apenas um comando S AP3.4 Invent\u00e1rio completo Neste modo o inventario possui TODOS os itens do jogo M AP3.5 Imortalidade O usu\u00e1rio n\u00e3o precisa se preocupar com vida nem com barra de fome neste modo, focando assim na criatividade e nao sobreviv\u00eancia M AP3.6 Ambiente Pacifico Mobs h\u00f3stis ignoram a presen\u00e7a do usu\u00e1rio S AP3.7 Clima e hora do dia ajust\u00e1veis O usu\u00e1rio pode alterar o clima e a hora do dia conforme necess\u00e1rio para suas cria\u00e7\u00f5es S

Legenda - t\u00e9cnica de prioriza\u00e7\u00e3o:

  • M: Must have; S: Should have; C: Could have; W: Would have.
"},{"location":"Elicitacoes/AnaliseProtocolo/#ap04","title":"AP04","text":""},{"location":"Elicitacoes/AnaliseProtocolo/#analise-de-protocolo-4","title":"An\u00e1lise de Protocolo 4","text":"

Relator: Patr\u00edcia Helena Analisador: Samara Let\u00edcia Modo de jogo : multiplayer

O m\u00e9todo foi realizado com uma pessoa que j\u00e1 conhecia o minecraft, com objetivo de socializa\u00e7\u00e3o e coopera\u00e7\u00e3o

"},{"location":"Elicitacoes/AnaliseProtocolo/#resumo-da-narracao_3","title":"Resumo da Narra\u00e7\u00e3o","text":"

A usu\u00e1ria, j\u00e1 experiente no jogo e com cadastro feito na plataforma, clicou na aba de multiplayer e selecionou a op\u00e7\u00e3o de adicionar um novo servidor. Ela inseriu o IP do servidor e rapidamente se conectou. Dentro do servidor privado, notou a quantidade de jogadores e novos recursos dispon\u00edveis, como um chat repleto de comandos e v\u00e1rios modos de jogos personalizados. Para testar essas funcionalidades, ela entrou em uma competi\u00e7\u00e3o de constru\u00e7\u00e3o, onde competiu com outros jogadores. O objetivo era escolher um tema e construir algo relacionado; a melhor constru\u00e7\u00e3o ganhava a rodada. No in\u00edcio da rodada, percebeu que o modo de jogo era criativo para melhor fluidez da constru\u00e7\u00e3o. Ap\u00f3s alguns minutos construindo, a rodada terminou e come\u00e7ou a vota\u00e7\u00e3o das constru\u00e7\u00f5es, onde nossa usu\u00e1ria ficou em oitavo lugar.

"},{"location":"Elicitacoes/AnaliseProtocolo/#ap04-requisitos-elicitados","title":"AP04 Requisitos Elicitados","text":"C\u00f3digo Requisito Descri\u00e7\u00e3o Prioridade AP4.1 Suporte para V\u00e1rios Jogadores O servidor deve suportar a conex\u00e3o simult\u00e2nea de m\u00faltiplos jogadores sem queda de desempenho M AP4.2 Sistema de chat Deve haver um sistema de chat integrado para comunica\u00e7\u00e3o entre jogadores, com suporte a comandos especiais S AP4.3 Modos de jogos personalizados O servidor deve permitir a cria\u00e7\u00e3o e personaliza\u00e7\u00e3o de diversos modos de jogo, como constru\u00e7\u00e3o, sobreviv\u00eancia e PvP S AP4.4 Sistema de vota\u00e7\u00e3o Durante competi\u00e7\u00f5es, deve haver um sistema de vota\u00e7\u00e3o justo e intuitivo para escolher as melhores constru\u00e7\u00f5es ou desempenhos S AP4.5 Eventos Programados O servidor deve permitir a cria\u00e7\u00e3o e agendamento de eventos e competi\u00e7\u00f5es especiais para os jogadores S

Legenda - t\u00e9cnica de prioriza\u00e7\u00e3o:

  • M: Must have; S: Should have; C: Could have; W: Would have.
"},{"location":"Elicitacoes/Brainstorming/","title":"Brainstorming","text":""},{"location":"Elicitacoes/Brainstorming/#historico-de-revisao","title":"Hist\u00f3rico de Revis\u00e3o","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 29/07/2024 0.1 Cria\u00e7\u00e3o do documento Danilo Melo, Carlos Eduardo, Patricia Helena"},{"location":"Elicitacoes/Brainstorming/#introducao","title":"Introdu\u00e7\u00e3o","text":"

O brainstorming \u00e9 uma t\u00e9cnica de gera\u00e7\u00e3o de ideias que estimula a criatividade e a inova\u00e7\u00e3o em ambientes colaborativos, promovendo a liberdade de express\u00e3o e a aus\u00eancia de cr\u00edticas durante a fase inicial de propostas. Entre as abordagens, destacam-se o Brainwriting, onde os participantes escrevem suas ideias em papel, favorecendo os mais introvertidos, e o Brainstorming em Grupo, guiado por um facilitador que garante a participa\u00e7\u00e3o equitativa de todos. Ambas as t\u00e9cnicas visam criar um ambiente seguro e colaborativo, onde as ideias podem ser livremente compartilhadas e desenvolvidas, resultando em solu\u00e7\u00f5es mais inovadoras.

"},{"location":"Elicitacoes/Brainstorming/#metodologia","title":"Metodologia","text":"

Na primeira etapa, utilizamos a t\u00e9cnica de Brainwriting por meio de um board no Miro, que foi dividido em quatro categorias: Elementos do Jogo, Modos de Jogo, Mec\u00e2nica de Jogo e Comunidade e Multiplayer. Cada participante foi incentivado a contribuir com suas ideias em cada uma dessas categorias. A atividade foi realizada durante uma chamada no Google Meet, permitindo a colabora\u00e7\u00e3o em tempo real e garantindo que todos os participantes pudessem interagir e desenvolver as ideias uns dos outros.

"},{"location":"Elicitacoes/Brainstorming/#brainwriting","title":"Brainwriting","text":""},{"location":"Elicitacoes/Brainstorming/#transcricao","title":"Transcri\u00e7\u00e3o","text":"Elementos do Jogo Modos de Jogo Mec\u00e2nicas de Jogo Comunidade e Multiplayer Ferramentas Espectador Explora\u00e7\u00e3o Coopera\u00e7\u00e3o Criaturas Criativo Trocas Entretenimento Nether Aventura Criar Mundo Socializa\u00e7\u00e3o Biomas Sobreviv\u00eancia Minera\u00e7\u00e3o Servidores Animais Hardcore Craft Chat Min\u00e9rios Constru\u00e7\u00e3o Eventos Armaduras Redstone Skins Chefes Combate Competi\u00e7\u00f5es Itens Agricultura Miss\u00f5es Po\u00e7\u00f5es Encantamentos Mods Alimentos Criar Animal Estruturas Invent\u00e1rio End Farms Overworld Blocos Barcos Clima"},{"location":"Elicitacoes/Introspeccao/","title":"Introspec\u00e7\u00e3o","text":""},{"location":"Elicitacoes/Introspeccao/#historico-de-revisao","title":"Hist\u00f3rico de Revis\u00e3o","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 31/07/2024 0.1 Cria\u00e7\u00e3o do documento Danilo Melo 01/08/2024 0.2 Classifica\u00e7\u00e3o dos requisitos Danilo Melo 06/09/2024 0.3 Corre\u00e7\u00e3o de duplicata Carlos Eduardo"},{"location":"Elicitacoes/Introspeccao/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Introspec\u00e7\u00e3o \u00e9 uma t\u00e9cnica muito rica e profunda. Consiste em entender quais propriedades o sistema deve possuir para que seja um sucesso. Demanda o Engenheiro de Requisitos imaginar o que ele gostaria, se ele tivesse que desempenhar uma dada tarefa, com os equipamentos dispon\u00edveis e demais recursos.

"},{"location":"Elicitacoes/Introspeccao/#metodologia","title":"Metodologia","text":"

Foi feita uma introspec\u00e7\u00e3o ao visualizar diferentes fluxos de usu\u00e1rios na plataforma, com base nas defini\u00e7\u00f5es estabelecidas ap\u00f3s o Brainstorming e defini\u00e7\u00e3o de personas. A introspec\u00e7\u00e3o foi estruturada em formato de storytelling, focando nos diversos tipos de usu\u00e1rios da aplica\u00e7\u00e3o.

"},{"location":"Elicitacoes/Introspeccao/#introspeccao-1","title":"Introspec\u00e7\u00e3o 1","text":""},{"location":"Elicitacoes/Introspeccao/#11-contexto","title":"1.1 Contexto","text":"

Sarah deseja poder criar constru\u00e7\u00f5es impressionantes no jogo para compartilhar com seus seguidores. Seu plano \u00e9 erguer um castelo extremamente realista, um projeto que demanda uma aten\u00e7\u00e3o meticulosa aos detalhes e uma ampla gama de recursos do jogo. No entanto, Sarah enfrenta um desafio: sua agenda est\u00e1 bastante apertada, deixando-a com pouco tempo livre para se dedicar ao processo de coleta de materiais, que pode ser um dos aspectos mais demorados e tediosos da constru\u00e7\u00e3o. Portanto, ela busca uma solu\u00e7\u00e3o que permita a realiza\u00e7\u00e3o do projeto sem a necessidade de passar por essa fase de coleta extensiva.

"},{"location":"Elicitacoes/Introspeccao/#12-necessidades-tecnicas","title":"1.2 Necessidades T\u00e9cnicas","text":"
  • Um modo com recursos ilimitados
  • Possibilidade de construir coisas
  • Movimenta\u00e7\u00e3o facilitada
  • Op\u00e7\u00e3o de salvar o progresso
"},{"location":"Elicitacoes/Introspeccao/#13-necessidades-individuais","title":"1.3 Necessidades Individuais","text":"
  • Controle do tempo
  • Uso da criatividade
"},{"location":"Elicitacoes/Introspeccao/#14-necessidades-sociais","title":"1.4 Necessidades Sociais","text":"
  • Poder exibir suas constru\u00e7\u00f5es para os seus seguidores
  • Poder compartilhar os seus mapas com outras pessoas
"},{"location":"Elicitacoes/Introspeccao/#15-requisitos-elicitados","title":"1.5 Requisitos Elicitados","text":"C\u00f3digo Descri\u00e7\u00e3o Prioridade Classifica\u00e7\u00e3o INT1.1 Deve existir um modo de jogo onde o jogador possu\u00ed recursos ilimitados (Modo Criativo) Must Funcional INT1.2 O jogador deve ser capaz de voar no Modo Criativo Must Funcional INT1.3 O jogador deve ser capaz de remover blocos Must Funcional INT1.4 O jogo deve ter um sistema de salvamento autom\u00e1tico Must N\u00e3o funcional INT1.5 O jogador deve ter acesso a todos os itens de forma pr\u00e1tica Must Funcional INT1.6 O jogador dever ser capaz de colocar alguns blocos na hotbar Must Funcional INT1.7 O jogador deve ser capaz de compartilhar o seu mapa com outro jogador Could Funcional"},{"location":"Elicitacoes/Introspeccao/#introspeccao-2","title":"Introspec\u00e7\u00e3o 2","text":""},{"location":"Elicitacoes/Introspeccao/#21-contexto","title":"2.1 Contexto","text":"

Ap\u00f3s explorar diversos jogos de explora\u00e7\u00e3o, Arthur est\u00e1 em busca de uma nova experi\u00eancia que combine explora\u00e7\u00e3o da natureza com desafios moderados. Ele deseja jogar um jogo que permita enfrentar esses desafios de maneira cooperativa com seus amigos, criando uma experi\u00eancia de jogo mais envolvente e colaborativa. Al\u00e9m disso ele espera encontrar alguma forma de melhorar os seus itens para ficar mais forte durante sua jornada.

"},{"location":"Elicitacoes/Introspeccao/#22-necessidades-tecnicas","title":"2.2 Necessidades T\u00e9cnicas","text":"
  • Um modo que desafie o jogador
  • Inimigos para o jogador enfrentar
  • Sistema de biomas
  • Multiplayer
  • Diferentes materiais
  • Sistema de encantamentos
  • Ajuste de dificuldade
  • Sistema de chat
"},{"location":"Elicitacoes/Introspeccao/#23-necessidades-individuais","title":"2.3 Necessidades Individuais","text":"
  • N\u00edvel de habilidade
"},{"location":"Elicitacoes/Introspeccao/#24-necessidades-sociais","title":"2.4 Necessidades Sociais","text":"
  • Conex\u00e3o com internet
  • Comunica\u00e7\u00e3o entre os jogadores
"},{"location":"Elicitacoes/Introspeccao/#25-requisitos-elicitados","title":"2.5 Requisitos Elicitados","text":"C\u00f3digo Descri\u00e7\u00e3o Prioridade Classifica\u00e7\u00e3o INT2.1 Deve existir um modo de jogo onde o jogador pode morrer (sobreviv\u00eancia) Must Funcional INT2.2 O jogador deve ter uma quantidade limitada de vida Must Funcional INT2.3 O jogador deve ser capaz de criar ferramentas Must Funcional INT2.4 O jogador deve ser capaz de atacar os inimigos Must Funcional INT2.5 O jogador deve ser capaz de escolher a dificuldade do jogo Should Funcional INT2.6 Um jogador deve ser capaz de entrar no mundo de outro jogador Should Funcional INT2.7 O jogador deve ser capaz de acessar o chat Should Funcional INT2.8 O mundo deve ser gerado com diversos biomas Must Funcional INT2.9 O jogador deve ser capaz de melhorar o material dos seus itens Must Funcional INT2.10 O jogador deve ser capaz de encantar os seus itens Should Funcional INT2.11 Quando um inimigo morrer ele deve deixar um drop Must Funcional INT2.12 O jogador deve ter uma barra de fome Must Funcional"},{"location":"Elicitacoes/Introspeccao/#introspeccao-3","title":"Introspec\u00e7\u00e3o 3","text":""},{"location":"Elicitacoes/Introspeccao/#31-contexto","title":"3.1 Contexto","text":"

Victor \u00e9 apaixonado por jogos que oferecem um alto n\u00edvel de dificuldade, sempre buscando se desafiar ao conquistar todas as conquistas dispon\u00edveis. Por isso, ele espera que o jogo ofere\u00e7a um modo mais desafiador, com inimigos progressivamente mais poderosos. Al\u00e9m disso, ele deseja um sistema de conquistas robusto, que torne os desafios ainda mais din\u00e2micos e estimulantes.

"},{"location":"Elicitacoes/Introspeccao/#32-necessidades-tecnicas","title":"3.2 Necessidades T\u00e9cnicas","text":"
  • Modo hardcore
  • Diversidades de inimigos
  • Sistema de conquistas
  • chefes
"},{"location":"Elicitacoes/Introspeccao/#33-necessidades-individuais","title":"3.3 Necessidades Individuais","text":"
  • Habilidade
  • Conhecimento sobre o jogo
"},{"location":"Elicitacoes/Introspeccao/#34-necessidades-sociais","title":"3.4 Necessidades Sociais","text":"
  • Compartilhar as suas conquistas com outras pessoas
"},{"location":"Elicitacoes/Introspeccao/#35-requisitos-elicitados","title":"3.5 Requisitos Elicitados","text":"C\u00f3digo Descri\u00e7\u00e3o Prioridade Classifica\u00e7\u00e3o INT3.1 Deve existir um modo de jogo onde o jogador pode morrer permanentemente(Hardcore) Should Funcional INT3.2 Cada dimens\u00e3o deve ter diferentes inimigos Must Funcional INT3.3 Devem existir inimigos de diferentes dificuldades Should Funcional INT3.4 O jogo deve apresentar um sistema de conquistas Should Funcional INT3.5 O jogador deve poder acessar o sistema de conquistas a qualquer momento Should Funcional INT3.6 O jogador deve ser capaz de compartilhar suas conquistas com outras pessoas Won't Funcional INT3.7 O jogo deve possuir chefes Must Funcional"},{"location":"Elicitacoes/Introspeccao/#referencias","title":"Refer\u00eancias","text":"

Slide Requisitos Aula 7 - Milene Serrano e Maur\u00edcio Serrano

"},{"location":"Elicitacoes/Moscow/","title":"MoSCoW","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 26/07/2024 0.1 Cria\u00e7\u00e3o do documento Danilo Melo, Patricia Helena, Carlos Eduardo 01/08/2024 0.2 Adi\u00e7\u00e3o da transcri\u00e7\u00e3o Danilo Melo"},{"location":"Elicitacoes/Moscow/#introducao","title":"Introdu\u00e7\u00e3o","text":"

A t\u00e9cnica MoSCoW \u00e9 uma metodologia de prioriza\u00e7\u00e3o utilizada em gerenciamento de projetos, especialmente em desenvolvimento de software. MoSCoW \u00e9 um acr\u00f4nimo que representa quatro categorias de prioriza\u00e7\u00e3o:

  • Must have (Deve ter): Requisitos essenciais para o sucesso do projeto. Sem esses itens, o projeto n\u00e3o pode ser considerado um sucesso.
  • Should have (Deveria ter): Requisitos importantes, mas n\u00e3o essenciais. Eles podem ser adiados se houver limita\u00e7\u00f5es de tempo ou recursos, mas s\u00e3o altamente desej\u00e1veis.
  • Could have (Poderia ter): Requisitos que s\u00e3o desej\u00e1veis, mas menos cr\u00edticos. Sua aus\u00eancia n\u00e3o afetar\u00e1 significativamente o sucesso do projeto.
  • Won't have (N\u00e3o ter\u00e1): Requisitos que foram acordados como n\u00e3o priorit\u00e1rios no momento. Podem ser considerados para vers\u00f5es futuras do projeto.
"},{"location":"Elicitacoes/Moscow/#objetivos","title":"Objetivos","text":"

A t\u00e9cnica MoSCoW ajuda equipes a gerenciar recursos de forma eficaz, assegurando que as partes mais cr\u00edticas do projeto sejam conclu\u00eddas primeiro e proporcionando uma forma clara de comunicar prioridades aos stakeholders.

"},{"location":"Elicitacoes/Moscow/#metodologia","title":"Metodologia","text":"

Para aplicar essa t\u00e9cnica, utilizamos um quadro na ferramenta Miro e realizamos uma reuni\u00e3o via Google Meet. Em seguida, usamos as informa\u00e7\u00f5es obtidas durante o brainstorming para dividir os elementos nas quatro categorias do MoSCoW.

"},{"location":"Elicitacoes/Moscow/#quadro-moscow","title":"Quadro MoSCoW","text":""},{"location":"Elicitacoes/Moscow/#transcricao","title":"Transcri\u00e7\u00e3o","text":"Must Have Should Have Could Have Won't Have Modo sobreviv\u00eancia Dimens\u00f5es Mini-games Carros Blocos b\u00e1sicos Sistema de redstone Skins Esta\u00e7\u00f5es do ano Sistema de invent\u00e1rio Diversidade de mobs Mods Narrativa extensa Constru\u00e7\u00e3o Diversidade de Min\u00e9rios Shaders Pay to win Cria\u00e7\u00e3o de mundos Encantamentos Sistemas Autom\u00e1ticos Realismo excessivo Mobs b\u00e1sicos Biomas Atualiza\u00e7\u00f5es tem\u00e1ticas Conte\u00fado Violento Sistema de craft Chefes Intera\u00e7\u00e3o com os NPCs Linearidade Explora\u00e7\u00e3o Agricultura M\u00f3veis Conte\u00fados pagos exclusivos"},{"location":"Elicitacoes/Moscow/#referencias","title":"Refer\u00eancias","text":"

https://rockcontent.com/br/blog/metodo-moscow/

"},{"location":"Elicitacoes/SWOT/","title":"SWOT","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 01/08/2024 0.1 Cria\u00e7\u00e3o do documento inicial e adi\u00e7\u00e3o da introdu\u00e7\u00e3o e SWOT do modo Sobreviv\u00eancia Patr\u00edcia Helena 01/08/2024 0.2 SWOT do modo Sobreviv\u00eancia Patr\u00edcia Helena 01/08/2024 0.3 SWOT do modo Hardcore Patr\u00edcia Helena 01/08/2024 0.4 SWOT do modo Criativo Patr\u00edcia Helena 01/08/2024 1.0 SWOT do modo Multiplayer Patr\u00edcia Helena"},{"location":"Elicitacoes/SWOT/#introducao","title":"Introdu\u00e7\u00e3o","text":"

A an\u00e1lise SWOT ajuda a desenvolver estrat\u00e9gias eficazes ao fornecer uma vis\u00e3o clara dos pontos fortes e fracos internos, bem como das oportunidades e amea\u00e7as externas.

"},{"location":"Elicitacoes/SWOT/#metodologia","title":"Metodologia","text":"

A an\u00e1lise SWOT \u00e9 uma ferramenta de planejamento estrat\u00e9gico usada para identificar e avaliar os aspectos internos e externos que podem impactar um projeto, neg\u00f3cio ou iniciativa. O termo \"SWOT\" \u00e9 um acr\u00f4nimo que representa quatro elementos:

  • Strengths (For\u00e7as): Aspectos internos positivos que a organiza\u00e7\u00e3o ou projeto faz bem e que podem ser alavancados.
  • Weaknesses (Fraquezas): Aspectos internos negativos que representam \u00e1reas de melhoria ou desafios.
  • Opportunities (Oportunidades): Fatores externos positivos que a organiza\u00e7\u00e3o ou projeto pode explorar para seu benef\u00edcio.
  • Threats (Amea\u00e7as): Fatores externos negativos que podem causar problemas ou desafios.
"},{"location":"Elicitacoes/SWOT/#swot-do-modo-multiplayer","title":"SWOT do Modo Multiplayer","text":"Interno Externo Positivo For\u00e7as Oportunidades - Comunidade ampla - Crescente popularidade dos jogos online - Alta personaliza\u00e7\u00e3o e mods - Expans\u00e3o em mercados emergentes - Facilidade de cria\u00e7\u00e3o de servidores - Colabora\u00e7\u00f5es e parcerias com outras marcas - Grande variedade de modos de jogo - Desenvolvimento de novas tecnologias de jogo Negativo Fraquezas Amea\u00e7as - Problemas de lat\u00eancia em servidores - Concorr\u00eancia de outros jogos multiplayer - Complexidade na configura\u00e7\u00e3o inicial - Problemas de seguran\u00e7a e hacking - Necessidade de modera\u00e7\u00e3o ativa - Mudan\u00e7as nas prefer\u00eancias dos jogadores - Depend\u00eancia de terceiros para servidores"},{"location":"Elicitacoes/SWOT/#swot-do-modo-survival","title":"SWOT do Modo Survival","text":"Interno Externo Positivo For\u00e7as Oportunidades - Experi\u00eancia de jogo desafiadora - Crescente interesse em jogos de sobreviv\u00eancia - Grande sensa\u00e7\u00e3o de progresso - Potencial para novas expans\u00f5es e DLCs - Diversidade de biomas e recursos - Desenvolvimento de novas mec\u00e2nicas de jogo - Sistema de crafting profundo Negativo Fraquezas Amea\u00e7as - Pode ser frustrante para novatos - Concorr\u00eancia de outros jogos de sobreviv\u00eancia - Depend\u00eancia de tempo para progresso - Problemas t\u00e9cnicos e bugs - Repetitividade a longo prazo - Cair na monotonia - Necessidade de gerenciamento de recursos - Poss\u00edveis problemas de balanceamento"},{"location":"Elicitacoes/SWOT/#swot-do-modo-hardcore","title":"SWOT do Modo Hardcore","text":"Interno Externo Positivo For\u00e7as Oportunidades - Alta intensidade e desafio - Comunidade de jogadores hardcore crescente - Grande senso de realiza\u00e7\u00e3o - Torneios e competi\u00e7\u00f5es de sobreviv\u00eancia - Modo de jogo para jogadores experientes - Desenvolvimento de novas mec\u00e2nicas extremas - Permanente, aumenta a tens\u00e3o Negativo Fraquezas Amea\u00e7as - Alto risco de frustra\u00e7\u00e3o - Perda de jogadores devido \u00e0 dificuldade - Menor acessibilidade para iniciantes - Bugs ou problemas t\u00e9cnicos que podem prejudicar a experi\u00eancia - Falta de novos objetivos a longo prazo - Concorr\u00eancia com outros jogos de alta dificuldade - Alto impacto de erros ou falhas - Mudan\u00e7as nas prefer\u00eancias de jogos dos jogadores"},{"location":"Elicitacoes/SWOT/#swot-do-modo-criativo","title":"SWOT do Modo Criativo","text":"Interno Externo Positivo For\u00e7as Oportunidades - Liberdade total para cria\u00e7\u00e3o - Expans\u00e3o em plataformas educacionais - Acesso a todos os recursos do jogo - Potencial para colabora\u00e7\u00f5es com artistas e designers - Ideal para constru\u00e7\u00e3o e design - Desenvolvimento de novas ferramentas de constru\u00e7\u00e3o - Ambiente pac\u00edfico e sem hostilidade Negativo Fraquezas Amea\u00e7as - Pode ser menos desafiador - Concorr\u00eancia com outras plataformas de constru\u00e7\u00e3o - Falta de objetivos espec\u00edficos - Poss\u00edveis problemas de direitos autorais com cria\u00e7\u00f5es - Depend\u00eancia de criatividade do jogador - Mudan\u00e7as nas tend\u00eancias e prefer\u00eancias dos jogadores - Potencial para t\u00e9dio a longo prazo - Problemas t\u00e9cnicos que afetam a constru\u00e7\u00e3o"},{"location":"Elicitacoes/questionarios-e-pesquisas/","title":"Question\u00e1rios e pesquisas","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 20/08/2024 0.0.1 Cria\u00e7\u00e3o e divulga\u00e7\u00e3o do question\u00e1rio Carlos Eduardo e Samara Let\u00edcia 21/08/2024 0.1 Pesquisa e cria\u00e7\u00e3o do documento Carlos Eduardo"},{"location":"Elicitacoes/questionarios-e-pesquisas/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Este documento tem como objetivo apresentar os resultados de uma pesquisa explorat\u00f3ria realizada tanto na internet quanto atrav\u00e9s de question\u00e1rios aplicados aos jogadores. A finalidade principal foi conduzir uma engenharia reversa, visando identificar funcionalidades recentemente adicionadas ao jogo, al\u00e9m de entender as percep\u00e7\u00f5es e opini\u00f5es dos jogadores sobre essas novas atualiza\u00e7\u00f5es.

A pesquisa foi divulgada em grupos de jogadores de minecraft no Discord e facebook.

"},{"location":"Elicitacoes/questionarios-e-pesquisas/#pesquisas","title":"Pesquisas","text":"

As pesquisas realizadas permitiram identificar diversas atualiza\u00e7\u00f5es que foram bastante aguardadas pela comunidade e que introduziram novas funcionalidades ao jogo.

"},{"location":"Elicitacoes/questionarios-e-pesquisas/#atualizacao-villager-pillager-110","title":"Atualiza\u00e7\u00e3o Villager & Pillager (1.10)","text":"

Os alde\u00f5es receberam uma reformula\u00e7\u00e3o, com novas din\u00e2micas e profiss\u00f5es. Al\u00e9m disso, foram introduzidos os Pillagers, inimigos dos Villagers, que representam uma nova amea\u00e7a \u00e0s vilas.

"},{"location":"Elicitacoes/questionarios-e-pesquisas/#atualizacao-aquatica-113","title":"Atualiza\u00e7\u00e3o Aqu\u00e1tica (1.13)","text":"

Muito solicitada pela comunidade, a Atualiza\u00e7\u00e3o Aqu\u00e1tica trouxe novos biomas oce\u00e2nicos, introduziu novas din\u00e2micas e desafios, e adicionou vida marinha ao jogo. Novos mobs, um novo Boss, e o Templo do Oceano foram implementados, criando um desafio novo para os jogadores.

"},{"location":"Elicitacoes/questionarios-e-pesquisas/#update-do-nether-116","title":"Update do Nether (1.16)","text":"

Esta atualiza\u00e7\u00e3o introduziu novos mobs, estruturas, e tr\u00eas novos biomas ao Nether. A explora\u00e7\u00e3o do submundo se tornou mais frequente com a introdu\u00e7\u00e3o de novas mec\u00e2nicas e desafios.

"},{"location":"Elicitacoes/questionarios-e-pesquisas/#atualizacao-caves-cliffs-part-i-117","title":"Atualiza\u00e7\u00e3o Caves & Cliffs: Part I (1.17)","text":"

Trouxe v\u00e1rias novidades, principalmente focadas em novas funcionalidades e blocos relacionados a cavernas e montanhas. Algumas das novidades:

  • Ametista e Geodos: Foram adicionados geodos de ametista, usados para criar telesc\u00f3pios e blocos decorativos.
  • Cobre: Um novo min\u00e9rio que pode ser minerado e usado para criar blocos de cobre, usado para fabricar itens como o para-raios e o telesc\u00f3pio.
  • Moss Block: blocos de musgo que pode ser usado para decora\u00e7\u00e3o e jardinagem.
  • L\u00edquen brilhante: Uma fonte de luz natural encontrada raramente em cavernas, crescendo em qualquer face de um blocos.
  • Azaleia: Planta que inclui arbustos e \u00e1rvores para decora\u00e7\u00e3o.
  • Axolote: Mob aqu\u00e1tico encontrado em cavernas de \u00e1gua. Pode ser capturado com baldes e auxilia os jogadores em combates subaqu\u00e1ticos. (primeiro anf\u00edbio a ser adicionado ao Minecraft)
  • Cabra: Mob encontrado em montanhas. Elas podem saltar grandes dist\u00e2ncias e eventualmente chifrar jogadores e outros mobs.
  • Lula-brilhante: Uma variante brilhante do lula normal, que solta bolsa de tinta brilhante ao ser derrotada, usada para criar itens que brilham, como placas iluminadas.
  • Telesc\u00f3pio: Um item novo que permite que os jogadores d\u00eaem zoom para ver objetos distantes.
  • Para-raios: Usado para proteger estruturas de serem incendiadas por raios, redirecionando os raios para o para-raios.
"},{"location":"Elicitacoes/questionarios-e-pesquisas/#tricky-trials-121","title":"Tricky Trials (1.21)","text":"

Uma das adi\u00e7\u00f5es desta atualiza\u00e7\u00e3o foi a C\u00e2mara do Julgamento, onde os jogadores enfrentam hordas tempor\u00e1rias de inimigos gerados por spawners. Ao superar esse novo tipo de desafio, os jogadores s\u00e3o recompensados.

Outras importantes adi\u00e7\u00f5es:

  • Armadura de Lobo: Armadura protetora que pode ser equipada nos lobos do jogador, melhorando sua defesa e permitindo que sejam tingidas com diferentes cores.
  • Mace: Uma nova arma poderosa que causa dano em \u00e1rea e \u00e9 ideal para combates em masmorras.
  • Novos mobs: Breeze e Bogged Skeleton: O Breeze utiliza poderosas rajadas de ar\u200b nos jogadores, enquanto o Bogged Skeleton dispara flechas envenenadas.
  • Crafter: Um novo blocos automatizado movido a Redstone que facilita a cria\u00e7\u00e3o de itens.
  • Trial Chambers: Novas masmorras subterr\u00e2neas com desafios, armadilhas e mobs \u00fanicos para os jogadores enfrentarem.
"},{"location":"Elicitacoes/questionarios-e-pesquisas/#questionario","title":"Question\u00e1rio","text":"

Sabemos que muitas pessoas n\u00e3o gostam de responder question\u00e1rios, especialmente quando s\u00e3o longos. Com isso em mente, foi criado um question\u00e1rio curto, com apenas tr\u00eas perguntas, mas que o grupo julgou ser suficientes para o prop\u00f3sito.

O formul\u00e1rio foi divido em duas se\u00e7\u00f5es:

  • Atualiza\u00e7\u00f5es Recentes: Visa identificar quais atualiza\u00e7\u00f5es recentes do Minecraft geraram mais expectativa entre os jogadores.
  • Funcionalidades Futuras: Busca saber quais funcionalidades ou melhorias os jogadores gostariam de ver nas pr\u00f3ximas atualiza\u00e7\u00f5es do Minecraft.

Confira as respostas do question\u00e1rio aqui.

"},{"location":"Elicitacoes/questionarios-e-pesquisas/#requisitos-elicitados","title":"Requisitos Elicitados","text":"

Com base no question\u00e1rio e na pesquisa realizada, abaixo est\u00e3o os requisitos identificados.

C\u00f3digo Descri\u00e7\u00e3o QP1 Deve haver novos blocos decorativos para expandir as op\u00e7\u00f5es de constru\u00e7\u00e3o e paisagismo. QP2 Devem ser adicionados novos biomas e ru\u00ednas para explora\u00e7\u00e3o. QP3 Deve haver armaduras para que possam proteger os lobos durante o jogo. QP4 Deve ser adicionada uma nova arma de dano em \u00e1rea para facilitar combates enfrentando m\u00faltiplos inimigos de uma s\u00f3 vez QP5 Deve haver a inclus\u00e3o de novos biomas do Nether, adicionando desafios para incentivar a explora\u00e7\u00e3o do submundo. QP6 Deve ser introduzido um telesc\u00f3pio, permitindo aos jogadores maior alcance de vis\u00e3o. QP7 Deve ser melhorada a din\u00e2mica de intera\u00e7\u00e3o com alde\u00f5es, com novas profiss\u00f5es e comportamentos QP8 Deve haver mais op\u00e7\u00f5es de personaliza\u00e7\u00e3o para mobs de estima\u00e7\u00e3o. QP9 Deve haver um sistema de crafting autom\u00e1tico, que permita aos jogadores automatizar processos. QP10 Deve haver vida marinha, incluindo novos mobs desafiadores. QP11 Deve haver mais atualiza\u00e7\u00f5es focadas em cavernas e montanhas, expandindo os blocos e recursos dispon\u00edveis. QP12 Deve haver a inclus\u00e3o do min\u00e9rio de cobre. QP13 Nova mec\u00e2nica de defesa contra raios, com a introdu\u00e7\u00e3o de blocos como o para-raios. QP14 Deve ser inclu\u00eddos novos mobs de animais. QP15 Novo sistema de ilumina\u00e7\u00e3o, com l\u00e2mpadas de cobre. QP16 Deve haver novas estruturas geradas como masmorras subterr\u00e2neas, com novos desafios e recompensas. QP17 Deve haver novos inimigos QP18 Novos eventos e desafios tempor\u00e1rios com recompensas exclusivas"},{"location":"Elicitacoes/questionarios-e-pesquisas/#referencias","title":"Refer\u00eancias:","text":"

Adegilson. Minecraft: Seria a atualiza\u00e7\u00e3o 1.21 a maior desde o update do Nether?. Acesso em: ago de 2024. Dispon\u00edvel em: https://nationpop.com.br/seria-a-atualizacao-1-21-a-maior-desde-o-update-do-nether/

Boddy, ZACHARY. The Minecraft 1.21 update is official, with automated crafting, trial dungeons, and a brand-new mob. Acesso em: ago de 2024. Dispon\u00edvel em: https://www.windowscentral.com/gaming/minecraft/the-minecraft-121-update-is-official-with-automated-crafting-trial-dungeons-and-a-brand-new-mob

Boddy, ZACHARY. Minecraft 1.21 'Tricky Trials Update' FAQ: Release date, features, mobs, snapshots, and other questions answered. Acesso em: ago de 2024. Dispon\u00edvel em: https://www.windowscentral.com/gaming/minecraft/minecraft-1-21-update-faq

Minecraft Wiki. Edi\u00e7\u00e3o Java 1.17. Acesso em: ago de 2024. Dispon\u00edvel em: https://minecraft.fandom.com/pt/wiki/Edi%C3%A7%C3%A3o_Java_1.17

"},{"location":"Elicitacoes/requisitos-nao-funcionais/","title":"Observa\u00e7\u00e3o dos Requisitos n\u00e3o funcionais","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 21/08/2024 0.1 Cria\u00e7\u00e3o do documento Carlos Eduardo 08/09/2024 0.2 Atualizando a tabela Danilo Melo"},{"location":"Elicitacoes/requisitos-nao-funcionais/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Abaixo est\u00e3o reunidos os requisitos que foram observados no minecraft a respeito da qualidade do sistema, como desempenho, seguran\u00e7a e usabilidade. Estes requisitos ajudam a garantir que o jogo ofere\u00e7a uma experi\u00eancia de usu\u00e1rio satisfat\u00f3ria.

"},{"location":"Elicitacoes/requisitos-nao-funcionais/#requisitos-elicitados","title":"Requisitos Elicitados","text":"Categoria C\u00f3digo Requisito Desempenho RNF1 O jogo deve ter um tempo de resposta r\u00e1pido para a\u00e7\u00f5es dos jogadores, como movimenta\u00e7\u00e3o e intera\u00e7\u00e3o com blocos. Desempenho RNF2 O jogo deve minimizar a lat\u00eancia de rede para garantir uma experi\u00eancia de jogo suave em modos multiplayer. Desempenho RNF3 O chat deve funcionar de forma fluida e sem atrasos percept\u00edveis. Desempenho RNF4 Deve haver op\u00e7\u00f5es para ajustar a qualidade gr\u00e1fica, incluindo resolu\u00e7\u00e3o, dist\u00e2ncia de renderiza\u00e7\u00e3o e efeitos visuais. Seguran\u00e7a RNF5 O jogo deve ter mecanismos para proteger as contas dos jogadores contra acessos n\u00e3o autorizados. Usabilidade RNF6 A interface do usu\u00e1rio deve ser intuitiva e f\u00e1cil de navegar. Usabilidade RNF7 O jogo deve fornecer feedback visual e auditivo claro para as a\u00e7\u00f5es dos jogadores. Usabilidade RNF8 O jogador deve ser capaz de personalizar atalhos de teclado e controles. Usabilidade RNF9 O jogo deve incluir um sistema de ajuda relevante durante a gameplay. Compatibilidade RNF10 O jogo deve ser compat\u00edvel com diferentes plataformas como PC, consoles e dispositivos m\u00f3veis. Compatibilidade RNF11 Deve haver suporte para diferentes resolu\u00e7\u00f5es e configura\u00e7\u00f5es de gr\u00e1ficos. Compatibilidade RNF12 O jogo deve oferecer suporte a mods e plugins em diferentes plataformas. Requisitos Adicionais RNF13 O jogo deve suportar m\u00faltiplos idiomas. Requisitos Adicionais RNF14 O jogo deve permitir a personaliza\u00e7\u00e3o de skins e pacotes de textura. Requisitos Adicionais RNF15 O menu de pausa deve ser acess\u00edvel durante o jogo e deve permitir que os jogadores acessem as configura\u00e7\u00f5es ou saiam do jogo facilmente. Requisitos Adicionais RNF16 O jogo deve permitir que os jogadores personalizem os controles de entrada de acordo com suas prefer\u00eancias. Requisitos Adicionais RNF17 O jogo deve permitir aos jogadores ajustar o volume do som e da m\u00fasica separadamente. Requisitos Adicionais RNF18 O jogo deve ter um sistema de salvamento autom\u00e1tico para evitar perda de progresso."},{"location":"Elicitacoes/resultados/","title":"Resultado das t\u00e9cnicas de elicita\u00e7\u00e3o","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 06/09/2024 0.1 Cria\u00e7\u00e3o do documento inicial e adi\u00e7\u00e3o dos RF1 a RF23 e RNF1 Carlos Eduardo Rodrigues 07/09/2024 0.2 Adi\u00e7\u00e3o RF24 a RF52 e RNF2 Carlos Eduardo Rodrigues 08/09/2024 0.3 Adi\u00e7\u00e3o RF53 Carlos Eduardo Rodrigues"},{"location":"Elicitacoes/resultados/#requisitos-funcionais","title":"Requisitos Funcionais","text":"C\u00f3digo Requisito T\u00e9cnica(s) RF1 O usu\u00e1rio deve ser capaz de criar, entrar e gerenciar uma conta no Minecraft. An\u00e1lise de Protocolo RF2 O usu\u00e1rio deve ser capaz de se locomover utilizando o teclado. An\u00e1lise de Protocolo RF3 O usu\u00e1rio deve ser capaz de interagir com o mundo utilizando o mouse. An\u00e1lise de Protocolo RF4 Os recursos devem ser armazenados no invent\u00e1rio do usu\u00e1rio. An\u00e1lise de Protocolo, Brainstorming, MoSCoW, Introspeccao RF5 O jogo deve possuir um dicion\u00e1rio com a explica\u00e7\u00e3o de todos os itens descobertos pelo usu\u00e1rio. An\u00e1lise de Protocolo RF6 O usu\u00e1rio deve precisar de uma mesa de trabalho para fabricar ferramentas eficientes. An\u00e1lise de Protocolo RF7 O jogo deve permitir que, atrav\u00e9s de min\u00e9rios, o usu\u00e1rio crie novas ferramentas. An\u00e1lise de Protocolo, Brainstorming, MoSCoW RF8 O jogo deve oferecer diferentes tipos de alimentos para evitar que o personagem do usu\u00e1rio morra de fome. An\u00e1lise de Protocolo, Brainstorming RF9 No modo hardcore, o usu\u00e1rio deve ter apenas uma vida, tornando o jogo mais desafiador e definitivo. An\u00e1lise de Protocolo, Introspeccao RF10 No modo hardcore, ap\u00f3s a morte, o usu\u00e1rio deve ser capaz de entrar apenas no modo espectador, sem interagir com o mundo. An\u00e1lise de Protocolo RF11 No modo hardcore, o jogo deve ser definido automaticamente na dificuldade mais alta e n\u00e3o pode ser alterado. An\u00e1lise de Protocolo RF12 No modo hardcore, os comandos de cheats devem estar desabilitados para garantir a integridade do desafio. An\u00e1lise de Protocolo RF13 Deve existir um modo de jogo onde o jogador pode exercitar a sua criatividade An\u00e1lise de protocolo RF14 No modo criativo, o usu\u00e1rio deve ser capaz de sobrevoar rapidamente pelo mapa para facilitar as cria\u00e7\u00f5es. An\u00e1lise de Protocolo, Introspeccao RF15 O usu\u00e1rio deve ser capaz de colocar e quebrar blocos com apenas um comando no modo criativo. An\u00e1lise de Protocolo, Introspeccao RF16 O usu\u00e1rio deve ter acesso a todos os itens do jogo no modo criativo. An\u00e1lise de Protocolo, Introspeccao RF17 O usu\u00e1rio n\u00e3o deve precisar se preocupar com vida ou barra de fome no modo criativo, focando apenas em criar. An\u00e1lise de Protocolo RF18 Mobs hostis devem ignorar a presen\u00e7a do usu\u00e1rio no modo criativo. An\u00e1lise de Protocolo RF19 No modo criativo, usu\u00e1rio deve ser capaz de alterar o clima e a hora do dia conforme necess\u00e1rio para suas cria\u00e7\u00f5es. An\u00e1lise de Protocolo RF20 Deve haver um sistema de chat para comunica\u00e7\u00e3o entre os jogadores, com suporte a comandos especiais. An\u00e1lise de Protocolo, Brainstorming, Introspeccao RF21 Jogos multiplayer devem permitir a cria\u00e7\u00e3o e personaliza\u00e7\u00e3o de diversos modos de jogo, como constru\u00e7\u00e3o, sobreviv\u00eancia e PvP. An\u00e1lise de Protocolo, Brainstorming RF22 Jogos multiplayer devem fornecer um sistema de vota\u00e7\u00e3o justo e intuitivo durante competi\u00e7\u00f5es para escolher as melhores constru\u00e7\u00f5es ou desempenhos. An\u00e1lise de Protocolo, Brainstorming RF23 Em Jogos multiplayer deve ser poss\u00edvel a cria\u00e7\u00e3o e agendamento de eventos e competi\u00e7\u00f5es especiais para os jogadores. An\u00e1lise de Protocolo RF24 O jogador dever ser capaz de colocar alguns blocos na hotbar. Introspeccao RF25 O jogador deve ser capaz de compartilhar o seu mapa com outro jogador. Introspeccao RF26 Deve existir um modo de jogo onde o jogador pode morrer (sobreviv\u00eancia) Introspeccao, Brainstorming, MoSCoW RF27 Com exce\u00e7\u00e3o dos modos Criativo e Espectador, o jogador deve ter uma quantidade limitada de vida Introspeccao RF28 O jogador deve ser capaz de criar ferramentas Introspeccao RF29 O jogador deve ser capaz de atacar os inimigos Introspeccao RF30 Com exce\u00e7\u00e3o do modo hardcore, o jogador deve ser capaz de escolher a dificuldade do jogo Introspeccao RF31 O mundo deve ser gerado com diversos biomas Introspeccao RF32 O jogador deve ser capaz de melhorar o material dos seus itens Introspeccao RF33 O jogador deve ser capaz de encantar os seus itens Introspeccao RF34 Quando um inimigo morrer ele deve deixar um drop Introspeccao RF35 O jogador deve ter uma barra de fome Introspeccao RF36 Cada dimens\u00e3o deve ter diferentes inimigos Introspeccao, Question\u00e1rio RF37 Devem existir inimigos de diferentes dificuldades Introspeccao RF38 O jogo deve apresentar um sistema de conquistas Introspeccao RF39 O jogador deve poder acessar o sistema de conquistas a qualquer momento Introspeccao RF40 O jogador deve ser capaz de compartilhar suas conquistas com outros jogadores Introspeccao RF41 O jogo deve possuir chefes Introspeccao RF42 Deve haver blocos decorativos para expandir as op\u00e7\u00f5es de constru\u00e7\u00e3o e paisagismo. Question\u00e1rio RF43 Deve haver ru\u00ednas, cavernas, montanhas e masmorras subterr\u00e2neas, com desafios e recompensas para que os jogadores realizem explora\u00e7\u00f5es. Question\u00e1rio RF44 Deve haver armaduras para os jogadores e seus animais de combate. Question\u00e1rio RF45 Deve haver armas de dano em \u00e1rea para facilitar combates enfrentando m\u00faltiplos inimigos de uma s\u00f3 vez Question\u00e1rio RF46 Os biomas do Nether, devem possuir desafios e recompensas \u00fanicas para incentivar a explora\u00e7\u00e3o do submundo. Question\u00e1rio RF47 Deve haver mobs pac\u00edficos com profiss\u00f5es Question\u00e1rio RF48 Os jogadores devem ser capazes de personalizar os seus mobs de estima\u00e7\u00e3o. Question\u00e1rio RF49 Deve haver um sistema de crafting autom\u00e1tico, que permita aos jogadores automatizar processos. Question\u00e1rio RF50 Deve haver diferentes tipos de min\u00e9rios e recursos Question\u00e1rio RF51 Deve haver diferentes tipos de mobs de animais. Question\u00e1rio RF52 Deve haver eventos e desafios tempor\u00e1rios com recompensas exclusivas Question\u00e1rio RF53 O jogador deve ser capaz de criar novos mundos no minecraft Brainstorming, An\u00e1lise de protocolo"},{"location":"Elicitacoes/resultados/#requisitos-nao-funcionais","title":"Requisitos N\u00e3o Funcionais","text":"C\u00f3digo Requisito T\u00e9cnica(s) RNF1 O servidor deve suportar a conex\u00e3o simult\u00e2nea de m\u00faltiplos jogadores sem queda de desempenho. An\u00e1lise de Protocolo RNF2 O jogo deve ter um sistema de salvamento autom\u00e1tico Introspeccao"},{"location":"entregas/primeira-entrega/","title":"PRIMEIRA ENTREGA EM V\u00cdDEO","text":"

A primeira entrega em v\u00eddeo est\u00e1 dispon\u00edvel aqui. Se preferir, voc\u00ea pode assistir logo abaixo.

"},{"location":"entregas/segunda-entrega/","title":"SEGUNDA ENTREGA EM V\u00cdDEO","text":"

A segunda entrega em v\u00eddeo est\u00e1 dispon\u00edvel aqui. Se preferir, voc\u00ea pode assistir logo abaixo.

"},{"location":"modelagem/Epics/","title":"Epics","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 16/08/2024 0.1 Cria\u00e7\u00e3o do documento inicial Danilo Melo"},{"location":"modelagem/Epics/#introducao","title":"Introdu\u00e7\u00e3o","text":"

O modelo de Epics e Hist\u00f3rias de Usu\u00e1rios estrutura o desenvolvimento de funcionalidades no Minecraft em quatro n\u00edveis:

  • Theme: Tema geral do jogo, como Explora\u00e7\u00e3o.
  • Epic: Grandes blocos de funcionalidades, como Biomas Diversos.
  • User Stories: Descrevem as necessidades do jogador, como \"Quero explorar novos biomas.\"
  • Tasks: Tarefas t\u00e9cnicas que os desenvolvedores realizam para implementar as hist\u00f3rias de usu\u00e1rio.

Esse modelo organiza o processo de desenvolvimento de forma clara, do conceito \u00e0 implementa\u00e7\u00e3o, garantindo uma experi\u00eancia de jogo coesa.

"},{"location":"modelagem/Epics/#modos-de-jogo","title":"Modos de jogo","text":""},{"location":"modelagem/Epics/#exploracao","title":"Explora\u00e7\u00e3o","text":""},{"location":"modelagem/NFR/","title":"NFR","text":""},{"location":"modelagem/NFR/#historico-de-revisao","title":"Hist\u00f3rico de Revis\u00e3o","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 21/08/2024 0.1 Cria\u00e7\u00e3o do documento e adi\u00e7\u00e3o do NFR de usabilidade Patricia Helena 21/08/2024 0.2 Adi\u00e7\u00e3o do NFR de Desempenho Patricia Helena"},{"location":"modelagem/NFR/#introducao","title":"Introdu\u00e7\u00e3o","text":"

O modelo NFR Framework \u00e9 voltado para a condu\u00e7\u00e3o da Engenharia de Requisitos com \u00eanfase em requisitos n\u00e3o funcionais, incluindo uma extens\u00e3o que apoia a an\u00e1lise de suposi\u00e7\u00f5es para verificar a satisfa\u00e7\u00e3o das metas flex\u00edveis.

"},{"location":"modelagem/NFR/#usabilidade","title":"Usabilidade","text":"

Vers\u00e3o 1 - Autora: Patricia Helena

"},{"location":"modelagem/NFR/#desempenho","title":"Desempenho","text":"

Vers\u00e3o 1 - Autora: Patricia Helena

"},{"location":"modelagem/backlog/","title":"Backlog do Produto","text":""},{"location":"modelagem/backlog/#historico-de-revisao","title":"Hist\u00f3rico de Revis\u00e3o","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 21/08/2024 0.1 Cria\u00e7\u00e3o do documento e adi\u00e7\u00e3o dos requisitos de US001 a US031 Danilo Melo 08/09/2024 0.2 Adi\u00e7\u00e3o dos temas nos items e linkagens com os termos do l\u00e9xico Danilo Melo"},{"location":"modelagem/backlog/#metodologia","title":"Metodologia","text":"

Para o desenvolvimento do backlog do produto, foram utilizados como base os artefatos do brainstorming, introspec\u00e7\u00e3o e casos de uso.

ID Tema Eu, como Desejo Para que eu possa US001 Cria\u00e7\u00e3o de mundo Usu\u00e1rio Criar um novo mundo no minecraft Come\u00e7ar a jogar US002 Modos de jogo Usu\u00e1rio Selecionar o modo de jogo Jogar de diferentes formas US003 Dificuldade Usu\u00e1rio Selecionar a dificuldade do mundo Ter um jogo mais desafiador US004 Carregar mundo Usu\u00e1rio Carregar um mundo existente Acessar mundos existentes US005 Explora\u00e7\u00e3o Usu\u00e1rio Me movimentar Explorar o mundo US006 Explora\u00e7\u00e3o Usu\u00e1rio Interagir com o ambiente Modificar o mundo US007 Explora\u00e7\u00e3o Usu\u00e1rio Coletar recursos Criar novos itens e construir US008 Combate Usu\u00e1rio Encontrar inimigos Enfrentar eles US009 Combate Usu\u00e1rio Enfrentar inimigos Atacar eles e conseguir itens US010 Combate Usu\u00e1rio Utilizar armaduras Ficar mais forte US011 Combate Usu\u00e1rio Utilizar po\u00e7\u00f5es Ficar mais forte US012 Combate Usu\u00e1rio Utilizar ferramentas de combate Causar mais dano US013 Combate Usu\u00e1rio Encontrar diferentes tipos de inimigos Ter uma experi\u00eancia de jogo variada US014 Personagem Usu\u00e1rio Ter um invent\u00e1rio Guardar os meus recursos US015 Personagem Usu\u00e1rio Ter uma hotbar Ter acesso r\u00e1pido aos meus recursos US016 Personagem Usu\u00e1rio Ter uma barra de vida Ver minha vida de forma f\u00e1cil US017 Personagem Usu\u00e1rio Ter uma barra de fome Ver minha fome de forma f\u00e1cil US018 Personagem Usu\u00e1rio Ter uma barra de armadura Ver minha meu n\u00edvel de armadura de forma f\u00e1cil US019 Personagem Usu\u00e1rio Ter uma \u00e1rea de craft no invent\u00e1rio Criar meus itens US020 Personagem Usu\u00e1rio Ver os efeitos das po\u00e7\u00f5es Ver o tempo que ela vai durar US021 Constru\u00e7\u00e3o Usu\u00e1rio Colocar blocos Criar constru\u00e7\u00f5es US022 Constru\u00e7\u00e3o Usu\u00e1rio Quebrar blocos Coletar recursos US023 Social Usu\u00e1rio Adicionar amigos Jogar com os meus amigos US024 Social Usu\u00e1rio Excluir amigos Remover algu\u00e9m da lista de amigos US025 Social Usu\u00e1rio Acessar minha lista de amigos Ver quem est\u00e1 online US026 Social Usu\u00e1rio Convidar um amigo para jogar Jogar junto com meu amigo US027 Social Usu\u00e1rio Acessar servidoreses Jogar com outras pessoas US028 Jogabilidade Usu\u00e1rio Criar diferentes itens Evoluir no jogo e criar novas constru\u00e7\u00f5es US029 Jogabilidade Usu\u00e1rio Encantar os meus itens Ter ferramentas e armaduras mais fortes US030 Jogabilidade Usu\u00e1rio Ganhar experi\u00eancia Para eu subir de n\u00edvel e encantar meus itens US031 Social Usu\u00e1rio Criar um servidor Eu possa jogar com outras pessoas"},{"location":"modelagem/casos-de-uso/","title":"Casos de uso","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 18/08/2024 0.1 Cria\u00e7\u00e3o do documento inicial com diagrama e tabelas da especifica\u00e7\u00e3o suplementar Carlos Eduardo 19/08/2024 0.2 Linkagens com os termos do l\u00e9xico Carlos Eduardo 20/08/2024 0.3 Adi\u00e7\u00e3o do diagrama de cria\u00e7\u00e3o de mundos e realms Carlos Eduardo"},{"location":"modelagem/casos-de-uso/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Este documento cont\u00e9m a especifica\u00e7\u00e3o dos casos de uso, onde o principal objetivo \u00e9 detalhar as intera\u00e7\u00f5es entre os usu\u00e1rios e o sistema, uma das melhores formas para a elicita\u00e7\u00e3o dos requisitos funcionais.

"},{"location":"modelagem/casos-de-uso/#diagramas-dos-casos-de-uso","title":"Diagramas dos Casos de Uso","text":""},{"location":"modelagem/casos-de-uso/#caso-de-uso-geral","title":"Caso de uso geral","text":"

Vers\u00e3o 1 - Autor: Carlos Eduardo

"},{"location":"modelagem/casos-de-uso/#criacao-de-mundos-e-realms","title":"Cria\u00e7\u00e3o de mundos e realms","text":"

Vers\u00e3o 1 - Autor: Carlos Eduardo

"},{"location":"modelagem/casos-de-uso/#especificacao-do-caso-de-uso","title":"Especifica\u00e7\u00e3o do caso de uso","text":""},{"location":"modelagem/casos-de-uso/#uc01-criar-mundo","title":"UC01 Criar mundo","text":"Criar mundo Descri\u00e7\u00e3o: Criar um novo mundo no Minecraft. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Usu\u00e1rio deve estar no menu principal do jogo. Fluxo Principal: 1. Usu\u00e1rio acessa o menu \"Criar Mundo\". 2. Usu\u00e1rio configura as op\u00e7\u00f5es desejadas para o mundo (nome, tipo de mundo, etc.). 3. Usu\u00e1rio confirma a cria\u00e7\u00e3o do mundo. Fluxo Alternativo: 1. Usu\u00e1rio decide cancelar a cria\u00e7\u00e3o do mundo antes de confirmar. 2. Usu\u00e1rio retorna ao menu principal. Fluxo de Exce\u00e7\u00e3o: 1. Ocorre um erro durante a cria\u00e7\u00e3o do mundo. 2. Usu\u00e1rio recebe uma mensagem de erro e \u00e9 redirecionado ao menu principal. P\u00f3s-condi\u00e7\u00f5es: Um novo mundo \u00e9 criado e carregado para o usu\u00e1rio explorar."},{"location":"modelagem/casos-de-uso/#uc02-selecionar-modo-de-jogo-e-dificuldade","title":"UC02 Selecionar modo de jogo e dificuldade","text":"Selecionar modo de jogo e dificuldade Descri\u00e7\u00e3o: Selecionar o modo de jogo e a dificuldade para o mundo. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Usu\u00e1rio deve estar no menu de cria\u00e7\u00e3o ou edi\u00e7\u00e3o de um mundo. Fluxo Principal: 1. Usu\u00e1rio acessa as configura\u00e7\u00f5es de modo de jogo e dificuldade. 2. Usu\u00e1rio seleciona o modo de jogo desejado (Sobreviv\u00eancia, Criativo, Aventura, Espectador, Hardcore). 3. Usu\u00e1rio escolhe o n\u00edvel de dificuldade (F\u00e1cil, M\u00e9dio, Dif\u00edcil...). Fluxo Alternativo: 1. Usu\u00e1rio decide manter as configura\u00e7\u00f5es padr\u00e3o. Fluxo de Exce\u00e7\u00e3o: 1. Erro ao salvar as configura\u00e7\u00f5es. 2. Usu\u00e1rio \u00e9 notificado e tenta novamente. P\u00f3s-condi\u00e7\u00f5es: Configura\u00e7\u00f5es de modo de jogo e dificuldade aplicadas ao mundo."},{"location":"modelagem/casos-de-uso/#uc03-carregar-mundo","title":"UC03 Carregar mundo","text":"Carregar mundo Descri\u00e7\u00e3o: Carregar um mundo existente. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Usu\u00e1rio deve estar no menu principal do jogo. Fluxo Principal: 1. Usu\u00e1rio acessa a lista de mundos salvos. 2. Usu\u00e1rio seleciona o mundo desejado. 3. Mundo \u00e9 carregado e o jogador pode jogar. Fluxo Alternativo: 1. Usu\u00e1rio decide n\u00e3o carregar nenhum mundo e retorna ao menu principal. Fluxo de Exce\u00e7\u00e3o: 1. Ocorre um erro ao carregar o mundo. 2. Usu\u00e1rio \u00e9 notificado e redirecionado ao menu principal. P\u00f3s-condi\u00e7\u00f5es: Mundo existente \u00e9 carregado para o jogador."},{"location":"modelagem/casos-de-uso/#uc04-explorar-mundo","title":"UC04 Explorar mundo","text":"Explorar mundo Descri\u00e7\u00e3o: Explorar o mundo do Minecraft. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Mundo deve estar carregado e pronto para explora\u00e7\u00e3o. Fluxo Principal: 1. Usu\u00e1rio move o personagem pelo mundo. 2. Usu\u00e1rio interage com o ambiente. 3. Usu\u00e1rio coleta recursos ou enfrenta inimigos. Fluxo Alternativo: 1. Usu\u00e1rio decide construir ou modificar o ambiente durante a explora\u00e7\u00e3o. Fluxo de Exce\u00e7\u00e3o: 1. Ocorre um erro no jogo durante a explora\u00e7\u00e3o. 2. Usu\u00e1rio \u00e9 notificado e o jogo pode reiniciar. P\u00f3s-condi\u00e7\u00f5es: O mundo \u00e9 explorado."},{"location":"modelagem/casos-de-uso/#uc05-combater-inimigos","title":"UC05 Combater inimigos","text":"Combater inimigos Descri\u00e7\u00e3o: Combater inimigos no jogo. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Usu\u00e1rio deve estar em modo de sobreviv\u00eancia ou similar. Fluxo Principal: 1. Usu\u00e1rio encontra inimigos durante a explora\u00e7\u00e3o. 2. Usu\u00e1rio usa armas ou ferramentas para atacar os inimigos. 3. Inimigos s\u00e3o derrotados ou o jogador \u00e9 derrotado. Fluxo Alternativo: 1. Usu\u00e1rio decide evitar o combate e foge ou se esconde dos inimigos. Fluxo de Exce\u00e7\u00e3o: 1. Jogo trava durante o combate. 2. O jogo \u00e9 reiniciado. P\u00f3s-condi\u00e7\u00f5es: Inimigos derrotados ou jogador recome\u00e7a ap\u00f3s a derrota."},{"location":"modelagem/casos-de-uso/#uc06-proteger-territorio","title":"UC06 Proteger territ\u00f3rio","text":"Proteger territ\u00f3rio Descri\u00e7\u00e3o: Proteger o territ\u00f3rio no jogo. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Usu\u00e1rio deve ter estabelecido uma base ou local de interesse. Fluxo Principal: 1. Usu\u00e1rio constr\u00f3i defesas ao redor do territ\u00f3rio. 2. Usu\u00e1rio protege o territ\u00f3rio de ataques inimigos. 3. Territ\u00f3rio permanece seguro ou \u00e9 invadido. Fluxo Alternativo: 1. Usu\u00e1rio decide abandonar o territ\u00f3rio e mudar para um novo local. Fluxo de Exce\u00e7\u00e3o: 1. Defesas falham e territ\u00f3rio \u00e9 invadido. 2. Usu\u00e1rio deve reconstruir sua base ou procurar outro local. P\u00f3s-condi\u00e7\u00f5es: Territ\u00f3rio protegido, abandonado ou h\u00e1 a necessidade de reconstru\u00e7\u00e3o."},{"location":"modelagem/casos-de-uso/#uc07-construir-blocos","title":"UC07 Construir blocos","text":"Construir blocos Descri\u00e7\u00e3o: Construir blocos no jogo. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Usu\u00e1rio deve possuir blocos no invent\u00e1rio. Fluxo Principal: 1. Usu\u00e1rio seleciona os blocos no invent\u00e1rio. 2. Usu\u00e1rio posiciona os blocos no mundo conforme desejado. 3. Constru\u00e7\u00e3o \u00e9 realizada. Fluxo Alternativo: 1. Usu\u00e1rio decide n\u00e3o construir o bloco. Fluxo de Exce\u00e7\u00e3o: 1. Ocorre um erro ao posicionar os blocos. 2. Usu\u00e1rio tenta novamente ou usa outro tipo de bloco. P\u00f3s-condi\u00e7\u00f5es: Blocos constru\u00eddos."},{"location":"modelagem/casos-de-uso/#uc08-quebrar-blocos","title":"UC08 Quebrar blocos","text":"Quebrar blocos Descri\u00e7\u00e3o: Quebrar blocos no jogo. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Usu\u00e1rio deve estar equipado com uma ferramenta ou \u00e0 m\u00e3o livre. Fluxo Principal: 1. Usu\u00e1rio seleciona o bloco que deseja quebrar. 2. Usu\u00e1rio utiliza a ferramenta adequada ou \u00e0 m\u00e3o livre para quebrar o bloco. 3. Bloco \u00e9 quebrado e, se for poss\u00edvel, coletado para o invent\u00e1rio. Fluxo Alternativo: 1. Usu\u00e1rio decide n\u00e3o coletar o bloco quebrado e o deixa no ch\u00e3o. Fluxo de Exce\u00e7\u00e3o: 1. Bloco n\u00e3o pode ser quebrado por estar protegido ou ser indestrut\u00edvel. 2. Usu\u00e1rio desiste de quebrar o bloco ou procura outra ferramenta. P\u00f3s-condi\u00e7\u00f5es: Bloco \u00e9 quebrado ou permanece intacto."},{"location":"modelagem/casos-de-uso/#uc09-coletar-recursos","title":"UC09 Coletar recursos","text":"Coletar recursos Descri\u00e7\u00e3o: Coletar recursos no jogo. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Usu\u00e1rio deve explorar o mundo. Fluxo Principal: 1. Usu\u00e1rio encontra recursos durante a explora\u00e7\u00e3o. 2. Usu\u00e1rio utiliza ferramentas ou \u00e0 m\u00e3o livre para coletar os recursos. 3. Recursos s\u00e3o adicionados ao invent\u00e1rio. Fluxo Alternativo: 1. Usu\u00e1rio decide n\u00e3o coletar os recursos e continua a explora\u00e7\u00e3o. Fluxo de Exce\u00e7\u00e3o: 1. Recursos s\u00e3o destru\u00eddos acidentalmente durante a coleta. 2. Usu\u00e1rio procura por mais recursos no mundo. P\u00f3s-condi\u00e7\u00f5es: Recursos coletados e armazenados no invent\u00e1rio."},{"location":"modelagem/casos-de-uso/#uc10-adicionar-e-gerenciar-amigos","title":"UC10 Adicionar e gerenciar amigos","text":"Adicionar e gerenciar amigos Descri\u00e7\u00e3o: Adicionar e gerenciar amigos no jogo. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Usu\u00e1rio deve estar conectado a uma rede e ter uma conta microsoft. Fluxo Principal: 1. Usu\u00e1rio acessa a lista de amigos. 2. Usu\u00e1rio adiciona novos amigos ou gerencia os existentes. 3. Amizades s\u00e3o atualizadas junto ao servidor do jogo. Fluxo Alternativo: 1. Usu\u00e1rio decide remover ou bloquear um amigo da lista. Fluxo de Exce\u00e7\u00e3o: 1. Erro ao atualizar a lista de amigos. 2. Usu\u00e1rio tenta novamente ou entra em contato com o suporte. P\u00f3s-condi\u00e7\u00f5es: Amigos adicionados ou lista de amigos gerenciada."},{"location":"modelagem/casos-de-uso/#uc11-criar-itens","title":"UC11 Criar Itens","text":"Criar Itens Descri\u00e7\u00e3o: Criar itens no jogo usando recursos coletados. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Usu\u00e1rio deve possuir os recursos necess\u00e1rios no invent\u00e1rio. Fluxo Principal: 1. Usu\u00e1rio acessa a mesa de trabalho ou o menu de cria\u00e7\u00e3o. 2. Usu\u00e1rio seleciona o item a ser criado. 3. Item \u00e9 criado e adicionado ao invent\u00e1rio. Fluxo Alternativo: 1. Usu\u00e1rio decide n\u00e3o criar o item e fecha o menu de cria\u00e7\u00e3o. Fluxo de Exce\u00e7\u00e3o: 1. Recursos insuficientes para criar o item. 2. Usu\u00e1rio coleta mais recursos e tenta novamente. P\u00f3s-condi\u00e7\u00f5es: Item criado e adicionado ao invent\u00e1rio do usu\u00e1rio."},{"location":"modelagem/casos-de-uso/#uc12-jogar-no-modo-multiplayer","title":"UC12 Jogar no modo multiplayer","text":"Jogar no modo multiplayer Descri\u00e7\u00e3o: Jogar no modo multiplayer com outros usu\u00e1rios. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Usu\u00e1rio deve estar conectado \u00e0 internet e ter uma conta no Minecraft. Fluxo Principal: 1. Usu\u00e1rio acessa o menu multiplayer. 2. Usu\u00e1rio escolhe um servidor ou insere o IP de um servidor espec\u00edfico. 3. Usu\u00e1rio conecta-se ao servidor e come\u00e7a a jogar com outros jogadores. Fluxo Alternativo: 1. Usu\u00e1rio decide jogar em modo singleplayer e retorna ao menu principal. Fluxo de Exce\u00e7\u00e3o: 1. Erro de conex\u00e3o com o servidor. 2. Usu\u00e1rio tenta conectar novamente ou escolhe outro servidor. P\u00f3s-condi\u00e7\u00f5es: Usu\u00e1rio conectado ao servidor e jogando com outros jogadores."},{"location":"modelagem/casos-de-uso/#uc13-entrar-ou-criar-conta","title":"UC13 Entrar ou criar conta","text":"Entrar ou criar conta Descri\u00e7\u00e3o: Entrar ou criar uma conta no Minecraft. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Usu\u00e1rio deve ter acesso \u00e0 internet. Fluxo Principal: 1. Usu\u00e1rio acessa o menu de login. 2. Usu\u00e1rio acessa a p\u00e1gina de login da microsoft e insere as credenciais ou cria uma nova conta. 3. Usu\u00e1rio \u00e9 autenticado e pode acessar o jogo. Fluxo Alternativo: 1. Usu\u00e1rio decide jogar sem se conectar a sua conta Fluxo de Exce\u00e7\u00e3o: 1. Erro ao criar ou entrar na conta. 2. Usu\u00e1rio verifica as credenciais e tenta novamente. P\u00f3s-condi\u00e7\u00f5es: Usu\u00e1rio autenticado."},{"location":"modelagem/casos-de-uso/#uc14-conectar-ou-adicionar-um-servidor","title":"UC14 Conectar ou adicionar um servidor","text":"Conectar ou adicionar um servidor Descri\u00e7\u00e3o: Conectar-se a um servidor existente ou adicionar um novo. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Usu\u00e1rio deve estar conectado \u00e0 internet. Fluxo Principal: 1. Usu\u00e1rio acessa o menu de servidores. 2. Usu\u00e1rio seleciona um servidor existente ou insere o IP de um novo servidor. 3. Usu\u00e1rio conecta-se ao servidor escolhido. Fluxo Alternativo: 1. Usu\u00e1rio decide n\u00e3o se conectar a nenhum servidor e retorna ao menu principal. Fluxo de Exce\u00e7\u00e3o: 1. Erro ao conectar-se ao servidor. 2. Usu\u00e1rio tenta novamente ou escolhe outro servidor. P\u00f3s-condi\u00e7\u00f5es: Usu\u00e1rio conectado ao servidor."},{"location":"modelagem/casos-de-uso/#uc15-sair-do-jogo","title":"UC15 Sair do jogo","text":"Sair do jogo Descri\u00e7\u00e3o: Sair do jogo e retornar ao sistema operacional. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Jogo deve estar em execu\u00e7\u00e3o. Fluxo Principal: 1. Usu\u00e1rio acessa o menu de pausa ou o principal. 2. Usu\u00e1rio seleciona a op\u00e7\u00e3o de sair do jogo. 3. Jogo \u00e9 fechado e usu\u00e1rio retorna ao SO. Fluxo Alternativo: 1. Usu\u00e1rio decide continuar jogando e fecha o menu. Fluxo de Exce\u00e7\u00e3o: 1. Jogo trava ao tentar sair. 2. Usu\u00e1rio for\u00e7a o fechamento do jogo via sistema operacional. P\u00f3s-condi\u00e7\u00f5es: Jogo fechado e retorno ao sistema operacional."},{"location":"modelagem/casos-de-uso/#uc16-salvar-mundo","title":"UC16 Salvar mundo","text":"Salvar mundo Descri\u00e7\u00e3o: Salvar o progresso do mundo em que est\u00e1 jogando. Ator(es): Usu\u00e1rio Pr\u00e9-Requisitos: Usu\u00e1rio deve estar jogando em um mundo. Fluxo Principal: 1. Usu\u00e1rio acessa o menu de pausa. 2. Usu\u00e1rio seleciona a op\u00e7\u00e3o de salvar. 3. Progresso do mundo \u00e9 salvo. Fluxo Alternativo: 1. Usu\u00e1rio decide n\u00e3o salvar e continua jogando. Fluxo de Exce\u00e7\u00e3o: 1. Erro ao salvar o mundo. 2. Usu\u00e1rio tenta novamente ou verifica espa\u00e7o dispon\u00edvel. P\u00f3s-condi\u00e7\u00f5es: mundo salvo e progresso garantido."},{"location":"modelagem/casos-de-uso/#uc17-configuracoes-gerais","title":"UC17 Configura\u00e7\u00f5es gerais","text":"Configura\u00e7\u00f5es gerais Descri\u00e7\u00e3o: Permite ao jogador ajustar configura\u00e7\u00f5es gerais do mundo, como modo de jogo e dificuldade. Ator(es): Jogador Pr\u00e9-Requisitos: O jogador deve estar na tela de configura\u00e7\u00e3o do mundo. Fluxo Principal: 1. O jogador acessa a se\u00e7\u00e3o de configura\u00e7\u00f5es gerais.2. O jogador ajusta as op\u00e7\u00f5es de modo de jogo e dificuldade.3. O jogador confirma as configura\u00e7\u00f5es e prossegue para a pr\u00f3xima etapa. Fluxo Alternativo: 1. O jogador decide manter as configura\u00e7\u00f5es padr\u00e3o.2. O jogador confirma as configura\u00e7\u00f5es e prossegue para a pr\u00f3xima etapa. Fluxo de Exce\u00e7\u00e3o: 1. Falha ao aplicar as configura\u00e7\u00f5es.2. O jogo solicita que o jogador ajuste as configura\u00e7\u00f5es novamente. P\u00f3s-condi\u00e7\u00f5es: As configura\u00e7\u00f5es gerais s\u00e3o aplicadas e o jogador pode continuar a configura\u00e7\u00e3o do mundo."},{"location":"modelagem/casos-de-uso/#uc18-criar-no-servidor-realms","title":"UC18 Criar no servidor Realms","text":"Criar no servidor Realms Descri\u00e7\u00e3o: Permite ao jogador criar um mundo no servidor Realms. Ator(es): Jogador Pr\u00e9-Requisitos: O jogador deve estar logado em sua conta da Microsoft e ter uma assinatura ativa do Realms. Fluxo Principal: 1. O jogador seleciona a op\u00e7\u00e3o para criar no servidor Realms.2. O jogador escolhe um nome e configurac\u00f5es para o Realms.3. O jogador confirma e o mundo \u00e9 criado no servidor Realms. Fluxo Alternativo: 1. O jogador decide criar o mundo localmente em vez de usar o Realms.2. O jogador retorna \u00e0 op\u00e7\u00e3o de cria\u00e7\u00e3o de mundo local. Fluxo de Exce\u00e7\u00e3o: 1. Falha ao conectar ao servidor Realms.2. O jogo notifica o jogador e permite tentar novamente ou retornar ao menu principal. P\u00f3s-condi\u00e7\u00f5es: O mundo \u00e9 criado no servidor Realms e fica dispon\u00edvel para o jogador e seus amigos convidados."},{"location":"modelagem/casos-de-uso/#uc19-selecionar-grupamento","title":"UC19 Selecionar grupamento","text":"Selecionar grupamento Descri\u00e7\u00e3o: Permite ao jogador escolher a quantidade de jogadores que poder\u00e3o jogar simultaneamente no servidor Realms (2 ou 10). Ator(es): Jogador Pr\u00e9-Requisitos: O jogador deve estar na etapa de cria\u00e7\u00e3o no servidor Realms. Fluxo Principal: 1. O jogador acessa a op\u00e7\u00e3o de sele\u00e7\u00e3o de grupamento.2. O jogador escolhe entre as op\u00e7\u00f5es de 2 ou 10 jogadores.3. O jogador confirma a escolha e prossegue com a cria\u00e7\u00e3o. Fluxo Alternativo: 1. O jogador \u00e9 direcionado \u00e0 escolha padr\u00e3o ou retorna \u00e0 tela anterior. Fluxo de Exce\u00e7\u00e3o: 1. O jogador encontra problemas ao selecionar o grupamento.2. O jogo notifica o jogador para tentar novamente ou escolher outra op\u00e7\u00e3o. P\u00f3s-condi\u00e7\u00f5es: O grupamento \u00e9 selecionado, permitindo a cria\u00e7\u00e3o do mundo com o n\u00famero especificado de jogadores simult\u00e2neos."},{"location":"modelagem/casos-de-uso/#uc20-selecionar-nome-do-realm","title":"UC20 Selecionar nome do realm","text":"Selecionar nome do realm Descri\u00e7\u00e3o: Permite ao jogador escolher o nome do Realm onde o mundo ser\u00e1 criado. Ator(es): Jogador Pr\u00e9-Requisitos: O jogador deve estar na etapa de cria\u00e7\u00e3o do mundo no Realms. O jogador deve estar conectado \u00e0 internet. Fluxo Principal: 1. O jogador acessa a op\u00e7\u00e3o para nomear o Realm.2. O jogador digita o nome desejado.3. O jogador confirma o nome e prossegue com a cria\u00e7\u00e3o do mundo. Fluxo Alternativo: 1. O jogador decide utilizar um nome sugerido automaticamente pelo jogo.2. O jogador confirma o nome sugerido e prossegue. Fluxo de Exce\u00e7\u00e3o: 1. O nome escolhido j\u00e1 est\u00e1 em uso ou \u00e9 inv\u00e1lido.2. O jogo solicita que o jogador escolha outro nome. P\u00f3s-condi\u00e7\u00f5es: O nome do Realm \u00e9 registrado e o jogador pode continuar com a cria\u00e7\u00e3o do mundo."},{"location":"modelagem/casos-de-uso/#uc21-aceitar-termos-e-condicoes-realms","title":"UC21 Aceitar termos e condi\u00e7\u00f5es realms","text":"Aceitar termos e condi\u00e7\u00f5es realms Descri\u00e7\u00e3o: Requer que o jogador aceite os termos e condi\u00e7\u00f5es para utilizar o servidor Realms. Ator(es): Jogador Pr\u00e9-Requisitos: O jogador deve estar na etapa de cria\u00e7\u00e3o do mundo no Realms. O jogador deve estar conectado \u00e0 internet. Fluxo Principal: 1. O jogador \u00e9 apresentado aos termos e condi\u00e7\u00f5es.2. O jogador l\u00ea e aceita os termos e condi\u00e7\u00f5es.3. O jogador prossegue com a cria\u00e7\u00e3o do servidor realms. Fluxo Alternativo: 1. O jogador decide n\u00e3o aceitar os termos e condi\u00e7\u00f5es.2. O jogador \u00e9 impedido de prosseguir com a cria\u00e7\u00e3o do mundo no Realms. Fluxo de Exce\u00e7\u00e3o: 1. Falha ao registrar a aceita\u00e7\u00e3o dos termos e condi\u00e7\u00f5es.2. O jogo solicita que o jogador tente aceitar os termos novamente. P\u00f3s-condi\u00e7\u00f5es: Os termos e condi\u00e7\u00f5es s\u00e3o aceitos e o jogador pode continuar a cria\u00e7\u00e3o do mundo no Realms."},{"location":"modelagem/cenarios/","title":"Cen\u00e1rios","text":""},{"location":"modelagem/cenarios/#historico-de-versoes","title":"Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 30/07/2024 0.1 Cria\u00e7\u00e3o de Cen\u00e1rios Samara Let\u00edcia 01/08/2024 0.2 Revis\u00e3o Danilo Melo 06/09/2024 0.3 Atualiza\u00e7\u00f5es e adi\u00e7\u00f5es de cen\u00e1rios Samara Let\u00edcia"},{"location":"modelagem/cenarios/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Os cen\u00e1rios s\u00e3o empregados como uma ferramenta para modelar as intera\u00e7\u00f5es usu\u00e1rio-sistema. Essa abordagem permite detalhar os fluxos de trabalho, desde a inicia\u00e7\u00e3o at\u00e9 a conclus\u00e3o de uma tarefa, considerando as diversas possibilidades e exce\u00e7\u00f5es. Atrav\u00e9s da an\u00e1lise de cen\u00e1rios, \u00e9 poss\u00edvel identificar requisitos funcionais e n\u00e3o funcionais de forma mais precisa, garantindo a qualidade e a usabilidade do sistema desenvolvido.

"},{"location":"modelagem/cenarios/#metodologia","title":"Metodologia","text":"

A metodologia utilizada neste trabalho baseia-se na modelagem de casos de uso e na an\u00e1lise de fluxos de intera\u00e7\u00e3o, al\u00e9m do uso de brainstorming.

"},{"location":"modelagem/cenarios/#cenario-01","title":"Cen\u00e1rio 01","text":"T\u00edtulo: Din\u00e2mica do Minecraft survival Objetivo: Descrever o in\u00edcio do Minecraft Contexto: In\u00edcio de Jogo Atores: Jogador Recursos: Minecraft Launcher Epis\u00f3dios: Jogador cria mundo Jogador escolhe modo de jogo sobreviv\u00eancia Jogador escolhe dificuldade do jogo (pac\u00edfico, f\u00e1cil, normal ou dif\u00edcil) Jogador nomeia o mundo Jogador entra no mundo (overworld) Restri\u00e7\u00e3o: Carregamento e atualiza\u00e7\u00f5es r\u00e1pidas Come\u00e7ar em um bioma com bons recursos Exce\u00e7\u00e3o Launcher n\u00e3o carregar o mundo Erro na gera\u00e7\u00e3o de biomas Estruturas n\u00e3o encontradas"},{"location":"modelagem/cenarios/#cenario-02","title":"Cen\u00e1rio 02","text":"T\u00edtulo: Din\u00e2mica do Minecraft criativo Objetivo: Criar uma constru\u00e7\u00e3o no Minecraft Contexto: Modo de Jogo: criativo Atores: Jogador Recursos: Minecraft Launcher Epis\u00f3dios: Jogador escolhe coordenadas da constru\u00e7\u00e3o Jogador abre o invent\u00e1rio Jogador escolhe recursos Jogador coloca recursos no mundo, construindo a estrutura desejada Restri\u00e7\u00e3o: Bom desempenho do jogo Localizar facilmente os recursos Exce\u00e7\u00e3o Falta de mem\u00f3ria para carregar a constru\u00e7\u00e3o Desempenho lento do jogo"},{"location":"modelagem/cenarios/#cenario-03","title":"Cen\u00e1rio 03","text":"T\u00edtulo: Ir ao end Objetivo: Descrever como chegar a dimens\u00e3o end Contexto: Jogo avan\u00e7ado Atores: Jogador Recursos: Minecraft Launcher Epis\u00f3dios: Jogador cria olho de ender Jogador usa olho de ender para localizar a fortaleza Jogador entra na sala de portal Jogador coloca os Olhos de Ender no portal Jogador entra no portal Restri\u00e7\u00e3o: Carregamento e atualiza\u00e7\u00f5es r\u00e1pidas Entrar na plataforma principal do End Exce\u00e7\u00e3o Launcher n\u00e3o carregar o End Cair no vazio N\u00e3o localizar a fortaleza N\u00e3o obter Ender pearls"},{"location":"modelagem/cenarios/#cenario-04","title":"Cen\u00e1rio 04","text":"T\u00edtulo: Derrotar o Ender Dragon Objetivo: Derrotar o Ender Dragon e completar o jogo Contexto: Final do jogo Atores: Jogador Recursos: Minecraft Launcher, armas, armaduras, po\u00e7\u00f5es Epis\u00f3dios: Jogador encontra a fortaleza do End Jogador ativa o portal do End Jogador vai ao End Jogador destr\u00f3i cristais do End Jogador ataca o Drag\u00e3o at\u00e9 derrot\u00e1-lo Restri\u00e7\u00e3o: Ter todos os itens necess\u00e1rios para o combate Exce\u00e7\u00e3o Launcher n\u00e3o carregar o End Cair no vazio N\u00e3o localizar a fortaleza Ser morto pelo Ender Dragon"},{"location":"modelagem/cenarios/#cenario-05","title":"Cen\u00e1rio 05","text":"T\u00edtulo: Derrotar o Warden Objetivo: Derrotar o Warden no subterr\u00e2neo Contexto: Jogo Avan\u00e7ado Atores: Jogador Recursos: Minecraft Launcher, armadura, armas Epis\u00f3dios: Jogador encontra cidade ancestral Jogador atrai o Warden com vibra\u00e7\u00f5es Jogador ataca o Warden com estrat\u00e9gia \u00e0 dist\u00e2ncia e corpo-a-corpo Restri\u00e7\u00e3o: Ter todos os itens necess\u00e1rios para o combate Exce\u00e7\u00e3o Jogador \u00e9 derrotado pelo Warden Jogador perde todos os itens durante a batalha Jogador n\u00e3o consegue encontrar Cidade Ancestral"},{"location":"modelagem/cenarios/#cenario-06","title":"Cen\u00e1rio 06","text":"T\u00edtulo: Chocar um Ovo de Farejador Objetivo: Obter um Farejador Contexto: Jogo Avan\u00e7ado Atores: Jogador Recursos: Minecraft Launcher, pincel Epis\u00f3dios: Jogador encontra ru\u00ednas Jogador utiliza pincel nos blocos para tentar obter Ovo de Farejador Jogador coloca ovo de farejador sobre bloco de terra ou musgo Farejador sai do ovo depois de um determinado tempo Restri\u00e7\u00e3o: Ter todos os itens necess\u00e1rios para crafitar um pincel Achar Ovo de Farejador com facilidade Exce\u00e7\u00e3o Jogador n\u00e3o consegue localizar uma ru\u00edna Jogador n\u00e3o consegue encontrar Ovo de Farejador"},{"location":"modelagem/cenarios/#cenario-07","title":"Cen\u00e1rio 07","text":"T\u00edtulo: Derrotar um Mob Simples (Zumbi, Esqueleto, Creeper) Objetivo: Derrotar um mob simples Contexto: Jogo Inicial Atores: Jogador Recursos: Minecraft Launcher Epis\u00f3dios: Jogador espera anoitecer Jogador encontra mob Jogador ataca mob at\u00e9 derrot\u00e1-lo Restri\u00e7\u00e3o: Utilizar armas e armadura forte Exce\u00e7\u00e3o Jogador \u00e9 derrotado pelo Mob Jogador perde todos os itens durante a batalha"},{"location":"modelagem/cenarios/#cenario-08","title":"Cen\u00e1rio 08","text":"T\u00edtulo: Fazer uma Farm de Pedra Objetivo: Criar uma Farm autom\u00e1tica de pedra Contexto: Jogo Inicial Atores: Jogador Recursos: Minecraft Launcher, lava, \u00e1gua, redstone Epis\u00f3dios: Jogador coleta materiais Jogador utiliza materiais para construir a farm de pedra Jogador coleta as pedras Restri\u00e7\u00e3o: Boa constru\u00e7\u00e3o e otimiza\u00e7\u00e3o Exce\u00e7\u00e3o N\u00e3o conseguir encontrar lava N\u00e3o utilizar corretamente a redstone Farm falhar ao produzir pedra"},{"location":"modelagem/cenarios/#cenario-09","title":"Cen\u00e1rio 09","text":"T\u00edtulo: Crafitar uma Cama Objetivo: Construir uma cama no minecraft utilizando a mesa de constru\u00e7\u00e3o Contexto: Jogo Inicial Atores: Jogador Recursos: Minecraft Launcher, mesa de constru\u00e7\u00e3o Epis\u00f3dios: Jogador encontra ovelhas Jogador obtem l\u00e3 de ovelhas Jogador obt\u00e9m madeira de qualquer \u00e1rvore Jogador transforma madeira bruta em t\u00e1bua de madeira Jogador utiliza mesa de constru\u00e7\u00e3o para construir cama utilizando as l\u00e3s e as t\u00e1buas de madeira Restri\u00e7\u00e3o: Obter todos os itens necess\u00e1rios Exce\u00e7\u00e3o Jogador n\u00e3o encontra l\u00e3s da mesma colora\u00e7\u00e3o Jogador n\u00e3o encontra ovelhas Jogador n\u00e3o obtem recursos suficientes"},{"location":"modelagem/cenarios/#cenario-10","title":"Cen\u00e1rio 10","text":"T\u00edtulo: Reproduzir Villagers Objetivo: Reproduzir villagers no jogo Contexto: Jogo Normal Atores: Jogador Recursos: Minecraft Launcher, comida, camas Epis\u00f3dios: Jogador encontra vila Jogador posiciona cama perto dos villagers Jogador coloca d\u00e1 comida a 2 villagers Villagers se reproduzem Restri\u00e7\u00e3o: Villagers dispon\u00edveis, espa\u00e7o suficiente Exce\u00e7\u00e3o Villagers n\u00e3o se reproduzem"},{"location":"modelagem/cenarios/#cenario-11","title":"Cen\u00e1rio 11","text":"T\u00edtulo: Voar com Elytra Objetivo: Voar utilizando a Elytra Contexto: Jogo Avan\u00e7ado Atores: Jogador Recursos: Minecraft Launcher, Elytra Epis\u00f3dios: Jogador crafita foguetes Jogador equipa a Elytra Jogador aciona foguete enquanto o segura Restri\u00e7\u00e3o: Durabilidade da Elytra e n\u00famero de foguetes Exce\u00e7\u00e3o Elytra quebra durante o jogo N\u00e3o obt\u00e9m os recursos necess\u00e1rios para crafitar foguetes"},{"location":"modelagem/cenarios/#cenario-12","title":"Cen\u00e1rio 12","text":"T\u00edtulo: Domar um Lobo Objetivo: Domar um lobo no minecraft Contexto: Jogo Normal Atores: Jogador Recursos: Minecraft Launcher, ossos Epis\u00f3dios: Jogador encontra Lobo Jogador alimenta Lobo com ossos Lobo \u00e9 domado pelo Jogador Restri\u00e7\u00e3o: Ter ossos suficientes Exce\u00e7\u00e3o Lobo n\u00e3o \u00e9 domado Jogador n\u00e3o encontra um Lobo"},{"location":"modelagem/cenarios/#cenario-13","title":"Cen\u00e1rio 13","text":"T\u00edtulo: Encontrar um tesouro escondido Objetivo: Encontrar um tesouro no minecraft Contexto: Jogo Normal Atores: Jogador Recursos: Minecraft Launcher Epis\u00f3dios: Jogador encontra Naufr\u00e1gio Jogador obt\u00e9m mapa do tesouro Jogador procura o tesouro utilizando o mapa Jogador obt\u00e9m tesouro escondido Restri\u00e7\u00e3o: Encontrar um mapa do tesouro Encontrar um naufr\u00e1gio Localiza\u00e7\u00e3o precisa Exce\u00e7\u00e3o Naufr\u00e1gio n\u00e3o produz mapa do tesouro Jogador n\u00e3o consegue localizar o tesouro"},{"location":"modelagem/especificacaoSuplementar/","title":"Especifica\u00e7\u00f5es Suplementares","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor 20/08/2024 0.1 Cria\u00e7\u00e3o das Especifica\u00e7\u00f5es Samara Let\u00edcia"},{"location":"modelagem/especificacaoSuplementar/#introducao","title":"Introdu\u00e7\u00e3o","text":"

A especifica\u00e7\u00e3o suplementar garante que todos os requisitos do sistema, incluindo aqueles relacionados \u00e0 qualidade e desempenho, sejam devidamente considerados.

"},{"location":"modelagem/especificacaoSuplementar/#1-desempenho","title":"1. Desempenho","text":"
  • Taxa de Quadros (FPS): O jogo deve manter uma taxa m\u00ednima de 30 FPS em dispositivos que atendam \u00e0s especifica\u00e7\u00f5es recomendadas.
  • Uso de Mem\u00f3ria: O jogo pede no m\u00ednimo 4GB de RAM para uma experi\u00eancia agrad\u00e1vel em dispositivos com as configura\u00e7\u00f5es m\u00ednimas.
"},{"location":"modelagem/especificacaoSuplementar/#2-requisitos-de-seguranca","title":"2. Requisitos de Seguran\u00e7a","text":"
  • Autentica\u00e7\u00e3o: Todos os jogadores devem autenticar-se atrav\u00e9s de uma conta Microsoft para acessar servidores online.
  • Criptografia: As comunica\u00e7\u00f5es entre o cliente e o servidor devem ser criptografadas utilizando TLS 1.2 ou superior.
  • Prote\u00e7\u00e3o contra Exploits: Medidas devem ser implementadas para proteger o jogo contra exploits conhecidos, como manipula\u00e7\u00e3o de pacotes ou modding n\u00e3o autorizado.
"},{"location":"modelagem/especificacaoSuplementar/#3-requisitos-de-usabilidade","title":"3. Requisitos de Usabilidade","text":"
  • Interface do Usu\u00e1rio: A interface deve ser responsiva e adapt\u00e1vel a diferentes resolu\u00e7\u00f5es de tela, incluindo dispositivos m\u00f3veis.
  • Acessibilidade: O jogo deve incluir op\u00e7\u00f5es de acessibilidade, como suporte a leitores de tela e modos de alto contraste.
  • Documenta\u00e7\u00e3o: Deve haver documenta\u00e7\u00e3o clara e acess\u00edvel para novos jogadores explicando as funcionalidades b\u00e1sicas do jogo.
"},{"location":"modelagem/especificacaoSuplementar/#4-requisitos-de-compatibilidade","title":"4. Requisitos de Compatibilidade","text":"
  • Compatibilidade Multiplataforma: O jogo deve ser compat\u00edvel com Windows, Xbox, PlayStation, Nintendo Switch, iOS e Android.
  • Suporte a Versionamento: Deve ser poss\u00edvel jogar em servidores que suportam m\u00faltiplas vers\u00f5es do jogo, ou pelo menos a vers\u00e3o mais recente.
"},{"location":"modelagem/especificacaoSuplementar/#5-requisitos-de-manutencao","title":"5. Requisitos de Manuten\u00e7\u00e3o","text":"
  • Atualiza\u00e7\u00f5es: O jogo deve permitir atualiza\u00e7\u00f5es regulares sem a necessidade de reinstala\u00e7\u00e3o completa.
  • Backup de Dados: O jogo deve permitir a realiza\u00e7\u00e3o de backups autom\u00e1ticos dos dados dos jogadores.
"},{"location":"modelagem/lexico/","title":"L\u00e9xico","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 30/07/2024 0.1 Cria\u00e7\u00e3o do documento inicial e adi\u00e7\u00e3o dos l\u00e9xicos de L01 a L38 Carlos Eduardo Rodrigues 01/08/2024 0.2 Adi\u00e7\u00e3o dos l\u00e9xicos L39 e L40 Danilo Melo 01/08/2024 0.3 Adi\u00e7\u00e3o do l\u00e9xico L41 Patr\u00edcia Helena 19/08/2024 0.4 Adi\u00e7\u00e3o dos l\u00e9xicos L42 a L44 e corre\u00e7\u00f5es Carlos Eduardo 20/08/2024 0.5 Adi\u00e7\u00e3o do l\u00e9xico L45 Carlos Eduardo 21/08/2024 0.6 Adi\u00e7\u00e3o do l\u00e9xico L46 ao L50 Patricia Helena 06/09/2024 0.7 Adi\u00e7\u00e3o do l\u00e9xico L51 Samara Let\u00edcia"},{"location":"modelagem/lexico/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Este artefato trata-se de um conjunto de termos e defini\u00e7\u00f5es que possuem o objetivo de eliminar ambiguidades e garantir uma comunica\u00e7\u00e3o clara e precisa entre todos os integrantes do grupo.

"},{"location":"modelagem/lexico/#metodologia","title":"Metodologia","text":"

Para o levantamento dos termos descritos neste documento, o grupo utilizou palavras chaves j\u00e1 levantadas em artefatos anteriores, como por exemplo o Brainstorming.

Nome L\u00e9xico Classifica\u00e7\u00e3o Classifica\u00e7\u00e3o quanto a Estado, Verbo ou Objeto Sin\u00f4nimos Sin\u00f4nimos do l\u00e9xico no contexto No\u00e7\u00e3o No\u00e7\u00f5es do l\u00e9xicos Impacto Impacto na aplica\u00e7\u00e3o"},{"location":"modelagem/lexico/#lexicos","title":"L\u00e9xicos","text":""},{"location":"modelagem/lexico/#l01-nether","title":"L01 Nether","text":"Nome Nether Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Inferno, Submundo No\u00e7\u00e3o Dimens\u00e3o alternativa no Minecraft, que \u00e9 caracterizada por um ambiente hostil e recursos \u00fanicos. Impacto Acesso a recursos como Netherite e Blaze Rods. Crucial para progress\u00e3o no jogo, como alcan\u00e7ar o End."},{"location":"modelagem/lexico/#l02-chefes","title":"L02 Chefes","text":"Nome Chefes Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Boss, Inimigos Poderosos No\u00e7\u00e3o Criaturas extremamente fortes no jogo, representando desafios para os jogadores. Impacto Drops raros e recompensas valiosas. Elemento central para completar certos objetivos do jogo."},{"location":"modelagem/lexico/#l03-estruturas-geradas","title":"L03 Estruturas geradas","text":"Nome Estruturas geradas Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos - No\u00e7\u00e3o Conjuntos de blocos gerados no jogo que podem conter recursos. Impacto Fonte de explora\u00e7\u00e3o e obten\u00e7\u00e3o de itens. Importantes para a narrativa e progresso do jogo."},{"location":"modelagem/lexico/#l04-end","title":"L04 End","text":"Nome End Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Fim, Mundo do Drag\u00e3o No\u00e7\u00e3o Dimens\u00e3o final do Minecraft, lar do Ender Dragon e de v\u00e1rios recursos valiosos. Impacto Local da batalha final contra o Ender Dragon. Cont\u00e9m recursos \u00fanicos como Ender Pearls e Elytra. Marca a conclus\u00e3o do jogo."},{"location":"modelagem/lexico/#l05-overworld","title":"L05 Overworld","text":"Nome Overworld Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Mundo, Superf\u00edcie No\u00e7\u00e3o O mundo principal e padr\u00e3o do Minecraft onde os jogadores come\u00e7am. Impacto Ambiente principal para sobreviv\u00eancia, constru\u00e7\u00e3o e explora\u00e7\u00e3o. Cont\u00e9m a maioria dos biomas, criaturas e recursos. Base para a maioria das atividades dos jogadores."},{"location":"modelagem/lexico/#l06-espectador","title":"L06 Espectador","text":"Nome Espectador Classifica\u00e7\u00e3o Estado Sin\u00f4nimos Observador, Watcher No\u00e7\u00e3o Modo de jogo que permite aos jogadores voar e atravessar blocos, sem intera\u00e7\u00e3o direta com o mundo. Impacto Ideal para explorar e observar o mundo sem interferir. \u00datil para entender a mec\u00e2nica do jogo e planejar constru\u00e7\u00f5es."},{"location":"modelagem/lexico/#l07-criativo","title":"L07 Criativo","text":"Nome Criativo Classifica\u00e7\u00e3o Estado Sin\u00f4nimos Modo Criativo, Cria\u00e7\u00e3o No\u00e7\u00e3o Modo de jogo onde os jogadores t\u00eam acesso ilimitado a todos os blocos e itens, e podem voar. Impacto Facilita a constru\u00e7\u00e3o de grandes estruturas. Permite criatividade sem restri\u00e7\u00f5es de recursos."},{"location":"modelagem/lexico/#l08-aventura","title":"L08 Aventura","text":"Nome Aventura Classifica\u00e7\u00e3o Estado Sin\u00f4nimos Modo Aventura, explora\u00e7\u00e3o No\u00e7\u00e3o Modo de jogo onde os jogadores podem interagir com objetos e mobs, mas n\u00e3o podem destruir blocos sem as ferramentas adequadas. Impacto Ideal para mapas customizados e desafios criados pela comunidade. Incentiva a explora\u00e7\u00e3o."},{"location":"modelagem/lexico/#l09-sobrevivencia","title":"L09 Sobreviv\u00eancia","text":"Nome Sobreviv\u00eancia Classifica\u00e7\u00e3o Estado Sin\u00f4nimos Modo Survival, Resist\u00eancia No\u00e7\u00e3o Modo de jogo onde os jogadores devem coletar recursos, construir, e sobreviver contra mobs. Impacto Desafio principal do jogo, combina explora\u00e7\u00e3o, coleta de recursos e combate."},{"location":"modelagem/lexico/#l10-hardcore","title":"L10 Hardcore","text":"Nome Hardcore Classifica\u00e7\u00e3o Estado Sin\u00f4nimos Modo Hardcore, Extremo No\u00e7\u00e3o Variante do modo sobreviv\u00eancia, mas com morte permanente e dificuldade mais alta. Impacto Aumenta a tens\u00e3o e o desafio do jogo, cada decis\u00e3o \u00e9 crucial."},{"location":"modelagem/lexico/#l11-craft","title":"L11 Craft","text":"Nome Craft Classifica\u00e7\u00e3o Verbo Sin\u00f4nimos Construir, Forjar, Fabricar, criar No\u00e7\u00e3o A\u00e7\u00e3o de combinar itens no Minecraft para criar novos itens ou blocos. Impacto Essencial para a sobreviv\u00eancia e progress\u00e3o no jogo. Permite a cria\u00e7\u00e3o de ferramentas, armas, armaduras, e outros itens \u00fateis."},{"location":"modelagem/lexico/#l12-redstone","title":"L12 Redstone","text":"Nome Redstone Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Circuitos, Componentes No\u00e7\u00e3o Material no Minecraft usado para criar mecanismos e circuitos el\u00e9tricos. Impacto Permite a automa\u00e7\u00e3o e cria\u00e7\u00e3o de m\u00e1quinas complexas. Usado em portas autom\u00e1ticas, elevadores, e outras constru\u00e7\u00f5es avan\u00e7adas."},{"location":"modelagem/lexico/#l13-farms","title":"L13 Farms","text":"Nome Farms Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Fazendas, Cultivos No\u00e7\u00e3o Estruturas criadas pelos jogadores para coletar recursos automaticamente ou de maneira eficiente. Impacto Fonte constante de recursos como alimentos. Reduz a necessidade de coleta manual."},{"location":"modelagem/lexico/#l14-servidores","title":"L14 Servidores","text":"Nome Servidores Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Hosts, Redes No\u00e7\u00e3o Plataformas online onde jogadores podem se conectar para jogar Minecraft juntos. Impacto Permite o jogo multiplayer. Comunidades e eventos organizados."},{"location":"modelagem/lexico/#l15-skins","title":"L15 Skins","text":"Nome Skins Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Apar\u00eancias, Trajes No\u00e7\u00e3o Personaliza\u00e7\u00f5es visuais para os personagens dos jogadores no Minecraft. Impacto Personaliza\u00e7\u00e3o e express\u00e3o individual no jogo. Cria\u00e7\u00e3o e compartilhamento entre jogadores."},{"location":"modelagem/lexico/#l16-mods","title":"L16 Mods","text":"Nome Mods Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Modifica\u00e7\u00f5es No\u00e7\u00e3o Altera\u00e7\u00f5es criadas pela comunidade que mudam ou adicionam novos conte\u00fados ao Minecraft. Impacto Expans\u00e3o das funcionalidades e conte\u00fados do jogo."},{"location":"modelagem/lexico/#l17-mineracao","title":"L17 Minera\u00e7\u00e3o","text":"Nome Minera\u00e7\u00e3o Classifica\u00e7\u00e3o Verbo Sin\u00f4nimos Extrair, Garimpar No\u00e7\u00e3o A\u00e7\u00e3o de cavar e coletar recursos minerais no Minecraft. Impacto Fonte prim\u00e1ria de recursos como carv\u00e3o, ferro, ouro e diamantes. Essencial para a cria\u00e7\u00e3o de ferramentas e constru\u00e7\u00e3o."},{"location":"modelagem/lexico/#l18-ferramentas","title":"L18 Ferramentas","text":"Nome Ferramentas Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Utens\u00edlios, Equipamentos No\u00e7\u00e3o Objetos utilizados pelos jogadores para realizar diversas atividades como minera\u00e7\u00e3o, constru\u00e7\u00e3o e combate. Impacto Essenciais para a coleta de recursos e defesa contra mobs. Melhoram a efici\u00eancia e a capacidade de sobreviv\u00eancia do jogador."},{"location":"modelagem/lexico/#l19-criaturas","title":"L19 Criaturas","text":"Nome Criaturas Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos mobs, Entidades No\u00e7\u00e3o Seres vivos no Minecraft que podem ser pac\u00edficos, neutros ou hostis. Impacto Intera\u00e7\u00f5es diversas como combate, domestica\u00e7\u00e3o e com\u00e9rcio. Fonte de recursos espec\u00edficos como carne, couro e drops raros."},{"location":"modelagem/lexico/#l20-trocas","title":"L20 Trocas","text":"Nome Trocas Classifica\u00e7\u00e3o Verbo Sin\u00f4nimos Com\u00e9rcio, Negocia\u00e7\u00f5es No\u00e7\u00e3o A\u00e7\u00e3o de trocar itens com NPCs ou outros jogadores no Minecraft. Impacto Possibilidade de adquirir itens raros ou valiosos. Estimula a intera\u00e7\u00e3o e coopera\u00e7\u00e3o entre jogadores."},{"location":"modelagem/lexico/#l21-exploracao","title":"L21 Explora\u00e7\u00e3o","text":"Nome Explora\u00e7\u00e3o Classifica\u00e7\u00e3o Verbo Sin\u00f4nimos Aventurar-se, Descobrir, explorar No\u00e7\u00e3o Ato de viajar pelo mundo do Minecraft para descobrir novos biomas, estruturas geradas e recursos. Impacto Incentiva a descoberta e a expans\u00e3o do conhecimento do mapa. Crucial para encontrar recursos e completar desafios."},{"location":"modelagem/lexico/#l22-cooperacao","title":"L22 Coopera\u00e7\u00e3o","text":"Nome Coopera\u00e7\u00e3o Classifica\u00e7\u00e3o Verbo Sin\u00f4nimos Colabora\u00e7\u00e3o, Trabalho em equipe No\u00e7\u00e3o A\u00e7\u00e3o de trabalhar junto com outros jogadores para alcan\u00e7ar objetivos comuns. Impacto Facilita grandes projetos de constru\u00e7\u00e3o e defesa. Promove o jogo em equipe e a constru\u00e7\u00e3o de comunidades."},{"location":"modelagem/lexico/#l23-chat","title":"L23 Chat","text":"Nome Chat Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Bate-papo, Conversa No\u00e7\u00e3o Ferramenta de comunica\u00e7\u00e3o dentro do jogo para os jogadores interagirem. Impacto Essencial para a coordena\u00e7\u00e3o e socializa\u00e7\u00e3o entre jogadores. Utilizado para trocar informa\u00e7\u00f5es e organizar eventos."},{"location":"modelagem/lexico/#l24-eventos","title":"L24 Eventos","text":"Nome Eventos Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos - No\u00e7\u00e3o Ocasi\u00f5es especiais organizadas dentro do jogo, tanto automaticamente quanto por jogadores. Impacto Proporcionam experi\u00eancias \u00fanicas e recompensas. Estimulam a participa\u00e7\u00e3o e intera\u00e7\u00e3o dos jogadores."},{"location":"modelagem/lexico/#l25-criar-mundo","title":"L25 Criar Mundo","text":"Nome Criar Mundo Classifica\u00e7\u00e3o Verbo Sin\u00f4nimos Gerar Mundo No\u00e7\u00e3o A\u00e7\u00e3o de iniciar um novo mundo no Minecraft, com configura\u00e7\u00f5es personaliz\u00e1veis. Impacto Permite personaliza\u00e7\u00e3o do ambiente de jogo. Define as condi\u00e7\u00f5es iniciais e o tipo de experi\u00eancia do jogador."},{"location":"modelagem/lexico/#l26-socializacao","title":"L26 Socializa\u00e7\u00e3o","text":"Nome Socializa\u00e7\u00e3o Classifica\u00e7\u00e3o Verbo Sin\u00f4nimos Intera\u00e7\u00e3o, Conviv\u00eancia No\u00e7\u00e3o Ato de interagir com outros jogadores dentro do jogo. Impacto Cria\u00e7\u00e3o de la\u00e7os e comunidades dentro do jogo. Enriquecimento da experi\u00eancia de jogo atrav\u00e9s da intera\u00e7\u00e3o social."},{"location":"modelagem/lexico/#l27-blaze-rods","title":"L27 Blaze Rods","text":"Nome Blaze Rods Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Bast\u00f5es de Blaze No\u00e7\u00e3o Itens dropados por Blazes no nether, usados para fabricar itens importantes como Po\u00e7\u00f5es. Impacto Essenciais para progress\u00e3o no jogo e cria\u00e7\u00e3o de po\u00e7\u00f5es. Incentivam a explora\u00e7\u00e3o e combate no nether."},{"location":"modelagem/lexico/#l28-netherite","title":"L28 Netherite","text":"Nome Netherite Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Netherita No\u00e7\u00e3o Recurso raro encontrado no nether, usado para melhorar equipamentos de diamante. Impacto Fornece as ferramentas e armaduras mais fortes do jogo. Motiva a explora\u00e7\u00e3o e minera\u00e7\u00e3o no nether."},{"location":"modelagem/lexico/#l29-blazes","title":"L29 Blazes","text":"Nome Blazes Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos - No\u00e7\u00e3o Hostis mobs encontrados no nether, conhecidos por seus ataques de fogo. Impacto Dropam Blaze Rods, essenciais para a cria\u00e7\u00e3o de po\u00e7\u00f5es e olhos do Ender. Representam um desafio significativo devido aos seus ataques de longo alcance e resist\u00eancia ao fogo."},{"location":"modelagem/lexico/#l30-drops","title":"L30 Drops","text":"Nome Drops Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Itens ca\u00eddos, Recompensas No\u00e7\u00e3o Itens que s\u00e3o deixados no ch\u00e3o quando mobs, blocos ou jogadores s\u00e3o destru\u00eddos. Impacto Fonte de recursos valiosos, como comida, ferramentas e ingredientes de po\u00e7\u00f5es. Incentivam o combate e a explora\u00e7\u00e3o, pois mobs e estruturas geradas diferentes t\u00eam drops variados e \u00fateis."},{"location":"modelagem/lexico/#l31-recursos","title":"L31 Recursos","text":"Nome Recursos Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Materiais, Insumos No\u00e7\u00e3o Itens coletados ou obtidos no jogo que s\u00e3o usados para crafting, constru\u00e7\u00e3o e outras atividades. Impacto Essenciais para a cria\u00e7\u00e3o de ferramentas, armas, armaduras e outros itens necess\u00e1rios para a sobreviv\u00eancia e progress\u00e3o no jogo. Diversos tipos de recursos incentivam a explora\u00e7\u00e3o e minera\u00e7\u00e3o em diferentes biomas e dimens\u00f5es."},{"location":"modelagem/lexico/#l32-itens","title":"L32 Itens","text":"Nome Itens Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Artigos, Objetos No\u00e7\u00e3o Elementos que podem ser coletados, usados, ou armazenados no jogo, e que influenciam a jogabilidade e o progresso do jogador. Impacto Essenciais para o avan\u00e7o do jogo e para a sobreviv\u00eancia do jogador. Incluem armas, ferramentas, recursos e outros itens que ajudam na explora\u00e7\u00e3o e constru\u00e7\u00e3o."},{"location":"modelagem/lexico/#l33-dimensao","title":"L33 Dimens\u00e3o","text":"Nome Dimens\u00e3o Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Mundo, Plano, Regi\u00e3o No\u00e7\u00e3o Espa\u00e7os distintos dentro do jogo, cada um com suas pr\u00f3prias caracter\u00edsticas, blocos e regras. Impacto Oferece diferentes experi\u00eancias e desafios ao jogador, com varia\u00e7\u00f5es em recursos e inimigos. Diversidade de gameplay e explora\u00e7\u00e3o."},{"location":"modelagem/lexico/#l34-estruturas","title":"L34 Estruturas","text":"Nome Estruturas Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Constru\u00e7\u00f5es, Edif\u00edcios, Cria\u00e7\u00f5es No\u00e7\u00e3o Forma\u00e7\u00f5es de blocos e elementos criados pelos jogadores dentro do jogo. Impacto Personaliza o ambiente do jogo e pode influenciar a jogabilidade, a est\u00e9tica e a intera\u00e7\u00e3o com outros jogadores."},{"location":"modelagem/lexico/#l35-ender-dragon","title":"L35 Ender Dragon","text":"Nome Ender Dragon Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Drag\u00e3o do Fim, Chefe do Fim No\u00e7\u00e3o \u00c9 um drag\u00e3o poderoso que os jogadores devem derrotar para completar uma das principais metas do jogo. Impacto Representa o desafio final do jogo. Sua derrota concede experi\u00eancia e acesso ao portal de sa\u00edda do Fim, al\u00e9m de desbloquear conquistas e recompensas."},{"location":"modelagem/lexico/#l36-ender-pearls","title":"L36 Ender Pearls","text":"Nome Ender Pearls Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos P\u00e9rolas do Ender No\u00e7\u00e3o Itens obtidos ao derrotar Endermen ou encontr\u00e1-los em ba\u00fas no Fim. Impacto Permitem ao jogador teletransportar-se para um local pr\u00f3ximo ao lan\u00e7ar a p\u00e9rola."},{"location":"modelagem/lexico/#l37-elytra","title":"L37 Elytra","text":"Nome Elytra Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Asas, Equipamento de Voo No\u00e7\u00e3o Equipamento que permite ao jogador planar e voar no jogo. Impacto Expande as possibilidades de explora\u00e7\u00e3o e mobilidade."},{"location":"modelagem/lexico/#l38-enderman","title":"L38 Enderman","text":"Nome Enderman Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Enderman, Ser do Fim No\u00e7\u00e3o Criatura que pode ser encontrada tanto no Overworld quanto no Fim. Caracteriza-se por sua habilidade de teletransporte. Impacto Oferece desafios ao jogador com suas habilidades de teletransporte e ataque. Fonte de Ender Pearls, que s\u00e3o \u00fateis para diversos itens e recursos no jogo."},{"location":"modelagem/lexico/#l39-hotbar","title":"L39 Hotbar","text":"Nome Hotbar Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Barra de atalhos No\u00e7\u00e3o Uma parte do invent\u00e1rio que voc\u00ea pode acessar os itens sem precisar abrir o invent\u00e1rio Impacto Permite que o usu\u00e1rio acesse os itens de maneira r\u00e1pida e pr\u00e1tica"},{"location":"modelagem/lexico/#l40-conquistas","title":"L40 Conquistas","text":"Nome Conquistas Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Achievements No\u00e7\u00e3o Maneira de orientar gradualmente novos jogadores no Minecraft e dar-lhes desafios para completar Impacto Incentiva o jogador a explorar todas as possibilidades do jogo"},{"location":"modelagem/lexico/#l41-multiplayer","title":"L41 Multiplayer","text":"Nome Multiplayer Classifica\u00e7\u00e3o Estado Sin\u00f4nimos Modo Multijogador, MP No\u00e7\u00e3o Modo de jogo onde m\u00faltiplos jogadores podem interagir, socializar e competir em um mesmo mundo por meio de servidores. Impacto Promove a cooperacao e o trabalho em equipe para construir estruturas e completar objetivos. Permite competi\u00e7\u00f5es e minijogos entre jogadores."},{"location":"modelagem/lexico/#l42-usuario","title":"L42 Usu\u00e1rio","text":"Nome Usu\u00e1rio Classifica\u00e7\u00e3o Sujeito Sin\u00f4nimos Jogador(es) No\u00e7\u00e3o A pessoa que interage com o sistema, tomando decis\u00f5es e controlando o personagem. Impacto Centrais para o funcionamento do jogo. Criam estruturas, moldam o ambiente e interagem com outros jogadores."},{"location":"modelagem/lexico/#l43-inventario","title":"L43 Invent\u00e1rio","text":"Nome Invent\u00e1rio Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos - No\u00e7\u00e3o Sistema que armazena todos os itens e blocos que o usu\u00e1rio coleta ou cria durante o jogo. Permite ao jogador organizar e utilizar seus recursos. Impacto O gerenciamento eficaz do invent\u00e1rio \u00e9 essencial para a sobreviv\u00eancia, constru\u00e7\u00e3o e progresso no jogo, influenciando diretamente as estrat\u00e9gias do jogador."},{"location":"modelagem/lexico/#l44-blocos","title":"L44 Blocos","text":"Nome Blocos Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Cubos, Elementos de Constru\u00e7\u00e3o No\u00e7\u00e3o Unidades b\u00e1sicas de constru\u00e7\u00e3o no usados para criar estruturas, itens e ferramentas. Impacto Fundamentais para o jogo, permitindo ao jogador construir e modificar o ambiente."},{"location":"modelagem/lexico/#l45-realms","title":"L45 Realms","text":"Nome Realms Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Servidor Realms, Mundo Realms No\u00e7\u00e3o Servi\u00e7o de hospedagem de servidores online oferecido pela Mojang, que permite aos jogadores criar e gerenciar mundos privados onde at\u00e9 10 jogadores podem jogar simultaneamente. Impacto Facilita a cria\u00e7\u00e3o e administra\u00e7\u00e3o de mundos multiplayer de forma segura e controlada. Oferece uma experi\u00eancia de jogo privada para amigos e convidados."},{"location":"modelagem/lexico/#l46-biomas","title":"L46 Biomas","text":"Nome Biomas Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Ambientes naturais No\u00e7\u00e3o Regi\u00f5es distintas no mundo do Minecraft que apresentam diferentes tipos de terrenos, climas, vegeta\u00e7\u00f5es, e vida selvagem. Impacto Diversifica\u00e7\u00e3o do ambiente de jogo, proporcionando varia\u00e7\u00e3o na jogabilidade e explora\u00e7\u00e3o. Influ\u00eancia no tipo de recursos dispon\u00edveis, como madeira e plantas."},{"location":"modelagem/lexico/#l47-villager","title":"L47 Villager","text":"Nome Villager Classifica\u00e7\u00e3o Entidade Sin\u00f4nimos Alde\u00e3o No\u00e7\u00e3o Mob que habita as vilas e interage com o jogador atrav\u00e9s do com\u00e9rcio de itens e profiss\u00f5es, onde suas variam de acordo com biomas e suas profiss\u00f5es Impacto Importante para o com\u00e9rcio de recursos e desenvolvimento das vilas. Essencial para a obten\u00e7\u00e3o de itens raros e especializados por meio de trocas. Pode ser usado para fazer farms"},{"location":"modelagem/lexico/#l48-pillager","title":"L48 Pillager","text":"Nome Pillager Classifica\u00e7\u00e3o Entidade Sin\u00f4nimos Saqueador No\u00e7\u00e3o Mob inimigo hostil que ataca vilas e jogadores, associado \u00e0s invas\u00f5es de vilas. Impacto Amea\u00e7a constante para vilas e jogadores, criando desafios de defesa. Cria situa\u00e7\u00f5es de conflito que podem levar a batalhas e recompensas valiosas."},{"location":"modelagem/lexico/#l49-spawners","title":"L49 Spawners","text":"Nome Spawners Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Geradores de Monstros No\u00e7\u00e3o Blocos que geram constantemente mobs em determinadas \u00e1reas, encontrados principalmente em masmorras e fortalezas. Impacto Fonte cont\u00ednua de mobs para combate. Pode ser usado para o farms de recursos espec\u00edficos. Facilita a cria\u00e7\u00e3o de armadilhas e fazendas automatizadas de mobs para obten\u00e7\u00e3o de itens. Pode aumentar a dificuldade de explora\u00e7\u00e3o."},{"location":"modelagem/lexico/#l50-vila","title":"L50 Vila","text":"Nome Vila Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Aldeia, Povoado No\u00e7\u00e3o Conjunto de estruturas geradas e entidades que formam uma comunidade autossustent\u00e1vel no Minecraft. As vilas geralmente incluem casas, planta\u00e7\u00f5es, e outras estruturas, sendo habitadas principalmente por villagers. Impacto Centro de com\u00e9rcio, onde jogadores podem interagir com villagers para trocar itens e obter recursos valiosos. Fonte de recursos sustent\u00e1veis, como alimentos e materiais, atrav\u00e9s das planta\u00e7\u00f5es e cria\u00e7\u00f5es dentro da vila. Ponto estrat\u00e9gico para defesa contra ataques de pillagers, incentivando a constru\u00e7\u00e3o de muralhas e outros sistemas de prote\u00e7\u00e3o."},{"location":"modelagem/lexico/#l51-texturas","title":"L51 Texturas","text":"Nome Texturas Classifica\u00e7\u00e3o Objeto Sin\u00f4nimos Aldeia, Povoado No\u00e7\u00e3o Elementos visuais que revestem blocos, itens, criaturas, e outros componentes do jogo, definindo a apar\u00eancia desses objetos. Recursos visuais aplicados a objetos e superf\u00edcies, sendo manipuladas e usadas como parte do design gr\u00e1fico. Impacto D\u00e3o um visual \u00fanico ao Minecraft, trazendo uma nova experi\u00eancia de imers\u00e3o ao jogo. Podem facilitar a identifica\u00e7\u00e3o de alguns blocos ou itens. Exigem um maior-desempenho da m\u00e1quina, tornando o jogo mais lento em alguns computadores"},{"location":"modelagem/lexico/#referencias","title":"Refer\u00eancias:","text":"

Minecraft Wiki. Dispon\u00edvel em: https://minecraft.fandom.com/pt/wiki/Minecraft_Wiki

"},{"location":"modelagem/personas/","title":"Personas","text":""},{"location":"modelagem/personas/#historico-de-versoes","title":"Hist\u00f3rico de Vers\u00f5es","text":"Data Vers\u00e3o Descri\u00e7\u00e3o Autor 30/07/2024 0.1 Cria\u00e7\u00e3o das Personas Samara Let\u00edcia 06/09/2024 0.2 Atualiza\u00e7\u00e3o Samara Let\u00edcia"},{"location":"modelagem/personas/#introducao","title":"Introdu\u00e7\u00e3o","text":"

Personas s\u00e3o perfis fict\u00edcios que representam os usu\u00e1rios de um projeto. Elas incorporam hist\u00f3rias pessoais, motiva\u00e7\u00f5es, objetivos, desafios e preocupa\u00e7\u00f5es, ajudando a desenvolver estrat\u00e9gias para entender melhor o p\u00fablico-alvo.

"},{"location":"modelagem/personas/#metodologia","title":"Metodologia","text":"

Para essa documenta\u00e7\u00e3o, al\u00e9m de discutirmos sobre as nossas pr\u00f3prias experi\u00eancias com o jogo, entrevistamos diferentes jogadores de minecraft para saber sobre suas principais atividades, gameplay e o modo como o utilizavam. A partir disso, criamos as seguintes personas: Sarah, Arthur e Victor.

"},{"location":"modelagem/personas/#personas_1","title":"Personas","text":"

Personas - Vers\u00e3o 0.1 - Vis\u00e3o Geral

"},{"location":"modelagem/personas/#sarah","title":"Sarah","text":"

Persona Sarah by Freepik

Perfil de Sarah

  • Idade: 19 anos.
  • Profiss\u00e3o: Designer.

Introdu\u00e7\u00e3o

Sarah, uma jovem de 19 anos, \u00e9 apaixonada por criar constru\u00e7\u00f5es inovadoras que encantam seus seguidores no YouTube. Utilizando o modo criativo do Minecraft, ela transforma sua imagina\u00e7\u00e3o em realidade, projetando e edificando estruturas \u00fanicas e impressionantes. Seu canal \u00e9 um espa\u00e7o onde ela compartilha suas cria\u00e7\u00f5es detalhadas e oferece dicas sobre como construir no jogo, atraindo uma audi\u00eancia dedicada que aprecia sua habilidade em transformar blocos digitais em obras de arte arquitet\u00f4nicas.

Frustra\u00e7\u00f5es

  1. Ela enfrenta desafios devido \u00e0s limita\u00e7\u00f5es do jogo, e a necessidade de adaptar suas ideias dentro das condi\u00e7\u00f5es impostas pelo jogo.
"},{"location":"modelagem/personas/#arthur","title":"Arthur","text":"

Persona Arthur by Freepik

Perfil de Artur

  • Idade: 11 anos.
  • Profiss\u00e3o: Estudante.

Introdu\u00e7\u00e3o

Artur, um garoto de 11 anos, \u00e9 um grande f\u00e3 do Minecraft e adora jogar com seus amigos. Ele se diverte no modo sobreviv\u00eancia, explorando diferentes biomas e mapas enquanto enfrenta desafios e descobre novos locais. Al\u00e9m disso, Artur gosta de visitar as constru\u00e7\u00f5es criativas de outros jogadores, buscando inspira\u00e7\u00e3o e aprimorando suas pr\u00f3prias habilidades. Para ele, o Minecraft \u00e9 uma maneira emocionante de se conectar com amigos e mergulhar em um mundo virtual cheio de aventuras.

Frustra\u00e7\u00f5es

  1. O minecraft n\u00e3o possui comando por voz, o que significa que ele precisa digitar pelo chat para se comunicar com seus amigos, tarefa dif\u00edcil em determinadas situa\u00e7\u00f5es.
  2. N\u00e3o \u00e9 poss\u00edvel mandar uma mensagem para um amigo se ele estiver offline.
  3. N\u00e3o \u00e9 poss\u00edvel entrar em um mundo que voc\u00ea \u00e9 co-criador com seu amigo se ele estiver offline.
"},{"location":"modelagem/personas/#victor","title":"Victor","text":"

Persona Arthur by Freepik

Perfil de Victor

  • Idade: 22 anos.
  • Profiss\u00e3o: Estudante Universit\u00e1rio.

Introdu\u00e7\u00e3o

Victor \u00e9 um jogador dedicado do Minecraft que se destaca no modo Hardcore. Seu principal objetivo \u00e9 derrotar o Ender Dragon e conquistar todas as conquistas dispon\u00edveis no jogo. Para intensificar sua experi\u00eancia e aprimorar a din\u00e2mica do jogo, Victor investe em Minecoins, que usa para adquirir mods e texturas que transformam o ambiente e adicionam novos desafios e elementos ao jogo. Com uma abordagem focada e estrat\u00e9gica, ele busca maximizar sua experi\u00eancia no Minecraft, explorando todos os recursos que o jogo tem a oferecer.

Frustra\u00e7\u00f5es

  1. \u00c0s vezes, mods e texturas adquiridos com Minecoins podem causar bugs ou incompatibilidades que afetam o desempenho do jogo ou a experi\u00eancia geral.
  2. A busca por conquistas e o avan\u00e7o em um modo t\u00e3o desafiador podem ser demorados, o que pode levar a uma sensa\u00e7\u00e3o de progresso lento e frustra\u00e7\u00e3o.
"},{"location":"modelagem/personas/#conclusao","title":"Conclus\u00e3o","text":"

Essas personas representam diferentes tipos de jogadores de Minecraft que podem se beneficiar de recursos personalizados no jogo. Cada uma delas tem necessidades e desafios espec\u00edficos que devem ser atendidos para tornar a experi\u00eancia de jogo mais eficaz e divertida.

"},{"location":"pos-rastreabilidade/forward-from/","title":"Forward-From","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 07/09/2024 0.1 Cria\u00e7\u00e3o do documento e adi\u00e7\u00e3o das telas RF1 a RF4, RF6 a RF8, RF14, RF16 a RF18 Carlos Eduardo Rodrigues 08/09/2024 0.2 Adi\u00e7\u00e3o das telas RF15, RF19, RF20, RF24, RF26 a RF28, RF30, RF31, RF34 a RF36 Carlos Eduardo Rodrigues 08/09/2024 0.3 Linkagem das demais telas dos requisitos funcionais Carlos Eduardo Rodrigues C\u00f3digo Requisito Tela Artefato(s) RF1 O usu\u00e1rio deve ser capaz de criar, entrar e gerenciar uma conta no Minecraft. Veja aqui RF2 O usu\u00e1rio deve ser capaz de se locomover utilizando o teclado. Veja aqui RF3 O usu\u00e1rio deve ser capaz de interagir com o mundo utilizando o mouse. Veja aqui RF4 Os recursos devem ser armazenados no invent\u00e1rio do usu\u00e1rio. Veja aqui RF5 O jogo deve possuir um dicion\u00e1rio com a explica\u00e7\u00e3o de todos os itens descobertos pelo usu\u00e1rio. Veja aqui RF6 O usu\u00e1rio deve precisar de uma mesa de trabalho para fabricar ferramentas eficientes. Veja aqui RF7 O jogo deve permitir que, atrav\u00e9s de min\u00e9rios, o usu\u00e1rio crie novas ferramentas. Veja aqui RF8 O jogo deve oferecer diferentes tipos de alimentos para evitar que o personagem do usu\u00e1rio morra de fome. Veja aqui RF9 No modo hardcore, o usu\u00e1rio deve ter apenas uma vida, tornando o jogo mais desafiador e definitivo. Veja aqui RF10 No modo hardcore, ap\u00f3s a morte, o usu\u00e1rio deve ser capaz de entrar apenas no modo espectador, sem interagir com o mundo. Veja aqui RF11 No modo hardcore, o jogo deve ser definido automaticamente na dificuldade mais alta e n\u00e3o pode ser alterado. Veja aqui RF12 No modo hardcore, os comandos de cheats devem estar desabilitados para garantir a integridade do desafio. Veja aqui RF13 Deve existir um modo de jogo onde o jogador pode exercitar a sua criatividade Veja aqui RF14 No modo criativo, o usu\u00e1rio deve ser capaz de sobrevoar rapidamente pelo mapa para facilitar as cria\u00e7\u00f5es. Veja aqui RF15 O usu\u00e1rio deve ser capaz de colocar e quebrar blocos com apenas um comando no modo criativo. Veja aqui RF16 O usu\u00e1rio deve ter acesso a todos os itens do jogo no modo criativo. Veja aqui RF17 O usu\u00e1rio n\u00e3o deve precisar se preocupar com vida ou barra de fome no modo criativo, focando apenas em criar. Veja aqui RF18 Mobs hostis devem ignorar a presen\u00e7a do usu\u00e1rio no modo criativo. Veja aqui RF19 No modo criativo, usu\u00e1rio deve ser capaz de alterar o clima e a hora do dia conforme necess\u00e1rio para suas cria\u00e7\u00f5es. Veja aqui RF20 Deve haver um sistema de chat para comunica\u00e7\u00e3o entre os jogadores, com suporte a comandos especiais. Veja aqui RF21 Jogos multiplayer devem permitir a cria\u00e7\u00e3o e personaliza\u00e7\u00e3o de diversos modos de jogo, como constru\u00e7\u00e3o, sobreviv\u00eancia e PvP. Veja aqui RF22 Jogos multiplayer devem fornecer um sistema de vota\u00e7\u00e3o justo e intuitivo durante competi\u00e7\u00f5es para escolher as melhores constru\u00e7\u00f5es ou desempenhos. Veja aqui RF23 Em Jogos multiplayer deve ser poss\u00edvel a cria\u00e7\u00e3o e agendamento de eventos e competi\u00e7\u00f5es especiais para os jogadores. Veja aqui RF24 O jogador dever ser capaz de colocar alguns blocos na hotbar. Veja aqui RF25 O jogador deve ser capaz de compartilhar o seu mapa com outro jogador. Veja aqui RF26 Deve existir um modo de jogo onde o jogador pode morrer (sobreviv\u00eancia) Veja aqui RF27 Com exce\u00e7\u00e3o dos modos Criativo e Espectador, o jogador deve ter uma quantidade limitada de vida Veja aqui RF28 O jogador deve ser capaz de criar ferramentas Veja aqui RF29 O jogador deve ser capaz de atacar os inimigos Veja aqui RF30 Com exce\u00e7\u00e3o do modo hardcore, o jogador deve ser capaz de escolher a dificuldade do jogo Veja aqui RF31 O mundo deve ser gerado com diversos biomas Veja aqui RF32 O jogador deve ser capaz de melhorar o material dos seus itens Veja aqui RF33 O jogador deve ser capaz de encantar os seus itens Veja aqui RF34 Quando um inimigo morrer ele deve deixar um drop Veja aqui RF35 O jogador deve ter uma barra de fome Veja aqui RF36 Cada dimens\u00e3o deve ter diferentes inimigos Veja aqui RF37 Devem existir inimigos de diferentes dificuldades Veja aqui RF38 O jogo deve apresentar um sistema de conquistas Veja aqui RF39 O jogador deve poder acessar o sistema de conquistas a qualquer momento Veja aqui RF40 O jogador deve ser capaz de compartilhar suas conquistas com outros jogadores Veja aqui RF41 O jogo deve possuir chefes Veja aqui RF42 Deve haver blocos decorativos para expandir as op\u00e7\u00f5es de constru\u00e7\u00e3o e paisagismo. Veja aqui RF43 Deve haver ru\u00ednas, cavernas, montanhas e masmorras subterr\u00e2neas, com desafios e recompensas para que os jogadores realizem explora\u00e7\u00f5es. Veja aqui RF44 Deve haver armaduras para os jogadores e seus animais de combate. Veja aqui RF45 Deve haver armas de dano em \u00e1rea para facilitar combates enfrentando m\u00faltiplos inimigos de uma s\u00f3 vez Veja aqui RF46 Os biomas do Nether, devem possuir desafios e recompensas \u00fanicas para incentivar a explora\u00e7\u00e3o do submundo. Veja aqui RF47 Deve haver mobs pac\u00edficos com profiss\u00f5es Veja aqui RF48 Os jogadores devem ser capazes de personalizar os seus mobs de estima\u00e7\u00e3o. Veja aqui RF49 Deve haver um sistema de crafting autom\u00e1tico, que permita aos jogadores automatizar processos. Veja aqui RF50 Deve haver diferentes tipos de min\u00e9rios e recursos Veja aqui RF51 Deve haver diferentes tipos de mobs de animais. Veja aqui RF52 Deve haver eventos e desafios tempor\u00e1rios com recompensas exclusivas Veja aqui RF53 O jogador deve ser capaz de criar novos mundos no minecraft Veja aqui"},{"location":"pre-rastreabilidade/Rich%20Picture/","title":"Rich Picture","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor(es) 26/07/2024 0.1 Cria\u00e7\u00e3o do documento e adi\u00e7\u00e3o da vis\u00e3o geral, explora\u00e7\u00e3o, personagem e cria\u00e7\u00e3o de mundos. Danilo Melo 08/09/2024 0.2 Adi\u00e7\u00e3o da descri\u00e7\u00e3o das imagens Danilo Melo"},{"location":"pre-rastreabilidade/Rich%20Picture/#introducao","title":"Introdu\u00e7\u00e3o","text":"

A t\u00e9cnica Rich Picture \u00e9 uma ferramenta visual usada para compreender e comunicar sistemas complexos e suas intera\u00e7\u00f5es de maneira intuitiva e acess\u00edvel. Originada na Soft Systems Methodology - SSM, desenvolvida por Peter Checkland, essa t\u00e9cnica permite que indiv\u00edduos e equipes ilustrem problemas, contextos e relacionamentos de forma gr\u00e1fica, utilizando desenhos, \u00edcones, s\u00edmbolos e texto. O objetivo principal \u00e9 proporcionar uma vis\u00e3o hol\u00edstica do sistema, capturando tanto os aspectos t\u00e9cnicos quanto os sociais e culturais envolvidos, facilitando a compreens\u00e3o m\u00fatua e o di\u00e1logo entre stakeholders com diferentes perspectivas.

"},{"location":"pre-rastreabilidade/Rich%20Picture/#objetivos","title":"Objetivos","text":"
  • Compreens\u00e3o Hol\u00edstica: Proporcionar uma vis\u00e3o completa e integrada do sistema, incluindo aspectos t\u00e9cnicos, sociais e culturais.
  • Identifica\u00e7\u00e3o de Problemas e Oportunidades: Ajudar na identifica\u00e7\u00e3o de problemas, conflitos, oportunidades e pontos de melhoria dentro do sistema.
  • Intera\u00e7\u00f5es e Relacionamentos: Linhas, setas e s\u00edmbolos que ilustram as intera\u00e7\u00f5es, fluxos de comunica\u00e7\u00e3o e relacionamentos entre os diferentes elementos do sistema.
"},{"location":"pre-rastreabilidade/Rich%20Picture/#metodologia","title":"Metodologia","text":"

Para o desenvolvimento do Rich Picture neste projeto, utilizou-se a ferramenta Miro, devido \u00e0 sua capacidade de proporcionar um ambiente de trabalho livre e flex\u00edvel. Al\u00e9m disso, o Miro facilita a colabora\u00e7\u00e3o em tempo real, permitindo que equipes trabalhem juntas de maneira eficiente e integrada.

"},{"location":"pre-rastreabilidade/Rich%20Picture/#visao-geral","title":"Vis\u00e3o Geral","text":"

Vers\u00e3o 1 - Autor: Danilo Melo

"},{"location":"pre-rastreabilidade/Rich%20Picture/#exploracao","title":"Explora\u00e7\u00e3o","text":"

Vers\u00e3o 1 - Autor: Danilo Melo

"},{"location":"pre-rastreabilidade/Rich%20Picture/#personagem","title":"Personagem","text":"

Vers\u00e3o 1 - Autor: Danilo Melo

"},{"location":"pre-rastreabilidade/Rich%20Picture/#criacao-de-mundos","title":"Cria\u00e7\u00e3o de Mundos","text":"

Vers\u00e3o 1 - Autor: Danilo Melo

"},{"location":"pre-rastreabilidade/argumentacao/","title":"Argumenta\u00e7\u00e3o","text":"

Hist\u00f3rico de Revis\u00e3o

Data Vers\u00e3o Descri\u00e7\u00e3o Autor 20/08/2024 0.1 Cria\u00e7\u00e3o dos Argumentos Samara Let\u00edcia

A argumenta\u00e7\u00e3o em requisitos de software \u00e9 o processo de justificar e validar as necessidades de um sistema, construindo uma base l\u00f3gica e convincente para cada requisito. Ela visa garantir que os requisitos sejam claros, completos e alinhados com os objetivos do projeto, evitando mal-entendidos e facilitando a tomada de decis\u00f5es durante o desenvolvimento.

Vers\u00e3o 1 - Diagrama de Argumenta\u00e7\u00e3o 1

"},{"location":"pre-rastreabilidade/argumentacao/#questao-fazer-apenas-dois-casos-de-uso-sera-o-suficiente-para-o-nosso-projeto","title":"Quest\u00e3o: Fazer apenas dois casos de uso ser\u00e1 o suficiente para o nosso projeto?","text":"

P1 - Sim, pois eles cobrem os principais fluxos do sistema, garantindo que as funcionalidades essenciais estejam completamente descritas e validadas.

P2 - Sim, pois n\u00e3o seria poss\u00edvel capturar todos os cen\u00e1rios poss\u00edveis uma vez que \u00e9 um jogo de explora\u00e7\u00e3o livre.

P3 - N\u00e3o, pois dois casos de uso podem n\u00e3o capturar todas as vari\u00e1veis e cen\u00e1rios poss\u00edveis, o que pode resultar em lacunas na cobertura de requisitos e funcionalidades importantes do sistema.

"},{"location":"pre-rastreabilidade/argumentacao/#conclusao","title":"Conclus\u00e3o","text":"

Ter\u00e3o apenas dois casos de uso, e se necess\u00e1rio, faremos mais.

Vers\u00e3o 1 - Diagrama de Argumenta\u00e7\u00e3o 2

"},{"location":"pre-rastreabilidade/argumentacao/#questao-e-necessario-fazer-uma-pesquisa-de-interesses-com-jogadores-de-minecraft-para-cobrir-bem-os-requisitos","title":"Quest\u00e3o: \u00c9 necess\u00e1rio fazer uma pesquisa de interesses com jogadores de minecraft para cobrir bem os requisitos?","text":"

P1 - Sim. A pesquisa de interesses reduz o risco de falhas ao detalhar os recursos ou projetos relacionados a Minecraft.

P2 - Sim, com uma pesquisa bem conduzida, \u00e9 poss\u00edvel identificar as funcionalidades ou elementos do projeto que t\u00eam maior impacto.

P3 - N\u00e3o acho que seja necess\u00e1rio porque sozinhos j\u00e1 conseguir\u00edamos identificar os pontos principais do jogo.

"},{"location":"pre-rastreabilidade/argumentacao/#conclusao_1","title":"Conclus\u00e3o","text":"

Fizemos um question\u00e1rio para jogadores de minecraft a respeito do jogo.

"},{"location":"reunioes/ata-14-08-24/","title":"Ata do dia 14/08/2024","text":"

Hist\u00f3rico de Revis\u00e3o

Data Descri\u00e7\u00e3o Autor(es) 17/08/2024 Cria\u00e7\u00e3o do documento Carlos Eduardo 18/08/2024 Pequena corre\u00e7\u00e3o Carlos Eduardo"},{"location":"reunioes/ata-14-08-24/#data-horario-duracao-e-local","title":"Data, hor\u00e1rio, dura\u00e7\u00e3o e local","text":"Data da reuni\u00e3o Hor\u00e1rio de in\u00edcio Dura\u00e7\u00e3o Local 14/08/2024 20:00 50m Microsoft Teams"},{"location":"reunioes/ata-14-08-24/#participantes","title":"Participantes","text":"

Participaram da reuni\u00e3o:

  • Carlos Eduardo
  • Danilo C\u00e9sar
  • Patr\u00edcia Helena
  • Samara Let\u00edcia
"},{"location":"reunioes/ata-14-08-24/#objetivos-e-pontos-discutidos","title":"Objetivos e pontos discutidos","text":"

A segunda reuni\u00e3o do grupo teve como objetivo definir as duplas e as tarefas que cada uma delas seria respons\u00e1vel para a segunda entrega do trabalho. Cada dupla ser\u00e1 respons\u00e1vel tamb\u00e9m por revisar o trabalho feito pela outra dupla.

Como ficou a divis\u00e3o:

Carlos e Samara:

  • Caso de uso
  • Argumenta\u00e7\u00e3o
  • Especifica\u00e7\u00e3o suplementar
  • Requisitos n\u00e3o funcionais

Danilo e Patr\u00edcia:

  • Backlog
  • Gore NFR
  • User stories
  • Gore i*
"},{"location":"reunioes/ata-24-07-24/","title":"Ata do dia 27/07/2024","text":"

Hist\u00f3rico de Revis\u00e3o

Data Descri\u00e7\u00e3o Autor(es) 01/08/2024 Cria\u00e7\u00e3o do documento Carlos Eduardo"},{"location":"reunioes/ata-24-07-24/#data-horario-duracao-e-local","title":"Data, hor\u00e1rio, dura\u00e7\u00e3o e local","text":"Data da reuni\u00e3o Hor\u00e1rio de in\u00edcio Dura\u00e7\u00e3o Local 24/07/2024 10:00 1h e 50m. Google Meet"},{"location":"reunioes/ata-24-07-24/#participantes","title":"Participantes","text":"

Participaram da reuni\u00e3o:

  • Carlos Eduardo Rodrigues
  • Danilo C\u00e9sar
  • Patr\u00edcia Helena
"},{"location":"reunioes/ata-24-07-24/#objetivos-e-pontos-discutidos","title":"Objetivos e pontos discutidos","text":"

Nesta primeira reuni\u00e3o, os integrantes presentes trabalharam em conjunto para a realiza\u00e7\u00e3o da primeira vers\u00e3o dos artefatos: brainstorming e moscow.

"}]} \ No newline at end of file diff --git a/sitemap.xml b/sitemap.xml new file mode 100644 index 0000000..0f8724e --- /dev/null +++ b/sitemap.xml @@ -0,0 +1,3 @@ + + + \ No newline at end of file diff --git a/sitemap.xml.gz b/sitemap.xml.gz new file mode 100644 index 0000000..2f826fd Binary files /dev/null and b/sitemap.xml.gz differ diff --git a/visao-geral/index.html b/visao-geral/index.html new file mode 100644 index 0000000..80e5b58 --- /dev/null +++ b/visao-geral/index.html @@ -0,0 +1,1723 @@ + + + + + + + + + + + + + + + + + + + + + + + Visão Geral - Requisitos Minecraft + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + +
+ +
+ + + + + + +
+ + +
+ +
+ + + + + + +
+
+ + + +
+
+
+ + + + + +
+
+
+ + + +
+ +
+ + + +
+
+ + + + + + + +

Visão Geral

+

Histórico de Revisão

+ + + + + + + + + + + + + + + + + + + + + + + +
DataVersãoDescriçãoAutor(es)
28/07/20240.1Criação da versão inicial do documentoCarlos Eduardo Rodrigues
06/09/20240.2Foram adicionados os tópicos de Oportunidades, Riscos e ConcorrentesCarlos Eduardo Rodrigues
+
+

Logo do minecraft

+

Introdução

+
+
+
+

+ Minecraft é um jogo eletrônico criado por Markus Persson que foi lançado oficialmente em novembro de 2011 pela Mojang Studios. Antes disso, em 2009, Persson desenvolveu a primeira versão do jogo, também conhecida como Minecraft "Classic". Em 2014 a Mojang Studios foi adquirida pela Microsoft por US$ 2,5 bilhões. +

+

+ O jogo permite aos jogadores explorar um mundo tridimensional, coletar recursos, construir estruturas e combater inimigos. +

+
+
+ +

Markus Persson criador do Minecraft.

+
+
+
+ +

Objetivo

+

Este documento tem como objetivo fornecer uma visão geral do Minecraft na etapa de pré-rastreabilidade.

+

Descrição Geral

+

A jornada típica no Minecraft começa com a coleta de madeira ao derrubar uma árvore. A partir daí, o jogador deve criar ferramentas, minerar recursos e construir um abrigo para sobreviver em segurança. Porém o Minecraft possui diversos modos de jogo, incluindo:

+
    +
  • Sobrevivência: Os jogadores devem coletar recursos para a sua sobrevivência e também lutar contra criaturas perigosas.
  • +
  • Criativo: Os jogadores têm acesso ilimitado a recursos, imunidade a danos e capacidade de voar, permitindo a construção livre. Aqui nada impede que o jogador liberte a sua imaginação.
  • +
  • Aventura: É semelhante ao modo Sobrevivência, mas possui alguas restrições para tornar o jogo mais desafiador.
  • +
  • Espectador: Os jogadores podem voar e atravessar blocos, mas não podem interagir com o ambiente.
  • +
  • Hardcore: Uma variante do modo Sobrevivência, mas com o maior nível de difículdade e morte permanente. Quando o jogador morre, ele não pode renascer e o mundo é excluído.
  • +
+

Pontos Fortes

+
    +
  • Liberdade criativa: Permite que os jogadores construam praticamente qualquer coisa que possam imaginar.
  • +
  • Comunidade e mods: O Minecraft possui uma grande comunidade de jogadores e desenvolvedores de mods, que ajudam na expansão do jogo com novas mecânicas, texturas e funcionalidades.
  • +
  • Multiplataforma: Está disponível em diversos dispositivos, como PC, consoles, e smartphones.
  • +
  • Atualizações regulares: Atualizações são lançadas frequentemente, adicionando novos conteúdos e corrigindo problemas.
  • +
+

Pontos Fracos

+
    +
  • Gráficos pixelados: O estilo pode não atrair jogadores que prefiram visuais mais realistas.
  • +
  • Curva de Aprendizado: O jogo pode ser confuso para novos jogadores.
  • +
  • Monotonia: Alguns jogadores podem achar a jogabilidade repetitiva. A mineração e coleta de recursos, pode se tornar monótona.
  • +
  • Performance: Em dispositivos menos potentes, o jogo pode ter problemas de desempenho, principalmente ao usar mods ou recursos gráficos avançados.
  • +
  • História não linear: O Minecraft não possui uma história, o que pode não agradar todos os jogadores.
  • +
+

Oportunidades

+
    +
  • Realidade Virtual e Aumentada: A integração entre o Minecraft com VR e AR pode proporcionar uma nova experiência imersiva e atrair novos jogadores.
  • +
  • Integração com Streaming e Plataformas de Vídeo: Facilitar a criação de conteúdo por meio de integrações entre plataformas como Twitch e YouTube pode atrair mais jogadores e streamers.
  • +
  • Mais Conteúdos Personalizados: Proporcionar mais oportunidades para criadores de conteúdo como mods e skins, pode aumentar o engajamento da comunidade.
  • +
+

Riscos

+
    +
  • Concorrência de novos jogos sandbox e survival
  • +
  • Dependência de Modders e da Comunidade: A comunidade de mods é uma grande força para o jogo, mas depender muito dela não é uma boa escolha, especialmente se não houver incentivos para os criadores.
  • +
  • Nível de Interesse dos Jogadores: Se não houver atualizações frequentes ou novas funcionalidades significativas, o interesse dos jogadores pode começar a diminuir.
  • +
  • Monetização Excessiva.
  • +
  • Atualizações com Mudanças Negativas: As mudanças negativas no jogo podem gerar insatisfação e consequentemente a diminuição no número de jogadores.
  • +
+

Concorrentes

+
    +
  • Roblox: Outro jogo sandbox focado na criação de mundos personalizados pelos usuários e que possui uma base de jogadores jovem muito engajada.
  • +
  • Terraria: Um jogo sandbox 2D com foco na exploração e construção, com uma jogabilidade que compartilha algumas semelhanças com Minecraft.
  • +
  • ARK: Survival Evolved: Jogo de sobrevivência com elementos sandbox, focado em um ambiente mais realista com dinossauros, onde os jogadores constroem, caçam e sobrevivem.
  • +
  • Stardew Valley: Jogo de simulação de fazenda que combina elementos de sandbox, sobrevivência e RPG.
  • +
+

Conclusão

+

O Minecraft é um jogo versátil e popular. Seus pontos fortes como a liberdade criativa e a grande comunidade, garantiram que o jogo alcançasse em 2021, 238 milhões de cópias vendidas, além de 140 milhões de usuários mensais.

+
+

Referências:

+

Minecraft. O que é o Minecraft? Construa, descubra realms e muito mais. Acesso em: jul de 2024. Disponível em: https://www.minecraft.net/pt-br/about-minecraft +

+

Minecraft Wiki. Hardcore. Acesso em: jul de 2024. Disponível em: https://minecraft.fandom.com/pt/wiki/Hardcore

+

Redação Impacta. Conheça a Inspiradora História do Desenvolvedor do Minecraft. Acesso em: jul de 2024. Disponível em: https://www.impacta.com.br/blog/conheca-historia-desenvolvedor-minecraft/.

+ + + + + + + + + + + + + +
+
+ + + + + +
+ + + +
+ + + +
+
+
+
+ + + + + + + + + + \ No newline at end of file