Should we replace our merge tools?
Autor(a) principal: | |
---|---|
Data de Publicação: | 2019 |
Tipo de documento: | Tese |
Idioma: | eng |
Título da fonte: | Repositório Institucional da UFPE |
dARK ID: | ark:/64986/0013000010nqk |
Texto Completo: | https://repositorio.ufpe.br/handle/123456789/35862 |
Resumo: | Merge conflicts often occur when developers concurrently change the same code artifacts. While state of practice unstructured merge tools (e.g git merge) try to automatically resolve merge conflicts based on textual similarity, semistructured and structured merge tools try to go further by exploiting the syntactic structure and semantics of the involved artifacts. Previous studies compare semistructured and structured merge with unstructured merge concerning the number of reported conflicts, showing, for most projects and merge situations, a reduction in favor of semistructured and structured merge. This evidence, however, might not be sufficient to justify industrial adoption of advanced merge strategies such as semistructured and structured merge. The problem is that previous studies do not investigate whether the observed reduction on the number of reported conflicts actually leads to integration effort reduction (Productivity) without negative impact on the correctness of the merging process (Quality). Besides, it is unknown how semistructured merge compares with structured merge. So, to decide whether we should replace our state of practice unstructured merge tools, we need to compare these merge strategies and understand their differences. We then first compare unstructured and semistructured merge. Our results and complementary analysis indicate that the number of false positives is significantly reduced when using semistructured merge when compared to unstructured merge. However, we find no evidence that semistructured merge leads to fewer false negatives. Driven by these findings, we implement an improved semistructured merge tool that further combines both approaches to reduce the false positives and false negatives of semistructured merge. Semistructured merge has shown significant advantages over unstructured merge, especially as implemented by our improved tool. However, before deciding to replace unstructured tools by semistructured merge, we need to investigate whether structured merge is a better alternative than semistructured merge. So, we compare semistructured and structured merge. Our results show that semistructured and structured merge differ on 24% of the scenarios with conflicts. Semistructured merge reports more false positives, whereas structured merge has more false negatives. Finally, we observe that adapting a semistructured merge tool to resolve a particular kind of conflict makes semistructured and structured merge even closer. Overall, our findings suggests that semistructured merge is a better replacement of unstructured tools for conservative developers, having significant gains with a closer behavior to unstructured tools than structured merge. Besides that, practitioners might be reluctant to adopt structured merge because of the observed performance overhead and its tendency to false negatives. So, when choosing between semistructured and structured merge, semistructured merge would be a better match for developers that are not overly concerned with semistructured extra false positives. |
id |
UFPE_ef223255647b0707b2a0c3f1227b9975 |
---|---|
oai_identifier_str |
oai:repositorio.ufpe.br:123456789/35862 |
network_acronym_str |
UFPE |
network_name_str |
Repositório Institucional da UFPE |
repository_id_str |
2221 |
spelling |
CAVALCANTI, Guilherme José de Carvalhohttp://lattes.cnpq.br/2569037604960951http://lattes.cnpq.br/9395715443254344BORBA, Paulo Henrique Monteiro2019-12-18T19:30:51Z2019-12-18T19:30:51Z2019-10-02CAVALCANTI, José de Carvalho. Should we replace our merge tools?. 2019. Tese (Doutorado em Ciência da Computação) – Universidade Federal de Pernambuco, Recife, 2019.https://repositorio.ufpe.br/handle/123456789/35862ark:/64986/0013000010nqkMerge conflicts often occur when developers concurrently change the same code artifacts. While state of practice unstructured merge tools (e.g git merge) try to automatically resolve merge conflicts based on textual similarity, semistructured and structured merge tools try to go further by exploiting the syntactic structure and semantics of the involved artifacts. Previous studies compare semistructured and structured merge with unstructured merge concerning the number of reported conflicts, showing, for most projects and merge situations, a reduction in favor of semistructured and structured merge. This evidence, however, might not be sufficient to justify industrial adoption of advanced merge strategies such as semistructured and structured merge. The problem is that previous studies do not investigate whether the observed reduction on the number of reported conflicts actually leads to integration effort reduction (Productivity) without negative impact on the correctness of the merging process (Quality). Besides, it is unknown how semistructured merge compares with structured merge. So, to decide whether we should replace our state of practice unstructured merge tools, we need to compare these merge strategies and understand their differences. We then first compare unstructured and semistructured merge. Our results and complementary analysis indicate that the number of false positives is significantly reduced when using semistructured merge when compared to unstructured merge. However, we find no evidence that semistructured merge leads to fewer false negatives. Driven by these findings, we implement an improved semistructured merge tool that further combines both approaches to reduce the false positives and false negatives of semistructured merge. Semistructured merge has shown significant advantages over unstructured merge, especially as implemented by our improved tool. However, before deciding to replace unstructured tools by semistructured merge, we need to investigate whether structured merge is a better alternative than semistructured merge. So, we compare semistructured and structured merge. Our results show that semistructured and structured merge differ on 24% of the scenarios with conflicts. Semistructured merge reports more false positives, whereas structured merge has more false negatives. Finally, we observe that adapting a semistructured merge tool to resolve a particular kind of conflict makes semistructured and structured merge even closer. Overall, our findings suggests that semistructured merge is a better replacement of unstructured tools for conservative developers, having significant gains with a closer behavior to unstructured tools than structured merge. Besides that, practitioners might be reluctant to adopt structured merge because of the observed performance overhead and its tendency to false negatives. So, when choosing between semistructured and structured merge, semistructured merge would be a better match for developers that are not overly concerned with semistructured extra false positives.FACEPEConflitos de integração frequentemente ocorrem quando os desenvolvedores alteram simultaneamente os mesmos artefatos de código. Enquanto que as ferramentas de integração não-estruturadas, que representam o estado da prática (por exemplo, git merge), tentam resolver conflitos automaticamente, baseadas em semelhança textual, as ferramentas de integração semiestruturada e estruturada tentam ir além explorando a estrutura sintática e a semântica dos artefatos envolvidos. Estudos anteriores comparam as estratégias semiestruturada e estruturada com a não-estruturada em relação ao número de conflitos reportados, mostrando, para a maioria dos projetos e situações de integração, uma redução a favor das estratégias semiestruturada e estruturada. O problema desses estudos anteriores é que eles não investigam se a redução observada no número de conflitos realmente leva à redução do esforço de integração (Produtividade) sem impacto negativo na corretude do processo de integração (Qualidade). Além disso, não se sabe como a estratégia semiestruturada se compara com a estruturada. Para ajudar os desenvolvedores a decidir que tipo de ferramenta usar e entender melhor suas diferenças, conduzimos dois estudos empíricos. No primeiro, comparamos a integração não-estruturada e a semiestruturada. Nossos resultados e análises complementares indicam que o número de falsos positivos é significativamente reduzido ao usar a estratégia semiestruturada quando comparado à não-estruturada. No entanto, nós não encontramos evidências de que a integração semiestruturada leva a menos falsos negativos. Motivados por essas descobertas, implementamos uma ferramenta de integração semiestruturada que combina ainda mais as duas estratégias para reduzir os falsos positivos e os falsos negativos da integração semiestruturada. No segundo estudo, comparamos as integrações semiestruturada e estruturada. Nossos resultados mostram que as integrações semiestruturada e estruturada diferem em 24% dos cenários com conflitos. A estratégia semiestruturada reporta mais falsos positivos, enquanto a estruturada tem mais falsos negativos. Finalmente, observamos que adaptar uma ferramenta semiestruturada para resolver um determinado tipo de conflito torna-a ainda mais próxima à integração estruturada. No geral, nossas descobertas sugerem que a estratégia semiestruturada é uma melhor alternativa à não-estruturada para desenvolvedores conservadores, possuindo ganhos significativos com um comportamento mais próximo ao das ferramentas nãoestruturadas do que ferramentas estruturadas. Além disso, os usuários podem relutar em adotar a estratégia estruturada por causa do seu impacto no desempenho e sua tendência a falsos negativos. Dessa forma, a estratégia semiestruturada seria mais apropriada para desenvolvedores que não são muito preocupados com seus falsos positivos extras.engUniversidade Federal de PernambucoPrograma de Pos Graduacao em Ciencia da ComputacaoUFPEBrasilAttribution-NonCommercial-NoDerivs 3.0 Brazilhttp://creativecommons.org/licenses/by-nc-nd/3.0/br/info:eu-repo/semantics/openAccessEngenharia de SoftwareIntegração de SoftwareDesenvolvimento colaborativoSistema de controle de versõesShould we replace our merge tools?info:eu-repo/semantics/publishedVersioninfo:eu-repo/semantics/doctoralThesisdoutoradoreponame:Repositório Institucional da UFPEinstname:Universidade Federal de Pernambuco (UFPE)instacron:UFPETEXTTESE Guilherme José de Carvalho Cavalcanti.pdf.txtTESE Guilherme José de Carvalho Cavalcanti.pdf.txtExtracted texttext/plain220740https://repositorio.ufpe.br/bitstream/123456789/35862/4/TESE%20Guilherme%20Jos%c3%a9%20de%20Carvalho%20Cavalcanti.pdf.txtfab3c8fb6ed04871bc11025863d69d74MD54THUMBNAILTESE Guilherme José de Carvalho Cavalcanti.pdf.jpgTESE Guilherme José de Carvalho Cavalcanti.pdf.jpgGenerated Thumbnailimage/jpeg1201https://repositorio.ufpe.br/bitstream/123456789/35862/5/TESE%20Guilherme%20Jos%c3%a9%20de%20Carvalho%20Cavalcanti.pdf.jpg9cd12b9c3cd19bf7f510179a78238119MD55ORIGINALTESE Guilherme José de Carvalho Cavalcanti.pdfTESE Guilherme José de Carvalho Cavalcanti.pdfapplication/pdf1727473https://repositorio.ufpe.br/bitstream/123456789/35862/1/TESE%20Guilherme%20Jos%c3%a9%20de%20Carvalho%20Cavalcanti.pdfc22a3747de18033329f50f7c783a4f70MD51CC-LICENSElicense_rdflicense_rdfapplication/rdf+xml; charset=utf-8811https://repositorio.ufpe.br/bitstream/123456789/35862/2/license_rdfe39d27027a6cc9cb039ad269a5db8e34MD52LICENSElicense.txtlicense.txttext/plain; charset=utf-82310https://repositorio.ufpe.br/bitstream/123456789/35862/3/license.txtbd573a5ca8288eb7272482765f819534MD53123456789/358622019-12-19 02:16:12.888oai:repositorio.ufpe.br:123456789/35862TGljZW7Dp2EgZGUgRGlzdHJpYnVpw6fDo28gTsOjbyBFeGNsdXNpdmEKClRvZG8gZGVwb3NpdGFudGUgZGUgbWF0ZXJpYWwgbm8gUmVwb3NpdMOzcmlvIEluc3RpdHVjaW9uYWwgKFJJKSBkZXZlIGNvbmNlZGVyLCDDoCBVbml2ZXJzaWRhZGUgRmVkZXJhbCBkZSBQZXJuYW1idWNvIChVRlBFKSwgdW1hIExpY2Vuw6dhIGRlIERpc3RyaWJ1acOnw6NvIE7Do28gRXhjbHVzaXZhIHBhcmEgbWFudGVyIGUgdG9ybmFyIGFjZXNzw612ZWlzIG9zIHNldXMgZG9jdW1lbnRvcywgZW0gZm9ybWF0byBkaWdpdGFsLCBuZXN0ZSByZXBvc2l0w7NyaW8uCgpDb20gYSBjb25jZXNzw6NvIGRlc3RhIGxpY2Vuw6dhIG7Do28gZXhjbHVzaXZhLCBvIGRlcG9zaXRhbnRlIG1hbnTDqW0gdG9kb3Mgb3MgZGlyZWl0b3MgZGUgYXV0b3IuCl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKTGljZW7Dp2EgZGUgRGlzdHJpYnVpw6fDo28gTsOjbyBFeGNsdXNpdmEKCkFvIGNvbmNvcmRhciBjb20gZXN0YSBsaWNlbsOnYSBlIGFjZWl0w6EtbGEsIHZvY8OqIChhdXRvciBvdSBkZXRlbnRvciBkb3MgZGlyZWl0b3MgYXV0b3JhaXMpOgoKYSkgRGVjbGFyYSBxdWUgY29uaGVjZSBhIHBvbMOtdGljYSBkZSBjb3B5cmlnaHQgZGEgZWRpdG9yYSBkbyBzZXUgZG9jdW1lbnRvOwpiKSBEZWNsYXJhIHF1ZSBjb25oZWNlIGUgYWNlaXRhIGFzIERpcmV0cml6ZXMgcGFyYSBvIFJlcG9zaXTDs3JpbyBJbnN0aXR1Y2lvbmFsIGRhIFVGUEU7CmMpIENvbmNlZGUgw6AgVUZQRSBvIGRpcmVpdG8gbsOjbyBleGNsdXNpdm8gZGUgYXJxdWl2YXIsIHJlcHJvZHV6aXIsIGNvbnZlcnRlciAoY29tbyBkZWZpbmlkbyBhIHNlZ3VpciksIGNvbXVuaWNhciBlL291IGRpc3RyaWJ1aXIsIG5vIFJJLCBvIGRvY3VtZW50byBlbnRyZWd1ZSAoaW5jbHVpbmRvIG8gcmVzdW1vL2Fic3RyYWN0KSBlbSBmb3JtYXRvIGRpZ2l0YWwgb3UgcG9yIG91dHJvIG1laW87CmQpIERlY2xhcmEgcXVlIGF1dG9yaXphIGEgVUZQRSBhIGFycXVpdmFyIG1haXMgZGUgdW1hIGPDs3BpYSBkZXN0ZSBkb2N1bWVudG8gZSBjb252ZXJ0w6otbG8sIHNlbSBhbHRlcmFyIG8gc2V1IGNvbnRlw7pkbywgcGFyYSBxdWFscXVlciBmb3JtYXRvIGRlIGZpY2hlaXJvLCBtZWlvIG91IHN1cG9ydGUsIHBhcmEgZWZlaXRvcyBkZSBzZWd1cmFuw6dhLCBwcmVzZXJ2YcOnw6NvIChiYWNrdXApIGUgYWNlc3NvOwplKSBEZWNsYXJhIHF1ZSBvIGRvY3VtZW50byBzdWJtZXRpZG8gw6kgbyBzZXUgdHJhYmFsaG8gb3JpZ2luYWwgZSBxdWUgZGV0w6ltIG8gZGlyZWl0byBkZSBjb25jZWRlciBhIHRlcmNlaXJvcyBvcyBkaXJlaXRvcyBjb250aWRvcyBuZXN0YSBsaWNlbsOnYS4gRGVjbGFyYSB0YW1iw6ltIHF1ZSBhIGVudHJlZ2EgZG8gZG9jdW1lbnRvIG7Do28gaW5mcmluZ2Ugb3MgZGlyZWl0b3MgZGUgb3V0cmEgcGVzc29hIG91IGVudGlkYWRlOwpmKSBEZWNsYXJhIHF1ZSwgbm8gY2FzbyBkbyBkb2N1bWVudG8gc3VibWV0aWRvIGNvbnRlciBtYXRlcmlhbCBkbyBxdWFsIG7Do28gZGV0w6ltIG9zIGRpcmVpdG9zIGRlCmF1dG9yLCBvYnRldmUgYSBhdXRvcml6YcOnw6NvIGlycmVzdHJpdGEgZG8gcmVzcGVjdGl2byBkZXRlbnRvciBkZXNzZXMgZGlyZWl0b3MgcGFyYSBjZWRlciDDoApVRlBFIG9zIGRpcmVpdG9zIHJlcXVlcmlkb3MgcG9yIGVzdGEgTGljZW7Dp2EgZSBhdXRvcml6YXIgYSB1bml2ZXJzaWRhZGUgYSB1dGlsaXrDoS1sb3MgbGVnYWxtZW50ZS4gRGVjbGFyYSB0YW1iw6ltIHF1ZSBlc3NlIG1hdGVyaWFsIGN1am9zIGRpcmVpdG9zIHPDo28gZGUgdGVyY2Vpcm9zIGVzdMOhIGNsYXJhbWVudGUgaWRlbnRpZmljYWRvIGUgcmVjb25oZWNpZG8gbm8gdGV4dG8gb3UgY29udGXDumRvIGRvIGRvY3VtZW50byBlbnRyZWd1ZTsKZykgU2UgbyBkb2N1bWVudG8gZW50cmVndWUgw6kgYmFzZWFkbyBlbSB0cmFiYWxobyBmaW5hbmNpYWRvIG91IGFwb2lhZG8gcG9yIG91dHJhIGluc3RpdHVpw6fDo28gcXVlIG7Do28gYSBVRlBFLCBkZWNsYXJhIHF1ZSBjdW1wcml1IHF1YWlzcXVlciBvYnJpZ2HDp8O1ZXMgZXhpZ2lkYXMgcGVsbyByZXNwZWN0aXZvIGNvbnRyYXRvIG91IGFjb3Jkby4KCkEgVUZQRSBpZGVudGlmaWNhcsOhIGNsYXJhbWVudGUgbyhzKSBub21lKHMpIGRvKHMpIGF1dG9yIChlcykgZG9zIGRpcmVpdG9zIGRvIGRvY3VtZW50byBlbnRyZWd1ZSBlIG7Do28gZmFyw6EgcXVhbHF1ZXIgYWx0ZXJhw6fDo28sIHBhcmEgYWzDqW0gZG8gcHJldmlzdG8gbmEgYWzDrW5lYSBjKS4KRepositório InstitucionalPUBhttps://repositorio.ufpe.br/oai/requestattena@ufpe.bropendoar:22212019-12-19T05:16:12Repositório Institucional da UFPE - Universidade Federal de Pernambuco (UFPE)false |
dc.title.pt_BR.fl_str_mv |
Should we replace our merge tools? |
title |
Should we replace our merge tools? |
spellingShingle |
Should we replace our merge tools? CAVALCANTI, Guilherme José de Carvalho Engenharia de Software Integração de Software Desenvolvimento colaborativo Sistema de controle de versões |
title_short |
Should we replace our merge tools? |
title_full |
Should we replace our merge tools? |
title_fullStr |
Should we replace our merge tools? |
title_full_unstemmed |
Should we replace our merge tools? |
title_sort |
Should we replace our merge tools? |
author |
CAVALCANTI, Guilherme José de Carvalho |
author_facet |
CAVALCANTI, Guilherme José de Carvalho |
author_role |
author |
dc.contributor.authorLattes.pt_BR.fl_str_mv |
http://lattes.cnpq.br/2569037604960951 |
dc.contributor.advisorLattes.pt_BR.fl_str_mv |
http://lattes.cnpq.br/9395715443254344 |
dc.contributor.author.fl_str_mv |
CAVALCANTI, Guilherme José de Carvalho |
dc.contributor.advisor1.fl_str_mv |
BORBA, Paulo Henrique Monteiro |
contributor_str_mv |
BORBA, Paulo Henrique Monteiro |
dc.subject.por.fl_str_mv |
Engenharia de Software Integração de Software Desenvolvimento colaborativo Sistema de controle de versões |
topic |
Engenharia de Software Integração de Software Desenvolvimento colaborativo Sistema de controle de versões |
description |
Merge conflicts often occur when developers concurrently change the same code artifacts. While state of practice unstructured merge tools (e.g git merge) try to automatically resolve merge conflicts based on textual similarity, semistructured and structured merge tools try to go further by exploiting the syntactic structure and semantics of the involved artifacts. Previous studies compare semistructured and structured merge with unstructured merge concerning the number of reported conflicts, showing, for most projects and merge situations, a reduction in favor of semistructured and structured merge. This evidence, however, might not be sufficient to justify industrial adoption of advanced merge strategies such as semistructured and structured merge. The problem is that previous studies do not investigate whether the observed reduction on the number of reported conflicts actually leads to integration effort reduction (Productivity) without negative impact on the correctness of the merging process (Quality). Besides, it is unknown how semistructured merge compares with structured merge. So, to decide whether we should replace our state of practice unstructured merge tools, we need to compare these merge strategies and understand their differences. We then first compare unstructured and semistructured merge. Our results and complementary analysis indicate that the number of false positives is significantly reduced when using semistructured merge when compared to unstructured merge. However, we find no evidence that semistructured merge leads to fewer false negatives. Driven by these findings, we implement an improved semistructured merge tool that further combines both approaches to reduce the false positives and false negatives of semistructured merge. Semistructured merge has shown significant advantages over unstructured merge, especially as implemented by our improved tool. However, before deciding to replace unstructured tools by semistructured merge, we need to investigate whether structured merge is a better alternative than semistructured merge. So, we compare semistructured and structured merge. Our results show that semistructured and structured merge differ on 24% of the scenarios with conflicts. Semistructured merge reports more false positives, whereas structured merge has more false negatives. Finally, we observe that adapting a semistructured merge tool to resolve a particular kind of conflict makes semistructured and structured merge even closer. Overall, our findings suggests that semistructured merge is a better replacement of unstructured tools for conservative developers, having significant gains with a closer behavior to unstructured tools than structured merge. Besides that, practitioners might be reluctant to adopt structured merge because of the observed performance overhead and its tendency to false negatives. So, when choosing between semistructured and structured merge, semistructured merge would be a better match for developers that are not overly concerned with semistructured extra false positives. |
publishDate |
2019 |
dc.date.accessioned.fl_str_mv |
2019-12-18T19:30:51Z |
dc.date.available.fl_str_mv |
2019-12-18T19:30:51Z |
dc.date.issued.fl_str_mv |
2019-10-02 |
dc.type.status.fl_str_mv |
info:eu-repo/semantics/publishedVersion |
dc.type.driver.fl_str_mv |
info:eu-repo/semantics/doctoralThesis |
format |
doctoralThesis |
status_str |
publishedVersion |
dc.identifier.citation.fl_str_mv |
CAVALCANTI, José de Carvalho. Should we replace our merge tools?. 2019. Tese (Doutorado em Ciência da Computação) – Universidade Federal de Pernambuco, Recife, 2019. |
dc.identifier.uri.fl_str_mv |
https://repositorio.ufpe.br/handle/123456789/35862 |
dc.identifier.dark.fl_str_mv |
ark:/64986/0013000010nqk |
identifier_str_mv |
CAVALCANTI, José de Carvalho. Should we replace our merge tools?. 2019. Tese (Doutorado em Ciência da Computação) – Universidade Federal de Pernambuco, Recife, 2019. ark:/64986/0013000010nqk |
url |
https://repositorio.ufpe.br/handle/123456789/35862 |
dc.language.iso.fl_str_mv |
eng |
language |
eng |
dc.rights.driver.fl_str_mv |
Attribution-NonCommercial-NoDerivs 3.0 Brazil http://creativecommons.org/licenses/by-nc-nd/3.0/br/ info:eu-repo/semantics/openAccess |
rights_invalid_str_mv |
Attribution-NonCommercial-NoDerivs 3.0 Brazil http://creativecommons.org/licenses/by-nc-nd/3.0/br/ |
eu_rights_str_mv |
openAccess |
dc.publisher.none.fl_str_mv |
Universidade Federal de Pernambuco |
dc.publisher.program.fl_str_mv |
Programa de Pos Graduacao em Ciencia da Computacao |
dc.publisher.initials.fl_str_mv |
UFPE |
dc.publisher.country.fl_str_mv |
Brasil |
publisher.none.fl_str_mv |
Universidade Federal de Pernambuco |
dc.source.none.fl_str_mv |
reponame:Repositório Institucional da UFPE instname:Universidade Federal de Pernambuco (UFPE) instacron:UFPE |
instname_str |
Universidade Federal de Pernambuco (UFPE) |
instacron_str |
UFPE |
institution |
UFPE |
reponame_str |
Repositório Institucional da UFPE |
collection |
Repositório Institucional da UFPE |
bitstream.url.fl_str_mv |
https://repositorio.ufpe.br/bitstream/123456789/35862/4/TESE%20Guilherme%20Jos%c3%a9%20de%20Carvalho%20Cavalcanti.pdf.txt https://repositorio.ufpe.br/bitstream/123456789/35862/5/TESE%20Guilherme%20Jos%c3%a9%20de%20Carvalho%20Cavalcanti.pdf.jpg https://repositorio.ufpe.br/bitstream/123456789/35862/1/TESE%20Guilherme%20Jos%c3%a9%20de%20Carvalho%20Cavalcanti.pdf https://repositorio.ufpe.br/bitstream/123456789/35862/2/license_rdf https://repositorio.ufpe.br/bitstream/123456789/35862/3/license.txt |
bitstream.checksum.fl_str_mv |
fab3c8fb6ed04871bc11025863d69d74 9cd12b9c3cd19bf7f510179a78238119 c22a3747de18033329f50f7c783a4f70 e39d27027a6cc9cb039ad269a5db8e34 bd573a5ca8288eb7272482765f819534 |
bitstream.checksumAlgorithm.fl_str_mv |
MD5 MD5 MD5 MD5 MD5 |
repository.name.fl_str_mv |
Repositório Institucional da UFPE - Universidade Federal de Pernambuco (UFPE) |
repository.mail.fl_str_mv |
attena@ufpe.br |
_version_ |
1815172964648222720 |