Apresentação
Nesta seção iremos explorar um pouco mais o poder que os commits nos
oferecem, incluindo boas práticas para fazer commits nos nossos arquivos
e como “viajar” entre commits passados e presente. Este momento também
servirá para ficarmos um pouco mais familiarizados com o uso do git
através do terminal. Vamos utilizar o teminal visto que algumas coisas
que faremos aqui não podem ser feitas através do RStudio.
Sempre ao fazer commits vale lembrar essas palavras:
Workflow para os commits
Em primeiro lugar sempre cheque se está tudo certo com seu
repositório, se seu trabalho local está sincronizado com seu trabalho
remoto. Para tanto pode digitar na linha de comando do terminal
Se sua working tree estiver no status clean, quer
dizer que você está sincronizada com o origin
Faça algumas modificações e depois vamos fazer a mesma sequencia de
ações que fizemos anteriormente (stage, commit, push), mas agora usando
a linha de comando. Para tanto podemos fazer assim
git add .
git commit -m "uma mensagem informativa"
git push
Pronto, fizemos a mesma coisa que anteriormente, mas agora utilizando
o terminal :)
Amend
Lembra que muitos commits podem te deixar muito lento na escalada? E
poucos commits podem ser pouco informativos caso queira reconstruir o
que aconteceu com o repositório? Pois então, existe uma estratégia
interessante para realizar commits, chamada de amend
Em um amend nós basicamente adicionamos um commit a um outro já
existente. Por exemplo, imagine que fez apenas algumas poucas
modificações de código que não necessitam necessariamente de um commit
dedicada exclusivamente para tais, você pode fazer o seguinte:
1 - stage o arquivo que modificou
2 - faça um commit
Note que coloquei WIP neste commit, por que? WIP é
uma sigla usada comumente no versionamente para Working In Progress.
Sempre que tiver um commit desse quer dizer que o commit que fez ainda
está sendo trabalhado.
Ainda não faça o push. Faça mais algumas modificações, e, digamos que
agora fez modificações relevantes no código que merecem um commit
dedicado. Mas lembre-se que o último commit é um WIP. O que fazemos
agora é um amend ao WIP
3 - faça um amend
git commit --amend -m "Aqui um commit com uma mensagem informativa, como sempre"
git push
Pronto, agora temos uma mensagem informativa que foi adicionada ao
WIP e não precisamos fazer um push do passo intermediário (WIP),
deixando nossa escalada mais rápida
Viajando entre commits
Uma das maiores potencialidades dos commits é a possibilidade que
podemos navegar entre commits. Ou seja, podemos navegar entre estados
distintos do nosso trabalho a medida que ele é desenvolvido. Podemos
checar esse histórico tanto na nossa página do repositório no GitHub
quanto usando o RStudio, como mostrado na imagem a seguir
Para tanto você precisa apenas abrir a aba do Git no RStudio, como
vimos anteriormente, e clicar em History no canto
superior esquerdo da janela de revisões. Tudo o que vemos são todos os
commits que foram realizados desde que esse repositório foi formado pela
primeira vez.
Elementos importantes do commit
Alguns elementos presentes no commit são importantes. O principal
deles é a chave SHA-1. Esta se trata de um identificador único do
commit. Com ela podemos viajar entre commits, ou referenciar um dado
commit em uma discussão no github. Por exemplo, supondo que estamos
trabalhando colaborativamente (como nesse site :)), e eu gostei
particularmente mais da versão do site que está há alguns commits atrás.
Uma opção é abrir uma Issue (veremos isso mais tarde), e referenciar
esse número. Ou simplesmente dizer para meu colaborador “Hey dê uma
olhada no commit número XXXXXX”. Na imagem abaixo está em destaque a
chave SHA.
Você pode abrir o arquivo no estado em que ele se encontrava em um
dado commit clicando no arquivo modificado naquele commit selecionado.
Por exemplo, digamos que eu queira ver o arquivo chamado
rmarkdown-basics
deste site editado dia 02 de Agosto, só
precisamos clicar no arquivo, como mostrado na imagem abaixo:
Atividade
Explore um pouco os commits que realizaram. Abra a página do github e
também através do Rstudio, veja as diferenças, as vantangens e
desvantagens de cada uma das abordagens
Throwback Commit
Vamos supor que realizamos um commit errado, e agora queremos voltar
ao commit anterior, mas sem perder o trabalho que fizemos nos arquivos.
Para isso podemos usar a abordagem anterior, navegando entre os arquivos
e selecionando o arquivo que queremos em um determinado estado,
substituimos pelo arquivo atual e fazemos um novo commit. Esta opção
pode ser a mais segura se estamos começando a mexer no versionamento.
Outra opção é explorar as funções do git chamadas reset
. As
funções reset basicamente move o HEAD do seu diretório para um commit no
passado. Esta abordagem pode causar algumas dores de cabeça no início,
portanto recomendo usa-lá com cautela. Para mais informações sobre isso
dê uma olhada nesse
site.)
LS0tDQp0aXRsZTogJ0V4cGxvcmFuZG8gbWVsaG9yIG9zIGNvbW1pdHMnDQphdXRob3I6ICJHYWJyaWVsIE5ha2FtdXJhIg0KZGF0ZTogImByIFN5cy5EYXRlKClgIg0Kb3V0cHV0OiBodG1sX2RvY3VtZW50DQotLS0NCg0KYGBge3Igc2V0dXAsIGluY2x1ZGU9RkFMU0V9DQprbml0cjo6b3B0c19jaHVuayRzZXQoZWNobyA9IFRSVUUsIGZpZy5hbGlnbiA9ICJjZW50ZXIiKQ0KYGBgDQoNCmBgYHtyIGtsaXBweSwgZWNobz1GQUxTRSwgaW5jbHVkZT1UUlVFfQ0Ka2xpcHB5OjprbGlwcHkoKQ0KYGBgDQoNCiMgQXByZXNlbnRhw6fDo28NCg0KTmVzdGEgc2XDp8OjbyBpcmVtb3MgZXhwbG9yYXIgdW0gcG91Y28gbWFpcyBvIHBvZGVyIHF1ZSBvcyBjb21taXRzIG5vcyBvZmVyZWNlbSwgaW5jbHVpbmRvIGJvYXMgcHLDoXRpY2FzIHBhcmEgZmF6ZXIgY29tbWl0cyBub3Mgbm9zc29zIGFycXVpdm9zIGUgY29tbyAidmlhamFyIiBlbnRyZSBjb21taXRzIHBhc3NhZG9zIGUgcHJlc2VudGUuIEVzdGUgbW9tZW50byB0YW1iw6ltIHNlcnZpcsOhIHBhcmEgZmljYXJtb3MgdW0gcG91Y28gbWFpcyBmYW1pbGlhcml6YWRvcyBjb20gbyB1c28gZG8gZ2l0IGF0cmF2w6lzIGRvIHRlcm1pbmFsLiBWYW1vcyB1dGlsaXphciBvIHRlbWluYWwgdmlzdG8gcXVlIGFsZ3VtYXMgY29pc2FzIHF1ZSBmYXJlbW9zIGFxdWkgbsOjbyBwb2RlbSBzZXIgZmVpdGFzIGF0cmF2w6lzIGRvIFJTdHVkaW8uDQoNClNlbXByZSBhbyBmYXplciBjb21taXRzIHZhbGUgbGVtYnJhciBlc3NhcyBwYWxhdnJhczoNCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFLG91dC53aWR0aD0iNzAlIn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImZpZ3MiLCAiY29tbWl0LXNhZmUucG5nIikpDQpgYGANCg0KIyBXb3JrZmxvdyBwYXJhIG9zIGNvbW1pdHMgDQoNCkVtIHByaW1laXJvIGx1Z2FyIHNlbXByZSBjaGVxdWUgc2UgZXN0w6EgdHVkbyBjZXJ0byBjb20gc2V1IHJlcG9zaXTDs3Jpbywgc2Ugc2V1IHRyYWJhbGhvIGxvY2FsIGVzdMOhIHNpbmNyb25pemFkbyBjb20gc2V1IHRyYWJhbGhvIHJlbW90by4gUGFyYSB0YW50byBwb2RlIGRpZ2l0YXIgbmEgbGluaGEgZGUgY29tYW5kbyBkbyB0ZXJtaW5hbA0KDQpgYGB7ciBlY2hvPVQsZXZhbD1GQUxTRX0NCmdpdCBzdGF0dXMNCmBgYA0KDQpTZSBzdWEgKndvcmtpbmcgdHJlZSogZXN0aXZlciBubyBzdGF0dXMgKmNsZWFuKiwgcXVlciBkaXplciBxdWUgdm9jw6ogZXN0w6Egc2luY3Jvbml6YWRhIGNvbSBvICpvcmlnaW4qDQoNCkZhw6dhIGFsZ3VtYXMgbW9kaWZpY2HDp8O1ZXMgZSBkZXBvaXMgdmFtb3MgZmF6ZXIgYSBtZXNtYSBzZXF1ZW5jaWEgZGUgYcOnw7VlcyBxdWUgZml6ZW1vcyBhbnRlcmlvcm1lbnRlIChzdGFnZSwgY29tbWl0LCBwdXNoKSwgbWFzIGFnb3JhIHVzYW5kbyBhIGxpbmhhIGRlIGNvbWFuZG8uIFBhcmEgdGFudG8gcG9kZW1vcyBmYXplciBhc3NpbQ0KDQpgYGB7ciBlY2hvPVRSVUUsZXZhbD1GQUxTRX0NCmdpdCBhZGQgLg0KZ2l0IGNvbW1pdCAtbSAidW1hIG1lbnNhZ2VtIGluZm9ybWF0aXZhIg0KZ2l0IHB1c2gNCmBgYA0KDQpQcm9udG8sIGZpemVtb3MgYSBtZXNtYSBjb2lzYSBxdWUgYW50ZXJpb3JtZW50ZSwgbWFzIGFnb3JhIHV0aWxpemFuZG8gbyB0ZXJtaW5hbCA6KQ0KDQojIyBBbWVuZA0KDQpMZW1icmEgcXVlIG11aXRvcyBjb21taXRzIHBvZGVtIHRlIGRlaXhhciBtdWl0byBsZW50byBuYSBlc2NhbGFkYT8gRSBwb3Vjb3MgY29tbWl0cyBwb2RlbSBzZXIgcG91Y28gaW5mb3JtYXRpdm9zIGNhc28gcXVlaXJhIHJlY29uc3RydWlyIG8gcXVlIGFjb250ZWNldSBjb20gbyByZXBvc2l0w7NyaW8/IFBvaXMgZW50w6NvLCBleGlzdGUgdW1hIGVzdHJhdMOpZ2lhIGludGVyZXNzYW50ZSBwYXJhIHJlYWxpemFyIGNvbW1pdHMsIGNoYW1hZGEgZGUgYGFtZW5kYA0KDQpFbSB1bSBhbWVuZCBuw7NzIGJhc2ljYW1lbnRlIGFkaWNpb25hbW9zIHVtIGNvbW1pdCBhIHVtIG91dHJvIGrDoSBleGlzdGVudGUuIFBvciBleGVtcGxvLCBpbWFnaW5lIHF1ZSBmZXogYXBlbmFzIGFsZ3VtYXMgcG91Y2FzIG1vZGlmaWNhw6fDtWVzIGRlIGPDs2RpZ28gcXVlIG7Do28gbmVjZXNzaXRhbSBuZWNlc3NhcmlhbWVudGUgZGUgdW0gY29tbWl0IGRlZGljYWRhIGV4Y2x1c2l2YW1lbnRlIHBhcmEgdGFpcywgdm9jw6ogcG9kZSBmYXplciBvIHNlZ3VpbnRlOg0KDQoxIC0gc3RhZ2UgbyBhcnF1aXZvIHF1ZSBtb2RpZmljb3UNCg0KYGBge3IgZWNobz1UUlVFLGV2YWw9RkFMU0V9DQpnaXQgYWRkIHBhdGgvdG8vZmlsZQ0KYGBgDQoNCjIgLSBmYcOnYSB1bSBjb21taXQgDQoNCmBgYHtyIGVjaG89VFJVRSxldmFsPUZBTFNFfQ0KZ2l0IGNvbW1pdCAtbSAiV0lQIg0KYGBgDQoNCk5vdGUgcXVlIGNvbG9xdWVpICoqV0lQKiogbmVzdGUgY29tbWl0LCBwb3IgcXVlPyBXSVAgw6kgdW1hIHNpZ2xhIHVzYWRhIGNvbXVtZW50ZSBubyB2ZXJzaW9uYW1lbnRlIHBhcmEgV29ya2luZyBJbiBQcm9ncmVzcy4gU2VtcHJlIHF1ZSB0aXZlciB1bSBjb21taXQgZGVzc2UgcXVlciBkaXplciBxdWUgbyBjb21taXQgcXVlIGZleiBhaW5kYSBlc3TDoSBzZW5kbyB0cmFiYWxoYWRvLg0KDQpBaW5kYSBuw6NvIGZhw6dhIG8gcHVzaC4gRmHDp2EgbWFpcyBhbGd1bWFzIG1vZGlmaWNhw6fDtWVzLCBlLCBkaWdhbW9zIHF1ZSBhZ29yYSBmZXogbW9kaWZpY2HDp8O1ZXMgcmVsZXZhbnRlcyBubyBjw7NkaWdvIHF1ZSBtZXJlY2VtIHVtIGNvbW1pdCBkZWRpY2Fkby4gTWFzIGxlbWJyZS1zZSBxdWUgbyDDumx0aW1vIGNvbW1pdCDDqSB1bSBXSVAuIE8gcXVlIGZhemVtb3MgYWdvcmEgw6kgdW0gYW1lbmQgYW8gV0lQDQoNCjMgLSBmYcOnYSB1bSBhbWVuZA0KDQpgYGB7ciBlY2hvPVRSVUUsZXZhbD1GQUxTRX0NCmdpdCBjb21taXQgLS1hbWVuZCAtbSAiQXF1aSB1bSBjb21taXQgY29tIHVtYSBtZW5zYWdlbSBpbmZvcm1hdGl2YSwgY29tbyBzZW1wcmUiDQpnaXQgcHVzaA0KYGBgDQoNClByb250bywgYWdvcmEgdGVtb3MgdW1hIG1lbnNhZ2VtIGluZm9ybWF0aXZhIHF1ZSBmb2kgYWRpY2lvbmFkYSBhbyBXSVAgZSBuw6NvIHByZWNpc2Ftb3MgZmF6ZXIgdW0gcHVzaCBkbyBwYXNzbyBpbnRlcm1lZGnDoXJpbyAoV0lQKSwgZGVpeGFuZG8gbm9zc2EgZXNjYWxhZGEgbWFpcyByw6FwaWRhDQoNCiMjIFZpYWphbmRvIGVudHJlIGNvbW1pdHMNCg0KVW1hIGRhcyBtYWlvcmVzIHBvdGVuY2lhbGlkYWRlcyBkb3MgY29tbWl0cyDDqSBhIHBvc3NpYmlsaWRhZGUgcXVlIHBvZGVtb3MgbmF2ZWdhciBlbnRyZSBjb21taXRzLiBPdSBzZWphLCBwb2RlbW9zIG5hdmVnYXIgZW50cmUgZXN0YWRvcyBkaXN0aW50b3MgZG8gbm9zc28gdHJhYmFsaG8gYSBtZWRpZGEgcXVlIGVsZSDDqSBkZXNlbnZvbHZpZG8uIFBvZGVtb3MgY2hlY2FyIGVzc2UgaGlzdMOzcmljbyB0YW50byBuYSBub3NzYSBww6FnaW5hIGRvIHJlcG9zaXTDs3JpbyBubyBHaXRIdWIgcXVhbnRvIHVzYW5kbyBvIFJTdHVkaW8sIGNvbW8gbW9zdHJhZG8gbmEgaW1hZ2VtIGEgc2VndWlyDQoNCmBgYHtyIGVjaG89RkFMU0UsIGV2YWw9VFJVRSxvdXQud2lkdGg9IjcwJSJ9DQprbml0cjo6aW5jbHVkZV9ncmFwaGljcyhoZXJlOjpoZXJlKCJmaWdzIiwgImdpdGh1Yi1oaXN0b3J5LnBuZyIpKQ0KYGBgDQoNClBhcmEgdGFudG8gdm9jw6ogcHJlY2lzYSBhcGVuYXMgYWJyaXIgYSBhYmEgZG8gR2l0IG5vIFJTdHVkaW8sIGNvbW8gdmltb3MgYW50ZXJpb3JtZW50ZSwgZSBjbGljYXIgZW0gKipIaXN0b3J5Kiogbm8gY2FudG8gc3VwZXJpb3IgZXNxdWVyZG8gZGEgamFuZWxhIGRlIHJldmlzw7Vlcy4gVHVkbyBvIHF1ZSB2ZW1vcyBzw6NvIHRvZG9zIG9zIGNvbW1pdHMgcXVlIGZvcmFtIHJlYWxpemFkb3MgZGVzZGUgcXVlIGVzc2UgcmVwb3NpdMOzcmlvIGZvaSBmb3JtYWRvIHBlbGEgcHJpbWVpcmEgdmV6Lg0KDQojIyBFbGVtZW50b3MgaW1wb3J0YW50ZXMgZG8gY29tbWl0DQoNCkFsZ3VucyBlbGVtZW50b3MgcHJlc2VudGVzIG5vIGNvbW1pdCBzw6NvIGltcG9ydGFudGVzLiBPIHByaW5jaXBhbCBkZWxlcyDDqSBhIGNoYXZlIFNIQS0xLiBFc3RhIHNlIHRyYXRhIGRlIHVtIGlkZW50aWZpY2Fkb3Igw7puaWNvIGRvIGNvbW1pdC4gQ29tIGVsYSBwb2RlbW9zIHZpYWphciBlbnRyZSBjb21taXRzLCBvdSByZWZlcmVuY2lhciB1bSBkYWRvIGNvbW1pdCBlbSB1bWEgZGlzY3Vzc8OjbyBubyBnaXRodWIuIFBvciBleGVtcGxvLCBzdXBvbmRvIHF1ZSBlc3RhbW9zIHRyYWJhbGhhbmRvIGNvbGFib3JhdGl2YW1lbnRlIChjb21vIG5lc3NlIHNpdGUgOikpLCBlIGV1IGdvc3RlaSBwYXJ0aWN1bGFybWVudGUgbWFpcyBkYSB2ZXJzw6NvIGRvIHNpdGUgcXVlIGVzdMOhIGjDoSBhbGd1bnMgY29tbWl0cyBhdHLDoXMuIFVtYSBvcMOnw6NvIMOpIGFicmlyIHVtYSBJc3N1ZSAodmVyZW1vcyBpc3NvIG1haXMgdGFyZGUpLCBlIHJlZmVyZW5jaWFyIGVzc2UgbsO6bWVyby4gT3Ugc2ltcGxlc21lbnRlIGRpemVyIHBhcmEgbWV1IGNvbGFib3JhZG9yICJIZXkgZMOqIHVtYSBvbGhhZGEgbm8gY29tbWl0IG7Dum1lcm8gWFhYWFhYIi4gTmEgaW1hZ2VtIGFiYWl4byBlc3TDoSBlbSBkZXN0YXF1ZSBhIGNoYXZlIFNIQS4NCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFLG91dC53aWR0aD0iNzAlIn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImZpZ3MiLCAiZ2l0LXNoYS1rZXkucG5nIikpDQpgYGANCg0KVm9jw6ogcG9kZSBhYnJpciBvIGFycXVpdm8gbm8gZXN0YWRvIGVtIHF1ZSBlbGUgc2UgZW5jb250cmF2YSBlbSB1bSBkYWRvIGNvbW1pdCBjbGljYW5kbyBubyBhcnF1aXZvIG1vZGlmaWNhZG8gbmFxdWVsZSBjb21taXQgc2VsZWNpb25hZG8uIFBvciBleGVtcGxvLCBkaWdhbW9zIHF1ZSBldSBxdWVpcmEgdmVyIG8gYXJxdWl2byBjaGFtYWRvIGBybWFya2Rvd24tYmFzaWNzYCBkZXN0ZSBzaXRlIGVkaXRhZG8gZGlhIDAyIGRlIEFnb3N0bywgc8OzIHByZWNpc2Ftb3MgY2xpY2FyIG5vIGFycXVpdm8sIGNvbW8gbW9zdHJhZG8gbmEgaW1hZ2VtIGFiYWl4bzoNCg0KYGBge3IgZWNobz1GQUxTRSwgZXZhbD1UUlVFLG91dC53aWR0aD0iNzAlIn0NCmtuaXRyOjppbmNsdWRlX2dyYXBoaWNzKGhlcmU6OmhlcmUoImZpZ3MiLCAiZ2l0LWhpc3RvcnktZmlsZS5wbmciKSkNCmBgYA0KDQojIyBBdGl2aWRhZGUNCg0KRXhwbG9yZSB1bSBwb3VjbyBvcyBjb21taXRzIHF1ZSByZWFsaXphcmFtLiBBYnJhIGEgcMOhZ2luYSBkbyBnaXRodWIgZSB0YW1iw6ltIGF0cmF2w6lzIGRvIFJzdHVkaW8sIHZlamEgYXMgZGlmZXJlbsOnYXMsIGFzIHZhbnRhbmdlbnMgZSBkZXN2YW50YWdlbnMgZGUgY2FkYSB1bWEgZGFzIGFib3JkYWdlbnMNCg0KDQojIyBUaHJvd2JhY2sgQ29tbWl0DQoNClZhbW9zIHN1cG9yIHF1ZSByZWFsaXphbW9zIHVtIGNvbW1pdCBlcnJhZG8sIGUgYWdvcmEgcXVlcmVtb3Mgdm9sdGFyIGFvIGNvbW1pdCBhbnRlcmlvciwgbWFzIHNlbSBwZXJkZXIgbyB0cmFiYWxobyBxdWUgZml6ZW1vcyBub3MgYXJxdWl2b3MuIFBhcmEgaXNzbyBwb2RlbW9zIHVzYXIgYSBhYm9yZGFnZW0gYW50ZXJpb3IsIG5hdmVnYW5kbyBlbnRyZSBvcyBhcnF1aXZvcyBlIHNlbGVjaW9uYW5kbyBvIGFycXVpdm8gcXVlIHF1ZXJlbW9zIGVtIHVtIGRldGVybWluYWRvIGVzdGFkbywgc3Vic3RpdHVpbW9zIHBlbG8gYXJxdWl2byBhdHVhbCBlIGZhemVtb3MgdW0gbm92byBjb21taXQuIEVzdGEgb3DDp8OjbyBwb2RlIHNlciBhIG1haXMgc2VndXJhIHNlIGVzdGFtb3MgY29tZcOnYW5kbyBhIG1leGVyIG5vIHZlcnNpb25hbWVudG8uIE91dHJhIG9ww6fDo28gw6kgZXhwbG9yYXIgYXMgZnVuw6fDtWVzIGRvIGdpdCBjaGFtYWRhcyBgcmVzZXRgLiBBcyBmdW7Dp8O1ZXMgcmVzZXQgYmFzaWNhbWVudGUgbW92ZSBvIEhFQUQgZG8gc2V1IGRpcmV0w7NyaW8gcGFyYSB1bSBjb21taXQgbm8gcGFzc2Fkby4gRXN0YSBhYm9yZGFnZW0gcG9kZSBjYXVzYXIgYWxndW1hcyBkb3JlcyBkZSBjYWJlw6dhIG5vIGluw61jaW8sIHBvcnRhbnRvIHJlY29tZW5kbyB1c2EtbMOhIGNvbSBjYXV0ZWxhLiBQYXJhIG1haXMgaW5mb3JtYcOnw7VlcyBzb2JyZSBpc3NvIGTDqiB1bWEgb2xoYWRhIFtuZXNzZSBzaXRlXShodHRwczovL2RldmNvbm5lY3RlZC5jb20vaG93LXRvLWdpdC1yZXNldC10by1oZWFkLyM6fjp0ZXh0PVRvJTIwaGFyZCUyMHJlc2V0JTIwZmlsZXMlMjB0byxvcHRpb24lMjBhbmQlMjBzcGVjaWZ5JTIwdGhlJTIwSEVBRC4mdGV4dD1UaGUlMjBwdXJwb3NlJTIwb2YlMjB0aGUlMjAlRTIlODAlOUNnaXQsYmVmb3JlJTIwSEVBRCUyMGFuZCUyMHNvJTIwb24pLikNCg0KDQojIEludXRpbGlkYWRlcyBww7pibGljYXMgbmVjZXNzw6FyaWFzDQoNCk5vIGZpbSBkbyBkaWEsIGFwcmVuZGVtb3MgZmF6ZXIgY29tbWl0cyBhcGVuYXMgcGFyYSB1dGlsaXphciBlc3NhIGZlcnJhbWVudGEgW2FxdWldKGh0dHBzOi8vc3RhcmxvZ3MuZGV2LykuIENvbGUgbyBsaW5rIGRlIHNldSByZXBvc2l0w7NyaW8gY29udGVuZG8gYWxndW5zIGNvbW1pdHMgZSB2ZWphIG8gcXVlIGFjb250ZWNlDQoNCg==