Olá, esta é mais uma de um conjunto de práticas em bioinformática desenvolvidas para o curso de Biomedicina da PUC MG. Você pode encontrar as demais práticas aqui.
Na prática passada você aprendeu as características dos arquivos .fasta e .fastq, e as suas aplicações. Na prática de hoje daremos sentido biológico as sequências guardadas nesses arquivos, e aprenderemos sobre alinhamento e idetificação de sequências.
Bancos de dados de sequências biológicas
Após a identificação do DNA como a molécula responsável pelo armazenamento da informação genética dos organismos, e a compreensão de que entidades biológicas chamadas genes tem sequências definida, os esforços dos geneticistas se direcionaram para a caracterização da diversidade dessas entidades, e de como suas variações refletem na biologia de cada organismo.
Todas tecnologias de sequenciamento de DNA - sejam de Sanger, short reads ou long reads - tem sido utilizadas para alcançar este objetivo. E se as primeiras gerações de sequenciadores demoravam dias para caracterizar um gene ou um pedaço dele, as gerações mais recentes possibilitam conhecer genomas e transcriptomas inteiros em algums horas. À medida que tantas informações começaram a ser acumuladas, compreendeu-se que tão importante quando sequenciar, é armazenar essas sequências e os diversos metadados a elas relacionados. Quaisquer informações extrínsecas à sequência são importantes pois agregam conhecimento, e permitem comparações, a busca por padrões, e outras análises que possibilitam evidenciar padrões biológicos.
Existem diversos bancos de dados biológicos, providos tanto de informações quanto de propósitos diferentes e complementares. Estes bancos são geralmente públicos, o que significa que qualquer um pode tanto submeter quanto baixar depósitos (sequências e suas informações associadas). o National Center for Biotechnology Information (NCBI) é um conjunto é um centro nacional de informações em biotecnologia dos Estados Unidos. Ele é parte do National Institute of Health (NIH) e é um importante recurso para pesquisadores, cientistas e profissionais da área de biologia e biomedicina. Seu principal objetivo do NCBI é fornecer acesso a uma ampla gama de informações biológicas, incluindo sequências de DNA, sequências de proteínas, literatura científica, dados genômicos, ferramentas de análise e recursos para pesquisa biomédica. O NCBI mantém diversos bancos de dados, como o PubMed (que indexa artigos científicos), o Protein Data Bank (que armazena informações sobre estruturas tridimensionais de proteínas), e o GenBank (que contém sequências), além muitos outros.
Além disso, o NCBI desenvolve e disponibiliza várias ferramentas online para análise de sequências, busca de informações e pesquisa. Essas ferramentas são amplamente utilizadas por cientistas e pesquisadores em todo o mundo para realizar análises de bioinformática, estudar genes, proteínas e doenças, e realizar descobertas científicas importantes.
O GenBank é considerado o repositório universal das sequências biológicas conhecias. Ele é integrado com e recebe atualizações diárias dos bancos de dados de sequências da Europa - o European Nucleotide Archive (ENA) - e do Japão - o DNA Data Bank of Japan (DDBJ). Desta maneira, praticamente todas as sequências conhecidas, sejam de DNA, RNA, proteína, ou outros tipos podem ser encontradas lá, e atualmente este banco possui mais de 2.9 bilhões de sequências únicas, correspondentes a mais de 504.000 espécies diferentes (REF).
Identificando sequências biológicas
Conectando no servidor
Nesta aula trabalharemos novamente na edna, nosso servidor computacional para análises bioinformáticas.
Utilizando as credenciais fornecidas durante a aula, conecte no servidor de trabalho via SSH. Quando solicitado, forneça a senha:
#ex:
#ssh usuario@111.222.333.444
ssh $USER@$IP
DICA: Lembre-se que as palavras iniciadas com um $ são variáveis, ou seja, são palavras cujo significado depende da informação que armazenam. Assim, no comando acima você deve substituir $USER e IP pelas credenciais correspondentes.
Entrando na sua pasta de análises
Uma vez na edna, navegue até o diretório que criamos na prática passada e que tem o seu nome ($ALUNO) e sua turma ($TURMA). Iremos trabalhar com as sequências que estão na pasta ~/$TURMA/$ALUNO/arquivos/fasta/seqs.
Navegue até a sua pasta de análises
cd ~/$TURMA/$ALUNO/arquivos/fasta/seqs
ls
Selecionando sequências
Você recebeu estas 3 sequências diferentes. Qual gene elas representam? Vieram de qual organismo? Estas informações não estão intrínsecas à sequência, e precisamos recorrer a recursos externos para saber estas respostas.
Utilize algum comando de visualização para conhecer o conteúdo destes arquivos.
# ver uma seq
cat seq1.fasta
# ver todas
cat seq*
Combine todos os arquivos em um só para análise conjunta.
# combinar todas seqs
cat seq* > seqs.fasta
Dentro da sua pasta (~/$TURMA/$ALUNO) crie uma pasta para realisarmos a análise de hoje. Entre na pasta criada.
cd ~/$TURMA/$ALUNO/
mkdir analises
cd analises
Utilizando a versão online do BLAST
Entre no site do BLAST e realize a mesma busca.
Use algum comando para visalizar uma das suas 3 sequências. Copie a sequência e cole na caixa de buscas do site do BLAST. Rode uma análise com os parâmetros default, ou seja, sem fazer alterações.
Compare estes resultados com os que você obteve na análise local.
Alinhado sequências
Assim como o BLAST busca por sequências semelhantes utilizando alinhamentos locais entre query e subject, existem diversas outras análises que podem utilizar essa estratégia. Por exemplo, apesar de serem semelhantes, qual a diferença entre estas 3 sequências com as quais estamos trabalhando? Podemos responder esta pergunta com um alinhamento. Há dois tipos principais de alinhamentos, o Alinhamento local e o Alinhamento global:
Alinhamento Global: Este alinhamento compara duas sequências biológicas em sua totalidade, desde o início até o final. Ele identifica as regiões conservadas e as diferenças entre as sequências, alinhando todos os caracteres em ambos os conjuntos de dados. Esse tipo de alinhamento é útil quando as sequências têm comprimentos semelhantes e quando se deseja comparar as sequências como um todo. O alinhamento global é frequentemente usado para identificar similaridades entre proteínas ou genes de diferentes espécies, o que ajuda a inferir relações evolutivas e descobrir funções conservadas.
Alinhamento Local: Este alinhamento compara apenas as regiões mais semelhantes entre as sequências biológicas. Em vez de alinhar as sequências inteiras, ele identifica subsequências semelhantes, chamadas de alinhamentos locais, dentro das sequências maiores. Esse tipo de alinhamento é útil quando as sequências são de comprimentos diferentes ou quando se deseja identificar regiões específicas de similaridade, como motivos funcionais ou domínios conservados em proteínas. O alinhamento local é frequentemente usado para identificar regiões de homologia em sequências de DNA, RNA ou proteínas, permitindo inferências sobre estrutura e função. Este é o alinhamento utilizado pelo BLAST.
Agora vamos alinhar nossas sequências. Faremos isso com o programa MUSCLE, um alinhador clássico. Seu nome significa MUltiple Sequence Comparison by Log- Expectation. Ele pode ser encontrado em versão online aqui.
Entenda o funcionamento do programa. Em seguida, alinhe as sequências do arquivo combinado que você construiu.
muscle --help
# com output na tela
muscle -in ~/$TURMA/$ALUNO/arquivos/seqs/seqs.fasta -clw
# com output salvo em arquivo
muscle -in ~/$TURMA/$ALUNO/arquivos/seqs/seqs.fasta -clw -out seqs.algn
ls
less -S seqs.algn
Observe o alinhamento. Onde estão as diferenças?
Esta sequência é de nucleotídeos. Você consegue perceber alguma diferença? Essas sequências geram proteínas iguais? Como seria o alinhamento com a de aminoácidos? Vamos traduzir:
Traduza as sequencias do seu arquivo combinado.
transeq -sequence ~/$TURMA/$ALUNO/arquivos/seqs/seqs.fasta -outseq ~/$TURMA/$ALUNO/arquivos/seqs/seqs.pep
Alinhe as sequências do arquivo combinado que você traduziu em aminoácidos.
muscle -in ~/$TURMA/$ALUNO/arquivos/seqs/seqs.pep -clw
# com output salvo em arquivo
muscle -in ~/$TURMA/$ALUNO/arquivos/seqs/seqs.pep -clw -out seqs_pep.algn
ls
less -S seqs_pep.algn
Observe o alinhamento. O que as diferenças podem significar, conhecendo a origem e a função da proteínas que estamos analisando?
Voltar para a página inicial
LS0tCnRpdGxlOiAiUHLDoXRpY2FzIGVtIEJpb2luZm8gViIKYXV0aG9yOiAiUHJvZi4gSGVyb24gT0giCnBsYWNlOiAiQmlvbWVkaWNpbmEgLSBQVUMgTWluYXMiCmRhdGU6IDIwMjMvMDEKb3V0cHV0OiAKICBybWRmb3JtYXRzOjpkb3duY3V0ZToKICAgIGNvZGVfZm9sZGluZzogc2hvdwogICAgc2VsZl9jb250YWluZWQ6IHRydWUKICAgIHRvY19kZXB0aDogNQogICAgdG9jX2Zsb2F0OiB5ZXMKICAgIGhpZ2hsaWdodDogemVuYnVybgogICAgY29kZV9kb3dubG9hZDogeWVzCmVkaXRvcl9vcHRpb25zOiAKICBjaHVua19vdXRwdXRfdHlwZTogY29uc29sZQotLS0KCmBgYHtyIHNldHVwLCBpbmNsdWRlPUZBTFNFfQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUpCmBgYAoKYGBge3IgY29sb3IsIGVjaG89RkFMU0UsIHJlc3VsdHM9J2FzaXMnfQojY29uZmlndXJhciBwcm9zIHJlc3VsdGFkb3MgZG8gYmFzaCBzYWlyZW0gY29sb3JpZG9zIGUgbsOjbyBBTlNJCgpvbGRfaG9va3MgPC0gZmFuc2k6OnNldF9rbml0X2hvb2tzKAogIGtuaXRyOjprbml0X2hvb2tzLCAKICB3aGljaCA9IGMoIm91dHB1dCIsICJtZXNzYWdlIiwgImVycm9yIikKKQpgYGAKCjxzdHlsZT4KYm9keSB7CnRleHQtYWxpZ246IGp1c3RpZnl9Cjwvc3R5bGU+Cgo8c3R5bGU+CiN0b2MgdWwubmF2IGxpIHVsIGxpIHsKICAgIGRpc3BsYXk6IG5vbmU7CiAgICBtYXgtaGVpZ2h0OiBub25lOwp9CgojdG9jIHVsLm5hdiBsaS5hY3RpdmUgdWwgbGkgIHsKICAgIGRpc3BsYXk6IGJsb2NrOwogICAgbWF4LWhlaWdodDogbm9uZTsKfQoKI3RvYyB1bC5uYXYgbGkgdWwgbGkgdWwgbGkgewogICAgbWF4LWhlaWdodDogbm9uZTsKICAgIGRpc3BsYXk6IG5vbmUgIWltcG9ydGFudDsKfQoKI3RvYyB1bC5uYXYgbGkgdWwgbGkuYWN0aXZlIHVsIGxpIHsKICAgIG1heC1oZWlnaHQ6IG5vbmU7CiAgICBkaXNwbGF5OiBibG9jayAhaW1wb3J0YW50Owp9Cjwvc3R5bGU+CgoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ck9sw6EsIGVzdGEgw6kgbWFpcyB1bWEgZGUgdW0gY29uanVudG8gZGUgcHLDoXRpY2FzIGVtIGJpb2luZm9ybcOhdGljYSBkZXNlbnZvbHZpZGFzIHBhcmEgbyBjdXJzbyBkZSBCaW9tZWRpY2luYSBkYSBQVUMgTUcuClZvY8OqIHBvZGUgZW5jb250cmFyIGFzIGRlbWFpcyBwcsOhdGljYXMgWyphcXVpKl0oaHR0cHM6Ly9oZXJvbm9oLmdpdGh1Yi5pby9iaW9pbmZvKS4KCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpOYSBwcsOhdGljYSBwYXNzYWRhIHZvY8OqIGFwcmVuZGV1IGFzIGNhcmFjdGVyw61zdGljYXMgZG9zIGFycXVpdm9zIF8uZmFzdGFfIGUgXy5mYXN0cV8sIGUgYXMgc3VhcyBhcGxpY2HDp8O1ZXMuIE5hIHByw6F0aWNhIGRlIGhvamUgZGFyZW1vcyBzZW50aWRvIGJpb2zDs2dpY28gYXMgc2VxdcOqbmNpYXMgZ3VhcmRhZGFzIG5lc3NlcyBhcnF1aXZvcywgZSBhcHJlbmRlcmVtb3Mgc29icmUgYWxpbmhhbWVudG8gZSBpZGV0aWZpY2HDp8OjbyBkZSBzZXF1w6puY2lhcy4KCiMjIEJhbmNvcyBkZSBkYWRvcyBkZSBzZXF1w6puY2lhcyBiaW9sw7NnaWNhcwombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKQXDDs3MgYSBpZGVudGlmaWNhw6fDo28gZG8gRE5BIGNvbW8gYSBtb2zDqWN1bGEgcmVzcG9uc8OhdmVsIHBlbG8gYXJtYXplbmFtZW50byBkYSBpbmZvcm1hw6fDo28gZ2Vuw6l0aWNhIGRvcyBvcmdhbmlzbW9zLCBlIGEgY29tcHJlZW5zw6NvIGRlIHF1ZSBlbnRpZGFkZXMgYmlvbMOzZ2ljYXMgY2hhbWFkYXMgKipnZW5lcyoqIHRlbSBzZXF1w6puY2lhcyBkZWZpbmlkYSwgb3MgZXNmb3LDp29zIGRvcyBnZW5ldGljaXN0YXMgc2UgZGlyZWNpb25hcmFtIHBhcmEgYSBjYXJhY3Rlcml6YcOnw6NvIGRhIGRpdmVyc2lkYWRlIGRlc3NhcyBlbnRpZGFkZXMsIGUgZGUgY29tbyBzdWFzIHZhcmlhw6fDtWVzIHJlZmxldGVtIG5hIGJpb2xvZ2lhIGRlIGNhZGEgb3JnYW5pc21vLiAKCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpUb2RhcyB0ZWNub2xvZ2lhcyBkZSBzZXF1ZW5jaWFtZW50byBkZSBETkEgLSBzZWphbSBkZSBTYW5nZXIsIF9zaG9ydCByZWFkc18gb3UgX2xvbmcgcmVhZHNfIC0gdGVtIHNpZG8gdXRpbGl6YWRhcyBwYXJhIGFsY2Fuw6dhciBlc3RlIG9iamV0aXZvLiBFIHNlIGFzIHByaW1laXJhcyBnZXJhw6fDtWVzIGRlIHNlcXVlbmNpYWRvcmVzIGRlbW9yYXZhbSBkaWFzIHBhcmEgY2FyYWN0ZXJpemFyIHVtIGdlbmUgb3UgdW0gcGVkYcOnbyBkZWxlLCBhcyBnZXJhw6fDtWVzIG1haXMgcmVjZW50ZXMgcG9zc2liaWxpdGFtIGNvbmhlY2VyIGdlbm9tYXMgZSB0cmFuc2NyaXB0b21hcyBpbnRlaXJvcyBlbSBhbGd1bXMgaG9yYXMuIMOAIG1lZGlkYSBxdWUgdGFudGFzIGluZm9ybWHDp8O1ZXMgY29tZcOnYXJhbSBhIHNlciBhY3VtdWxhZGFzLCBjb21wcmVlbmRldS1zZSBxdWUgdMOjbyBpbXBvcnRhbnRlIHF1YW5kbyBzZXF1ZW5jaWFyLCDDqSBhcm1hemVuYXIgZXNzYXMgc2VxdcOqbmNpYXMgZSBvcyBkaXZlcnNvcyBtZXRhZGFkb3MgYSBlbGFzIHJlbGFjaW9uYWRvcy4gUXVhaXNxdWVyIGluZm9ybWHDp8O1ZXMgZXh0csOtbnNlY2FzIMOgIHNlcXXDqm5jaWEgc8OjbyBpbXBvcnRhbnRlcyBwb2lzIGFncmVnYW0gY29uaGVjaW1lbnRvLCBlIHBlcm1pdGVtIGNvbXBhcmHDp8O1ZXMsIGEgYnVzY2EgcG9yIHBhZHLDtWVzLCBlIG91dHJhcyBhbsOhbGlzZXMgcXVlIHBvc3NpYmlsaXRhbSBldmlkZW5jaWFyIHBhZHLDtWVzIGJpb2zDs2dpY29zLiAKCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpFeGlzdGVtIGRpdmVyc29zIGJhbmNvcyBkZSBkYWRvcyBiaW9sw7NnaWNvcywgcHJvdmlkb3MgdGFudG8gZGUgaW5mb3JtYcOnw7VlcyBxdWFudG8gZGUgcHJvcMOzc2l0b3MgZGlmZXJlbnRlcyBlIGNvbXBsZW1lbnRhcmVzLiBFc3RlcyBiYW5jb3Mgc8OjbyBnZXJhbG1lbnRlICoqcMO6YmxpY29zKiosIG8gcXVlIHNpZ25pZmljYSBxdWUgcXVhbHF1ZXIgdW0gcG9kZSB0YW50byBfc3VibWV0ZXJfIHF1YW50byBfYmFpeGFyIGRlcMOzc2l0b3NfIChzZXF1w6puY2lhcyBlIHN1YXMgaW5mb3JtYcOnw7VlcyBhc3NvY2lhZGFzKS4gbyAqKipOYXRpb25hbCBDZW50ZXIgZm9yIEJpb3RlY2hub2xvZ3kgSW5mb3JtYXRpb24qKiogKCoqKk5DQkkqKiopIMOpIHVtIGNvbmp1bnRvIMOpIHVtIGNlbnRybyBuYWNpb25hbCBkZSBpbmZvcm1hw6fDtWVzIGVtIGJpb3RlY25vbG9naWEgZG9zIEVzdGFkb3MgVW5pZG9zLiBFbGUgw6kgcGFydGUgZG8gKioqTmF0aW9uYWwgSW5zdGl0dXRlIG9mIEhlYWx0aCoqKiAoKioqTklIKioqKSBlIMOpIHVtIGltcG9ydGFudGUgcmVjdXJzbyBwYXJhIHBlc3F1aXNhZG9yZXMsIGNpZW50aXN0YXMgZSBwcm9maXNzaW9uYWlzIGRhIMOhcmVhIGRlIGJpb2xvZ2lhIGUgYmlvbWVkaWNpbmEuIFNldSBwcmluY2lwYWwgb2JqZXRpdm8gZG8gTkNCSSDDqSBmb3JuZWNlciBhY2Vzc28gYSB1bWEgYW1wbGEgZ2FtYSBkZSBpbmZvcm1hw6fDtWVzIGJpb2zDs2dpY2FzLCBpbmNsdWluZG8gc2VxdcOqbmNpYXMgZGUgRE5BLCBzZXF1w6puY2lhcyBkZSBwcm90ZcOtbmFzLCBsaXRlcmF0dXJhIGNpZW50w61maWNhLCBkYWRvcyBnZW7DtG1pY29zLCBmZXJyYW1lbnRhcyBkZSBhbsOhbGlzZSBlIHJlY3Vyc29zIHBhcmEgcGVzcXVpc2EgYmlvbcOpZGljYS4gTyBOQ0JJIG1hbnTDqW0gZGl2ZXJzb3MgYmFuY29zIGRlIGRhZG9zLCBjb21vICBvIFsqKlB1Yk1lZCoqXShodHRwczovL3B1Ym1lZC5uY2JpLm5sbS5uaWguZ292LykgKHF1ZSBpbmRleGEgYXJ0aWdvcyBjaWVudMOtZmljb3MpLCBvIFsqKlByb3RlaW4gRGF0YSBCYW5rKipdKGh0dHBzOi8vd3d3LnJjc2Iub3JnLykgKHF1ZSBhcm1hemVuYSBpbmZvcm1hw6fDtWVzIHNvYnJlIGVzdHJ1dHVyYXMgdHJpZGltZW5zaW9uYWlzIGRlIHByb3Rlw61uYXMpLCBlIG8gWyoqR2VuQmFuayoqXShodHRwczovL3d3dy5uY2JpLm5sbS5uaWguZ292L2dlbmJhbmsvKSAocXVlIGNvbnTDqW0gc2VxdcOqbmNpYXMpLCBhbMOpbSBtdWl0b3Mgb3V0cm9zLgoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CkFsw6ltIGRpc3NvLCBvIE5DQkkgZGVzZW52b2x2ZSBlIGRpc3BvbmliaWxpemEgdsOhcmlhcyBmZXJyYW1lbnRhcyBvbmxpbmUgcGFyYSBhbsOhbGlzZSBkZSBzZXF1w6puY2lhcywgYnVzY2EgZGUgaW5mb3JtYcOnw7VlcyBlIHBlc3F1aXNhLiBFc3NhcyBmZXJyYW1lbnRhcyBzw6NvIGFtcGxhbWVudGUgdXRpbGl6YWRhcyBwb3IgY2llbnRpc3RhcyBlIHBlc3F1aXNhZG9yZXMgZW0gdG9kbyBvIG11bmRvIHBhcmEgcmVhbGl6YXIgYW7DoWxpc2VzIGRlIGJpb2luZm9ybcOhdGljYSwgZXN0dWRhciBnZW5lcywgcHJvdGXDrW5hcyBlIGRvZW7Dp2FzLCBlIHJlYWxpemFyIGRlc2NvYmVydGFzIGNpZW50w61maWNhcyBpbXBvcnRhbnRlcy4gIAoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7Ck8gKipHZW5CYW5rKiogw6kgY29uc2lkZXJhZG8gbyByZXBvc2l0w7NyaW8gdW5pdmVyc2FsIGRhcyBzZXF1w6puY2lhcyBiaW9sw7NnaWNhcyBjb25oZWNpYXMuIEVsZSDDqSBpbnRlZ3JhZG8gY29tIGUgcmVjZWJlIGF0dWFsaXphw6fDtWVzIGRpw6FyaWFzIGRvcyBiYW5jb3MgZGUgZGFkb3MgZGUgc2VxdcOqbmNpYXMgZGEgRXVyb3BhIC0gbyBbICoqRXVyb3BlYW4gTnVjbGVvdGlkZSBBcmNoaXZlKiogXShodHRwczovL3d3dy5lYmkuYWMudWsvZW5hL2Jyb3dzZXIvaG9tZSkgKCoqRU5BKiopIC0gIGUgZG8gSmFww6NvIC0gbyBbKipETkEgRGF0YSBCYW5rIG9mIEphcGFuKipdKGh0dHBzOi8vd3d3LmRkYmoubmlnLmFjLmpwL2luZGV4LWUuaHRtbCkgKCoqRERCSioqKS4gRGVzdGEgbWFuZWlyYSwgcHJhdGljYW1lbnRlIHRvZGFzIGFzIHNlcXXDqm5jaWFzIGNvbmhlY2lkYXMsIHNlamFtIGRlIEROQSwgUk5BLCBwcm90ZcOtbmEsIG91IG91dHJvcyB0aXBvcyBwb2RlbSBzZXIgZW5jb250cmFkYXMgbMOhLCBlIGF0dWFsbWVudGUgZXN0ZSBiYW5jbyBwb3NzdWkgbWFpcyBkZSAyLjkgYmlsaMO1ZXMgZGUgc2VxdcOqbmNpYXMgw7puaWNhcywgY29ycmVzcG9uZGVudGVzIGEgbWFpcyBkZSA1MDQuMDAwIGVzcMOpY2llcyBkaWZlcmVudGVzIChbIF5SRUZeIF0oaHR0cHM6Ly93d3cubmNiaS5ubG0ubmloLmdvdi9wbWMvYXJ0aWNsZXMvUE1DOTgyNTUxOS8pKS4KCiMjIElkZW50aWZpY2FuZG8gc2VxdcOqbmNpYXMgYmlvbMOzZ2ljYXMKCiMjIyBDb25lY3RhbmRvIG5vIHNlcnZpZG9yCgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKTmVzdGEgYXVsYSB0cmFiYWxoYXJlbW9zIG5vdmFtZW50ZSBuYSAqKmVkbmEqKiwgbm9zc28gc2Vydmlkb3IgY29tcHV0YWNpb25hbCBwYXJhIGFuw6FsaXNlcyBiaW9pbmZvcm3DoXRpY2FzLiAKCj4gVXRpbGl6YW5kbyBhcyBjcmVkZW5jaWFpcyAqKipmb3JuZWNpZGFzIGR1cmFudGUgYSBhdWxhKioqLCBjb25lY3RlIG5vIHNlcnZpZG9yIGRlIHRyYWJhbGhvIHZpYSBTU0guIFF1YW5kbyBzb2xpY2l0YWRvLCBmb3JuZcOnYSBhIHNlbmhhOgoKYGBge2Jhc2gsIGVjaG89VFJVRSxldmFsPUZBTFNFfQojZXg6CiNzc2ggdXN1YXJpb0AxMTEuMjIyLjMzMy40NDQKCnNzaCAkVVNFUkAkSVAKYGBgCgo+PiAqKkRJQ0E6KiogTGVtYnJlLXNlIHF1ZSBhcyBwYWxhdnJhcyBpbmljaWFkYXMgY29tIHVtICoqJCoqIHPDo28gKip2YXJpw6F2ZWlzKiosIG91IHNlamEsIHPDo28gcGFsYXZyYXMgY3VqbyBzaWduaWZpY2FkbyBkZXBlbmRlIGRhIGluZm9ybWHDp8OjbyBxdWUgYXJtYXplbmFtLiBBc3NpbSwgbm8gY29tYW5kbyBhY2ltYSB2b2PDqiBkZXZlIHN1YnN0aXR1aXIgKipcJFVTRVIqKiBlICoqSVAqKiBwZWxhcyBjcmVkZW5jaWFpcyBjb3JyZXNwb25kZW50ZXMuCgojIyMgRW50cmFuZG8gbmEgc3VhIHBhc3RhIGRlIGFuw6FsaXNlcwoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ClVtYSB2ZXogbmEgKiplZG5hKiosIG5hdmVndWUgYXTDqSBvIGRpcmV0w7NyaW8gcXVlIGNyaWFtb3MgbmEgcHLDoXRpY2EgcGFzc2FkYSBlIHF1ZSB0ZW0gbyBzZXUgbm9tZSAoKipcJEFMVU5PKiopIGUgc3VhIHR1cm1hICgqKlwkVFVSTUEqKikuIElyZW1vcyB0cmFiYWxoYXIgY29tIGFzIHNlcXXDqm5jaWFzIHF1ZSBlc3TDo28gbmEgcGFzdGEgKip+L1wkVFVSTUEvXCRBTFVOTy9hcnF1aXZvcy9mYXN0YS9zZXFzKiouCgo+IE5hdmVndWUgYXTDqSBhIHN1YSBwYXN0YSBkZSBhbsOhbGlzZXMKCmBgYHtiYXNoLCBlY2hvPVRSVUUsZXZhbD1GQUxTRX0KY2Qgfi8kVFVSTUEvJEFMVU5PL2FycXVpdm9zL2Zhc3RhL3NlcXMKCmxzCmBgYAoKIyMjIFNlbGVjaW9uYW5kbyBzZXF1w6puY2lhcwoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7ClZvY8OqIHJlY2ViZXUgZXN0YXMgMyBzZXF1w6puY2lhcyBkaWZlcmVudGVzLiBRdWFsIGdlbmUgZWxhcyByZXByZXNlbnRhbT8gVmllcmFtIGRlIHF1YWwgb3JnYW5pc21vPyBFc3RhcyBpbmZvcm1hw6fDtWVzIG7Do28gZXN0w6NvIGludHLDrW5zZWNhcyDDoCBzZXF1w6puY2lhLCBlIHByZWNpc2Ftb3MgcmVjb3JyZXIgYSByZWN1cnNvcyBleHRlcm5vcyBwYXJhIHNhYmVyIGVzdGFzIHJlc3Bvc3Rhcy4KCj4gVXRpbGl6ZSBhbGd1bSBjb21hbmRvIGRlIHZpc3VhbGl6YcOnw6NvIHBhcmEgY29uaGVjZXIgbyBjb250ZcO6ZG8gZGVzdGVzIGFycXVpdm9zLgoKYGBge2Jhc2gsIGVjaG89VFJVRSxldmFsPUZBTFNFfQojIHZlciB1bWEgc2VxCmNhdCBzZXExLmZhc3RhCgojIHZlciB0b2RhcwpjYXQgc2VxKgpgYGAKCj4gQ29tYmluZSB0b2RvcyBvcyBhcnF1aXZvcyBlbSB1bSBzw7MgcGFyYSBhbsOhbGlzZSBjb25qdW50YS4KCmBgYHtiYXNoLCBlY2hvPVRSVUUsZXZhbD1GQUxTRX0KIyBjb21iaW5hciB0b2RhcyBzZXFzCmNhdCBzZXEqID4gc2Vxcy5mYXN0YQpgYGAKCj4gRGVudHJvIGRhIHN1YSBwYXN0YSAoKip+L1wkVFVSTUEvXCRBTFVOTyoqKSBjcmllIHVtYSBwYXN0YSBwYXJhIHJlYWxpc2FybW9zIGEgYW7DoWxpc2UgZGUgaG9qZS4gRW50cmUgbmEgcGFzdGEgY3JpYWRhLgoKYGBge2Jhc2gsIGVjaG89VFJVRSxldmFsPUZBTFNFfQpjZCB+LyRUVVJNQS8kQUxVTk8vCgpta2RpciBhbmFsaXNlcwoKY2QgYW5hbGlzZXMKYGBgCgoKIyMjIElkZW50aWZpY2FuZG8gc2VxdcOqbmNpYXMgY29tIG8gQkxBU1QKCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpPIFsqKkJMQVNUKipdKGh0dHBzOi8vYmxhc3QubmNiaS5ubG0ubmloLmdvdi9CbGFzdC5jZ2kpICgqKipCYXNpYyBMb2NhbCBBbGlnbm1lbnQgU2VhcmNoIFRvb2wqKiopIMOpIHVtYSBmZXJyYW1lbnRhIGRlIGJ1c2NhIGRlIHNpbWlsYXJpZGFkZSBiYXNlYWRhIGVtIGFsaW5oYW1lbnRvIGRlIHNlcXXDqm5jaWFzLiDDiSBwb3NzaXZlbG1lbnRlIG8gcHJvZ3JhbWEgZGUgYmlvaW5mb3Jtw6F0aWNhIG1haXMgdXRpbGl6YWRvIG5vIG11bmRvLCBlIHRlbSBkaXZlcnNhcyBhcGxpY2HDp8O1ZXMsIGRlcGVuZGVuZG8gZGUgY29tbyDDqSB1dGlsaXphZG8uIApFc3RlIGFsZ29yw610bW8gdGVtIGRpZmVyZW50ZXMgdmFyaWHDp8O1ZXMsIHF1ZSB2w6NvIGRlcGVuZGVyIGJhc2ljYW1lbnRlIGRvIGZvcm1hdG8gZGEgc2VxdcOqbmNpYSBidXNjYWRhIGUgZGFzIHNlcXXDqm5jaWFzIGRlIHJlZmVyw6puY2lhLiBBbWJhcyBwb2RlbSBzZXIgc2VyIHRhbnRvIHNlcXXDqm5jaWFzIGRlIG51Y2xlb3TDrWRlbyBxdWFudG8gZGUgYW1pbm/DoWNpZG9zLiBPcyB0aXBvcyBkZSAqKkJMQVNUKiogc8OjbzoKCiAtICoqQkxBU1RuOioqIMOJIHVzYWRvIHBhcmEgYWxpbmhhciBzZXF1w6puY2lhcyBkZSBETkEgY29tIG8gb2JqZXRpdm8gZGUgZW5jb250cmFyIHNpbWlsYXJpZGFkZXMgbnVjbGVvdMOtZGljYXMuIMOJIMO6dGlsIHBhcmEgaWRlbnRpZmljYXIgaG9tb2xvZ2lhcyBlbnRyZSBnZW5lcyBvdSByZWdpw7VlcyBnZW7DtG1pY2FzLgoKIC0gKipCTEFTVHA6Kiogw4kgdXNhZG8gcGFyYSBjb21wYXJhciBzZXF1w6puY2lhcyBkZSBhbWlub8OhY2lkb3MgKHByb3Rlw61uYXMpIGVtIGJhbmNvcyBkZSBkYWRvcyBkZSBwcm90ZcOtbmFzLiBPICoqQkxBU1RwKiogw6kgw7p0aWwgcGFyYSBpZGVudGlmaWNhciBwcm90ZcOtbmFzIHNpbWlsYXJlcyBlIGRldGVybWluYXIgYSBmdW7Dp8OjbyBkZSBwcm90ZcOtbmFzIGRlc2NvbmhlY2lkYXMgY29tIGJhc2UgZW0gcHJvdGXDrW5hcyBob23Ds2xvZ2FzLgoKIC0gKipCTEFTVHg6Kiogw4kgdXNhZG8gcGFyYSBjb21wYXJhciBzZXF1w6puY2lhcyBkZSBETkEgY29tIGJhbmNvcyBkZSBkYWRvcyBkZSBwcm90ZcOtbmFzIHRyYWR1emlkYXMuIEVsZSB0cmFkdXogYSBzZXF1w6puY2lhIGRlIEROQSBlbSB0b2RhcyBhcyBzZWlzIHBvc3PDrXZlaXMgbW9sZHVyYXMgZGUgbGVpdHVyYSBlLCBlbSBzZWd1aWRhLCBjb21wYXJhIGFzIHNlcXXDqm5jaWFzIHRyYWR1emlkYXMgY29tIGFzIHByb3Rlw61uYXMgbm8gYmFuY28gZGUgZGFkb3MuIE8gKipCTEFTVHgqKiDDqSDDunRpbCBwYXJhIGVuY29udHJhciBzZXF1w6puY2lhcyBjb2RpZmljYWRvcmFzIGRlIHByb3Rlw61uYXMgZW0gcmVnacO1ZXMgZGUgRE5BIGRlc2NvbmhlY2lkYXMuCgotICoqdEJMQVNUeDoqKiDDiSB1c2FkbyBwYXJhIGNvbXBhcmFyIHNlcXXDqm5jaWFzIGRlIEROQSB0cmFkdXppZGFzIGVtIEFBLCBjb20gYmFuY29zIGRlIGRhZG9zIGRlIEROQSB0cmFkdXppZGFzIGVtIEFBLiBPdSBzZWphLCBvcyAqaW5wdXRzKiBzw6NvIGVtIG51Y2xlb3TDrWRlb3MsIG1hcyBhIGNvbXBhcmHDp8OjbyDDqSBmZWl0YSBuYSBkZSBhbWlub8OhY2lkb3MuIEVsZSDDqSBtdWl0byB1dGlsaXphZG8gbmEgYW5vdGHDp8OjbyBkZSBub3ZvcyBnZW5lcywgcXVlIMOpIG8gcHJvY2Vzc28gcGVsbyBxdWFsIHNlIGlkZW50aWZpY2EgdW1hIHBvc3PDrXZlbCBmdW7Dp8OjbyBkZSB1bSBnZW5lIGNvZGlmaWNhZG9yIGRlIHByb3Rlw61uYSBhdHJhdsOpcyBkZSBzdWEgc2VtZWxoYW7Dp2EgY29tIG91dHJvcyBnZW5lcyBjb25oZWNpZG9zLgoKIC0gKip0QkxBU1RuOioqIMOJIHVzYWRvIHBhcmEgY29tcGFyYXIgc2VxdcOqbmNpYXMgZGUgcHJvdGXDrW5hcyBjb20gYmFuY29zIGRlIGRhZG9zIGRlIEROQSB0cmFkdXppZG9zLiBFbGUgdHJhZHV6IGFzIHNlcXXDqm5jaWFzIGRlIEROQSBubyBiYW5jbyBkZSBkYWRvcyBlLCBlbSBzZWd1aWRhLCBjb21wYXJhLWFzIGNvbSBhcyBzZXF1w6puY2lhcyBkZSBwcm90ZcOtbmFzIGRlIGNvbnN1bHRhLiBPICoqdEJMQVNUbioqIMOpIMO6dGlsIHBhcmEgZW5jb250cmFyIHNlcXXDqm5jaWFzIGRlIEROQSBxdWUgcG9zc2FtIGVzdGFyIGNvZGlmaWNhbmRvIHByb3Rlw61uYXMgc2VtZWxoYW50ZXMuCgogLSAqKkJMQVNUejoqKiDDiSB1bWEgdmVyc8OjbyBkbyAqKkJMQVNUKiogcHJvamV0YWRhIGVzcGVjaWZpY2FtZW50ZSBwYXJhIGFsaW5oYXIgcmVnacO1ZXMgZ2Vuw7RtaWNhcyBtYWlvcmVzLiBFbGUgw6kgZnJlcXVlbnRlbWVudGUgdXNhZG8gcGFyYSBjb21wYXJhciBnZW5vbWFzIGludGVpcm9zIGRlIGVzcMOpY2llcyBkaWZlcmVudGVzLgoKCiZuYnNwOyZuYnNwOyZuYnNwOyZuYnNwOwpDb21vIGEgbm9zc2Egc2VxdcOqbmNpYSDDqSBkZSBudWNsZW90w61kZW9zLCBwb2RlbW9zIHV0aWxpemFyIG8gKipCTEFTVG4qKi4gVmFtb3MgY29uaGVjw6otbG8gbWVsaG9yLiAKCj4gQ29uaGXDp2Egb3MgcG9zc8OtdmVpcyBhcmd1bWVudG9zIGUgcGFyw6JtZXRyb3MgZG8gYmxhc3RuLgoKYGBge2Jhc2gsIGVjaG89VFJVRSxldmFsPUZBTFNFfQpibGFzdG4gLWhlbHAgfCBsZXNzCmBgYAoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CkNvbW8gdm9jw6ogcG9kZSB2ZXIsIGV4aXN0ZW0gZGl2ZXJzYXMgY29uZmlndXJhw6fDtWVzIGUgZm9ybWF0b3MgZGUgc2HDrWRhIHBvc3PDrXZlaXMuIFZhbW9zIGFwcmVuZGVyIGEgZmF6ZXIgdW1hIGJ1c2NhIHNpbXBsZXMuIFBhcmEgaXN0byB2b2PDqiBwcmVjaXNhIGRlOgoKIC0gVW1hIG91IGFsZ3VhbWFzIHNlcXXDqm5jaWFzIGEgc2VyZW0gYnVzY2FkYXMsIG5vIGZvcm1hdG8gZmFzdGEsIHF1ZSBjaGFtYW1vcyBkZSAqKipxdWVyeSoqKjsKIAogLSBVbSBiYW5jbyBkZSBkYWRvcyBjb250ZW5kbyBvdXRyYXMgc2VxdcOqbmNpYXMgY29uaGVjaWRhcywgcXVlIGNoYW1hbW9zIGRlICoqKnN1YmplY3QqKiouIE5vIGNhc28gZG8gQkxBU1QgbmEgbGluaGEgZGUgY29tYW5kbywgZXN0ZSBiYW5jbyBkZSBkYWRvcyBwcmVjaXNhIHNlciAqKmxvY2FsKiosIG91IHNlamEsIGRldmUgZXN0YXIgbm8gY29tcHV0YWRvciBvbmRlIHNlIGVzdMOhIGZhemVuZG8gYSBhbsOhbGlzZTsKIAogLSBVbSBmb3JtYXRvIGRlIHNhw61kYSBkYSBzdWEgZXNjb2xoYSwgcGFyYSBhIGV4aWJpw6fDo28gZG9zIHJlc3VsdGFkb3MuCgo+IFJvZGUgbyBibGFzdG4gcGFyYSBpZGVudGlmaWNhciBhIHF1ZSBwZXJ0ZW5jZW0gYXMgc2VxdcOqbmNpYXMgcXVlIHZvY8OqIHRlbS4KCmBgYHtiYXNoLCBlY2hvPVRSVUUsZXZhbD1GQUxTRX0KIyAgICAgICNzZXEgYSBzZXIgYnVzY2FkYSAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICNiYW5jbyBkZSBkYWRvcyAgICAgICAgICAgI2Zvcm1hdG8gZGUgc2FpZGEgCmJsYXN0biAtcXVlcnkgfi8kVFVSTUEvJEFMVU5PL2FycXVpdm9zL2Zhc3RhL3NlcXMvc2Vxcy5mYXN0YSAtZGIgL2RhdGEvZGF0YWJhc2VzL250L250IC1vdXRmbXQgNiAtbnVtX2FsaWdubWVudHMgMwpgYGAKCk9ic2VydmUgYSB0YWJlbGEgZ2VyYWRhLiBFbGEgY29udMOpbSAxMiBjb2x1bmFzLiBFc3RhcyBzw6NvOgoKIC0gKipRdWVyeSBJRDoqKiBPIGlkZW50aWZpY2Fkb3IgZGEgc2VxdcOqbmNpYSBkZSBidXNjYWRhLgogCiAtICoqU3ViamVjdCBJRDoqKiBPIGlkZW50aWZpY2Fkb3IgZGEgc2VxdcOqbmNpYSBkbyBiYW5jbyBkZSBkYWRvcyBxdWUgY29ycmVzcG9uZGUgYW8gKipzdWJqZWN0KiouCiAKIC0gKiolIGRlIGlkZW50aWRhZGU6KiogQSBwb3JjZW50YWdlbSBkZSBpZGVudGlkYWRlIGVudHJlIGEgc2VxdcOqbmNpYSBidXNjYWRhICoqcXVlcnkqKiBlIGEgc2VxdcOqbmNpYSAqKnN1YmplY3QqKiBkbyBiYW5jbyBkZSBkYWRvcy4KIAogLSAqKlRhbWFuaG8gZG8gYWxpbmhhbWVudG86KiogTyBjb21wcmltZW50byBkbyBhbGluaGFtZW50byBhIHNlcXXDqm5jaWEgYnVzY2FkYSAqKnF1ZXJ5KiogZSBhIHNlcXXDqm5jaWEgKipzdWJqZWN0KiogZG8gYmFuY28gZGUgZGFkb3MuCiAKIC0gKipNaXNtYXRjaGVzOioqIE8gbsO6bWVybyBkZSBiYXNlcyBxdWUgbsOjbyBjb3JyZXNwb25kZW0gYSBzZXF1w6puY2lhIGJ1c2NhZGEgKipxdWVyeSoqIGUgYSBzZXF1w6puY2lhICoqc3ViamVjdCoqIGRvIGJhbmNvIGRlIGRhZG9zLgogCiAtICoqR2FwIE9wZW5zOioqIE8gbsO6bWVybyBkZSBsYWN1bmFzICgqZ2FwcyopIG5vIGFsaW5oYW1lbnRvIGVudHJhIGEgKipxdWVyeSoqIGUgbyAqKnN1YmplY3QqKi4KIAogLSAqKlF1ZXJ5IFN0YXJ0OioqIEEgcG9zacOnw6NvIGluaWNpYWwgZGEgc2VxdcOqbmNpYSBidXNjYWRhICoqcXVlcnkqKiBxdWUgY29ycmVzcG9uZGUgYW8gYWxpbmhhbWVudG8uCiAKIC0gKipRdWVyeSBFbmQ6KiogQSBwb3Npw6fDo28gZmluYWwgZGEgc2VxdcOqbmNpYSBidXNjYWRhICoqcXVlcnkqKiBxdWUgY29ycmVzcG9uZGUgYW8gYWxpbmhhbWVudG8uCiAKIC0gKipTdWJqZWN0IFN0YXJ0OioqIEEgcG9zacOnw6NvIGluaWNpYWwgZGEgc2VxdcOqbmNpYSAqKnN1YmplY3QqKiBkbyBiYW5jbyBkZSBkYWRvcyBxdWUgY29ycmVzcG9uZGUgYW8gYWxpbmhhbWVudG8uCiAKIC0gKipTdWJqZWN0IEVuZDoqKiBBIHBvc2nDp8OjbyBmaW5hbCBkYSBzZXF1w6puY2lhICoqc3ViamVjdCoqIGRvIGJhbmNvIGRlIGRhZG9zIHF1ZSBjb3JyZXNwb25kZSBhbyBhbGluaGFtZW50by4KIAogLSAqKkUtdmFsdWU6KiogTyB2YWxvciBkZSBzaWduaWZpY8OibmNpYSAoKkUtdmFsdWUqKSBkbyBhbGluaGFtZW50bywgcXVlIGluZGljYSBhIHByb2JhYmlsaWRhZGUgZGUgZW5jb250cmFyIHVtIGFsaW5oYW1lbnRvIHNlbWVsaGFudGUgcG9yIGFjYXNvLgogCiAtICoqQml0IFNjb3JlOioqIE8gZXNjb3JlIGRvIGFsaW5oYW1lbnRvLCBxdWUgw6kgdW1hIG1lZGlkYSBkYSBxdWFsaWRhZGUgZSB0YW1iw6ltIGRhIHNpZ25pZmljw6JuY2lhIGRvIGFsaW5oYW1lbnRvLCBtYXMgZGVwZW5kZSBkbyBiYW5jbyBkZSBkYWRvcyB1c2Fkby4KIAo+IEFuYWxpc2UgbyByZXN1bHRhZG8uIE8gcXVlIHZvY8OqIGNvbnNlZ3VlIGVudGVuZGVyIGEgcGFydGlyIGRlc3NhcyBjb2x1bmFzPwoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CkFwZXNhciBkZSBqw6EgdGVybW9zIHVtYSBpZGVudGlmaWNhw6fDoyBwb3NpdGl2YSwgZXNzZSBmb3JtYXRvIGRlIHJlc3VsdGFkb3MgbsOjbyB0ZW0gYSBpbmZvcm1hw6fDo28gY29tcGxldGEgc29icmUgYSBxdWFsIG9yZ2FuaXNtby9nZW5lIHNlIHJlZmVyZSBvICoqc3ViamVjdCoqLiBQYXJhIHNhYmVybW9zIGlzc28sIHByZWNpc2Ftb3MgdXNhciBvdXRybyBjb21hbmRvLgoKPiBObyBjb21hbmRvIGEgc2VndWlyLCBzdWJzdGl0dWEgXCRISVQgcGVsYSBwYWxhdnJhIG5hIHNlZ3VuZGEgY29sdW5hLCBxdWUgY29ycmVzcG9uZGUgYW8gKipzdWJqZWN0KiouCgpgYGB7YmFzaCwgZWNobz1UUlVFLGV2YWw9RkFMU0V9CiMgICAgICAjc2VxIGEgc2VyIGJ1c2NhZGEgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAjYmFuY28gZGUgZGFkb3MgICAgICAgICAgICNmb3JtYXRvIGRlIHNhaWRhIApibGFzdGRiY21kIC1kYiAvZGF0YS9kYXRhYmFzZXMvbnQvbnQgLWVudHJ5ICRISVQgLW91dGZtdCAldAoKYGBgCgo+IEludGVycHJldGUgbyByZXN1bHRhZG8uIERlIHF1ZSBzw6NvIGFzIHNlcXXDqm5jaWFzPwoKIyMjIFV0aWxpemFuZG8gYSB2ZXJzw6NvIG9ubGluZSBkbyBCTEFTVAoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CkVudHJlIG5vIHNpdGUgZG8gWyoqQkxBU1QqKl0oaHR0cHM6Ly9ibGFzdC5uY2JpLm5sbS5uaWguZ292L0JsYXN0LmNnaSkgZSByZWFsaXplIGEgbWVzbWEgYnVzY2EuIAoKPiBVc2UgYWxndW0gY29tYW5kbyBwYXJhIHZpc2FsaXphciB1bWEgZGFzIHN1YXMgMyBzZXF1w6puY2lhcy4gQ29waWUgYSBzZXF1w6puY2lhIGUgY29sZSBuYSBjYWl4YSBkZSBidXNjYXMgZG8gc2l0ZSBkbyBCTEFTVC4gUm9kZSB1bWEgYW7DoWxpc2UgY29tIG9zIHBhcsOibWV0cm9zIF9kZWZhdWx0Xywgb3Ugc2VqYSwgc2VtIGZhemVyIGFsdGVyYcOnw7Vlcy4KCj4gQ29tcGFyZSBlc3RlcyByZXN1bHRhZG9zIGNvbSBvcyBxdWUgdm9jw6ogb2J0ZXZlIG5hIGFuw6FsaXNlIGxvY2FsLgoKCgojIyBBbGluaGFkbyBzZXF1w6puY2lhcwoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CkFzc2ltIGNvbW8gbyBCTEFTVCBidXNjYSBwb3Igc2VxdcOqbmNpYXMgc2VtZWxoYW50ZXMgdXRpbGl6YW5kbyBhbGluaGFtZW50b3MgbG9jYWlzIGVudHJlICoqcXVlcnkqKiBlICoqc3ViamVjdCoqLCBleGlzdGVtIGRpdmVyc2FzIG91dHJhcyBhbsOhbGlzZXMgcXVlIHBvZGVtIHV0aWxpemFyIGVzc2EgZXN0cmF0w6lnaWEuIFBvciBleGVtcGxvLCBhcGVzYXIgZGUgc2VyZW0gc2VtZWxoYW50ZXMsIHF1YWwgYSBkaWZlcmVuw6dhIGVudHJlIGVzdGFzIDMgc2VxdcOqbmNpYXMgY29tIGFzIHF1YWlzIGVzdGFtb3MgdHJhYmFsaGFuZG8/IFBvZGVtb3MgcmVzcG9uZGVyIGVzdGEgcGVyZ3VudGEgY29tIHVtIGFsaW5oYW1lbnRvLiBIw6EgZG9pcyB0aXBvcyBwcmluY2lwYWlzIGRlIGFsaW5oYW1lbnRvcywgbyAqKkFsaW5oYW1lbnRvIGxvY2FsKiogZSBvICoqQWxpbmhhbWVudG8gZ2xvYmFsKio6CiAKIC0gKipBbGluaGFtZW50byBHbG9iYWw6KiogRXN0ZSBhbGluaGFtZW50byBjb21wYXJhIGR1YXMgc2VxdcOqbmNpYXMgYmlvbMOzZ2ljYXMgZW0gc3VhIHRvdGFsaWRhZGUsIGRlc2RlIG8gaW7DrWNpbyBhdMOpIG8gZmluYWwuIEVsZSBpZGVudGlmaWNhIGFzIHJlZ2nDtWVzIGNvbnNlcnZhZGFzIGUgYXMgZGlmZXJlbsOnYXMgZW50cmUgYXMgc2VxdcOqbmNpYXMsIGFsaW5oYW5kbyB0b2RvcyBvcyBjYXJhY3RlcmVzIGVtIGFtYm9zIG9zIGNvbmp1bnRvcyBkZSBkYWRvcy4gRXNzZSB0aXBvIGRlIGFsaW5oYW1lbnRvIMOpIMO6dGlsIHF1YW5kbyBhcyBzZXF1w6puY2lhcyB0w6ptIGNvbXByaW1lbnRvcyBzZW1lbGhhbnRlcyBlIHF1YW5kbyBzZSBkZXNlamEgY29tcGFyYXIgYXMgc2VxdcOqbmNpYXMgY29tbyB1bSB0b2RvLiBPIGFsaW5oYW1lbnRvIGdsb2JhbCDDqSBmcmVxdWVudGVtZW50ZSB1c2FkbyBwYXJhIGlkZW50aWZpY2FyIHNpbWlsYXJpZGFkZXMgZW50cmUgcHJvdGXDrW5hcyBvdSBnZW5lcyBkZSBkaWZlcmVudGVzIGVzcMOpY2llcywgbyBxdWUgYWp1ZGEgYSBpbmZlcmlyIHJlbGHDp8O1ZXMgZXZvbHV0aXZhcyBlIGRlc2NvYnJpciBmdW7Dp8O1ZXMgY29uc2VydmFkYXMuCgogCiAtICoqQWxpbmhhbWVudG8gTG9jYWw6KiogRXN0ZSBhbGluaGFtZW50byBjb21wYXJhIGFwZW5hcyBhcyByZWdpw7VlcyBtYWlzIHNlbWVsaGFudGVzIGVudHJlIGFzIHNlcXXDqm5jaWFzIGJpb2zDs2dpY2FzLiBFbSB2ZXogZGUgYWxpbmhhciBhcyBzZXF1w6puY2lhcyBpbnRlaXJhcywgZWxlIGlkZW50aWZpY2Egc3Vic2VxdcOqbmNpYXMgc2VtZWxoYW50ZXMsIGNoYW1hZGFzIGRlIGFsaW5oYW1lbnRvcyBsb2NhaXMsIGRlbnRybyBkYXMgc2VxdcOqbmNpYXMgbWFpb3Jlcy4gRXNzZSB0aXBvIGRlIGFsaW5oYW1lbnRvIMOpIMO6dGlsIHF1YW5kbyBhcyBzZXF1w6puY2lhcyBzw6NvIGRlIGNvbXByaW1lbnRvcyBkaWZlcmVudGVzIG91IHF1YW5kbyBzZSBkZXNlamEgaWRlbnRpZmljYXIgcmVnacO1ZXMgZXNwZWPDrWZpY2FzIGRlIHNpbWlsYXJpZGFkZSwgY29tbyBtb3Rpdm9zIGZ1bmNpb25haXMgb3UgZG9tw61uaW9zIGNvbnNlcnZhZG9zIGVtIHByb3Rlw61uYXMuIE8gYWxpbmhhbWVudG8gbG9jYWwgw6kgZnJlcXVlbnRlbWVudGUgdXNhZG8gcGFyYSBpZGVudGlmaWNhciByZWdpw7VlcyBkZSBob21vbG9naWEgZW0gc2VxdcOqbmNpYXMgZGUgRE5BLCBSTkEgb3UgcHJvdGXDrW5hcywgcGVybWl0aW5kbyBpbmZlcsOqbmNpYXMgc29icmUgZXN0cnV0dXJhIGUgZnVuw6fDo28uIEVzdGUgw6kgbyBhbGluaGFtZW50byB1dGlsaXphZG8gcGVsbyAqKkJMQVNUKiouCiAKIAohW19BbGluaGFtZW50b3MgbG9jYWwgZSBnbG9iYWxfXSgvaG9tZS9oZXJvbi9wcmpjdHMvYmlvaW5mby9taXNjL2FsaW5oYW1lbnRvcy5qcGcpCgoKJm5ic3A7Jm5ic3A7Jm5ic3A7Jm5ic3A7CkFnb3JhIHZhbW9zIGFsaW5oYXIgbm9zc2FzIHNlcXXDqm5jaWFzLiBGYXJlbW9zIGlzc28gY29tIG8gcHJvZ3JhbWEgKipNVVNDTEUqKiwgdW0gYWxpbmhhZG9yIGNsw6Fzc2ljby4gU2V1IG5vbWUgc2lnbmlmaWNhICpNVWx0aXBsZSBTZXF1ZW5jZSBDb21wYXJpc29uIGJ5IExvZy0gRXhwZWN0YXRpb24qLiBFbGUgcG9kZSBzZXIgZW5jb250cmFkbyBlbSB2ZXJzw6NvIF9vbmxpbmVfIFthcXVpXShodHRwczovL3d3dy5lYmkuYWMudWsvVG9vbHMvbXNhL211c2NsZS8pLgoKCj4gRW50ZW5kYSBvIGZ1bmNpb25hbWVudG8gZG8gcHJvZ3JhbWEuIEVtIHNlZ3VpZGEsIGFsaW5oZSBhcyBzZXF1w6puY2lhcyBkbyBhcnF1aXZvIGNvbWJpbmFkbyBxdWUgdm9jw6ogY29uc3RydWl1LgoKYGBge2Jhc2gsIGVjaG89VFJVRSxldmFsPUZBTFNFfQptdXNjbGUgLS1oZWxwCgojIGNvbSBvdXRwdXQgbmEgdGVsYQptdXNjbGUgLWluIH4vJFRVUk1BLyRBTFVOTy9hcnF1aXZvcy9zZXFzL3NlcXMuZmFzdGEgLWNsdwoKIyBjb20gb3V0cHV0IHNhbHZvIGVtIGFycXVpdm8KbXVzY2xlIC1pbiB+LyRUVVJNQS8kQUxVTk8vYXJxdWl2b3Mvc2Vxcy9zZXFzLmZhc3RhIC1jbHcgLW91dCBzZXFzLmFsZ24KCmxzCgpsZXNzIC1TIHNlcXMuYWxnbgoKYGBgCgo+IE9ic2VydmUgbyBhbGluaGFtZW50by4gT25kZSBlc3TDo28gYXMgZGlmZXJlbsOnYXM/CgombmJzcDsmbmJzcDsmbmJzcDsmbmJzcDsKRXN0YSBzZXF1w6puY2lhIMOpIGRlIG51Y2xlb3TDrWRlb3MuIFZvY8OqIGNvbnNlZ3VlIHBlcmNlYmVyIGFsZ3VtYSBkaWZlcmVuw6dhPyBFc3NhcyBzZXF1w6puY2lhcyBnZXJhbSBwcm90ZcOtbmFzIGlndWFpcz8gQ29tbyBzZXJpYSBvIGFsaW5oYW1lbnRvIGNvbSBhIGRlIGFtaW5vw6FjaWRvcz8gVmFtb3MgdHJhZHV6aXI6Cgo+IFRyYWR1emEgYXMgc2VxdWVuY2lhcyBkbyBzZXUgYXJxdWl2byBjb21iaW5hZG8uCgpgYGB7YmFzaCwgZWNobz1UUlVFLGV2YWw9RkFMU0V9CnRyYW5zZXEgIC1zZXF1ZW5jZSB+LyRUVVJNQS8kQUxVTk8vYXJxdWl2b3Mvc2Vxcy9zZXFzLmZhc3RhIC1vdXRzZXEgfi8kVFVSTUEvJEFMVU5PL2FycXVpdm9zL3NlcXMvc2Vxcy5wZXAKCmBgYAoKCj4gQWxpbmhlIGFzIHNlcXXDqm5jaWFzIGRvIGFycXVpdm8gY29tYmluYWRvIHF1ZSB2b2PDqiB0cmFkdXppdSBlbSBhbWlub8OhY2lkb3MuCgpgYGB7YmFzaCwgZWNobz1UUlVFLGV2YWw9RkFMU0V9CgptdXNjbGUgLWluIH4vJFRVUk1BLyRBTFVOTy9hcnF1aXZvcy9zZXFzL3NlcXMucGVwIC1jbHcKCiMgY29tIG91dHB1dCBzYWx2byBlbSBhcnF1aXZvCm11c2NsZSAtaW4gfi8kVFVSTUEvJEFMVU5PL2FycXVpdm9zL3NlcXMvc2Vxcy5wZXAgLWNsdyAtb3V0IHNlcXNfcGVwLmFsZ24KCmxzCgpsZXNzIC1TIHNlcXNfcGVwLmFsZ24KCmBgYAoKPiBPYnNlcnZlIG8gYWxpbmhhbWVudG8uIE8gcXVlIGFzIGRpZmVyZW7Dp2FzIHBvZGVtIHNpZ25pZmljYXIsIGNvbmhlY2VuZG8gYSBvcmlnZW0gZSBhIGZ1bsOnw6NvIGRhIHByb3Rlw61uYXMgcXVlIGVzdGFtb3MgYW5hbGlzYW5kbz8KCioqKgoKPj4+PiBWb2x0YXIgcGFyYSBhIFsqcMOhZ2luYSBpbmljaWFsKl0oaHR0cHM6Ly9oZXJvbm9oLmdpdGh1Yi5pby9iaW9pbmZvKQoKCgoKCgo=