Evaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM.
Los modelos de lenguaje a gran escala (LLMs), como ChatGPT, DeepSeek, Microsoft Copilot, se han popularizado como asistentes de programación por su facilidad de uso y capacidad para generar código a partir de instrucciones simples. Entre las aplicaciones de estos modelos se destacan la creación de f...
- Autores:
-
Rivera Ladino, Josue Mauricio
- Tipo de recurso:
- Trabajo de grado de pregrado
- Fecha de publicación:
- 2025
- Institución:
- Universidad de los Andes
- Repositorio:
- Séneca: repositorio Uniandes
- Idioma:
- spa
- OAI Identifier:
- oai:repositorio.uniandes.edu.co:1992/76269
- Acceso en línea:
- https://hdl.handle.net/1992/76269
- Palabra clave:
- IA
Generación de código
Vulnerabilidades en código
LLM
Ingeniería
- Rights
- openAccess
- License
- Attribution-NoDerivatives 4.0 International
id |
UNIANDES2_21807d7f7a30302a95eea7252e2cd510 |
---|---|
oai_identifier_str |
oai:repositorio.uniandes.edu.co:1992/76269 |
network_acronym_str |
UNIANDES2 |
network_name_str |
Séneca: repositorio Uniandes |
repository_id_str |
|
dc.title.spa.fl_str_mv |
Evaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM. |
title |
Evaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM. |
spellingShingle |
Evaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM. IA Generación de código Vulnerabilidades en código LLM Ingeniería |
title_short |
Evaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM. |
title_full |
Evaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM. |
title_fullStr |
Evaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM. |
title_full_unstemmed |
Evaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM. |
title_sort |
Evaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM. |
dc.creator.fl_str_mv |
Rivera Ladino, Josue Mauricio |
dc.contributor.advisor.none.fl_str_mv |
Rueda Rodríguez, Sandra Julieta |
dc.contributor.author.none.fl_str_mv |
Rivera Ladino, Josue Mauricio |
dc.subject.keyword.spa.fl_str_mv |
IA Generación de código Vulnerabilidades en código |
topic |
IA Generación de código Vulnerabilidades en código LLM Ingeniería |
dc.subject.keyword.eng.fl_str_mv |
LLM |
dc.subject.themes.spa.fl_str_mv |
Ingeniería |
description |
Los modelos de lenguaje a gran escala (LLMs), como ChatGPT, DeepSeek, Microsoft Copilot, se han popularizado como asistentes de programación por su facilidad de uso y capacidad para generar código a partir de instrucciones simples. Entre las aplicaciones de estos modelos se destacan la creación de funciones, consultas de bases de datos, interfaces web y algoritmos complejos. Sin embargo, estos modelos también presentan riesgos importantes, ya que el código generado puede tener vulnerabilidades de seguridad que permiten inyecciones de código, filtraciones de datos o errores en autenticación. El problema principal que este trabajo estudia es la presencia de debilidades de seguridad en el código generado automáticamente por modelos LLM. Estudios recientes han revelado que tal código podría estar sujeto a inyecciones de código u otros defectos que pueden resultar en la filtración de datos privados o vulnerabilidades en la autenticación del usuario. Este tipo de vulnerabilidades podría potencialmente generarse por malas prácticas que el modelo introduce automáticamente y aprende incorrectamente del contexto, o simplemente se introduce gracias a una mala validación del usuario. Dada la creciente dependencia de estas herramientas, la falta de garantías de seguridad sobre el código representa una amenaza real para los desarrolladores y las organizaciones. En respuesta a este desafío, este trabajo propone un enfoque de evaluación sistemática que aprovecha herramientas de análisis estático de código (SAST), como SonarQube y Flawfinder, junto con revisión manual y una interacción iterativa con el modelo sobre un conjunto de casos de prueba. Este conjunto de casos, que aborda tareas típicas de desarrollo, fue diseñado y usado de manera uniforme sobre tres modelos generativos. El código generado fue analizado y las vulnerabilidades identificadas fueron luego analizadas en relación con los marcos OWASP Top 10 y MITRE CWE Top 25, con el fin de realizar un análisis cuantitativo y cualitativo respecto a la ocurrencia, tipos y permanencia de las vulnerabilidades. La tendencia general en los resultados es que todos los modelos probados, en la gran mayoría de casos de prueba, produjeron código defectuoso. Algunos modelos pueden corregir parcialmente dichos errores si se les solicita, pero encontramos que en el código generado después de pedir la corrección puede haber reintroducción de vulnerabilidades, o nuevas vulnerabilidades que no existían en la versión original. Los hallazgos más importantes incluyen la existencia de patrones consistentes de errores por modelo y lenguaje usado, las diferencias entre los modelos en la capacidad de autocorregirse, la permanencia de debilidades importantes, y cuál de esos modelos es el mejor en términos de rendimiento general, para la generación de código seguro, el descubrimiento de vulnerabilidades y su corrección. Dichos resultados ayudan a identificar las fortalezas y debilidades de los modelos y pueden ser una buena referencia para futuras comparaciones con nuevas bibliotecas LLM. |
publishDate |
2025 |
dc.date.accessioned.none.fl_str_mv |
2025-06-10T18:59:32Z |
dc.date.available.none.fl_str_mv |
2025-06-10T18:59:32Z |
dc.date.issued.none.fl_str_mv |
2025-06-10 |
dc.type.none.fl_str_mv |
Trabajo de grado - Pregrado |
dc.type.driver.none.fl_str_mv |
info:eu-repo/semantics/bachelorThesis |
dc.type.version.none.fl_str_mv |
info:eu-repo/semantics/acceptedVersion |
dc.type.coar.none.fl_str_mv |
http://purl.org/coar/resource_type/c_7a1f |
dc.type.content.none.fl_str_mv |
Text |
dc.type.redcol.none.fl_str_mv |
http://purl.org/redcol/resource_type/TP |
format |
http://purl.org/coar/resource_type/c_7a1f |
status_str |
acceptedVersion |
dc.identifier.uri.none.fl_str_mv |
https://hdl.handle.net/1992/76269 |
dc.identifier.instname.none.fl_str_mv |
instname:Universidad de los Andes |
dc.identifier.reponame.none.fl_str_mv |
reponame:Repositorio Institucional Séneca |
dc.identifier.repourl.none.fl_str_mv |
repourl:https://repositorio.uniandes.edu.co/ |
url |
https://hdl.handle.net/1992/76269 |
identifier_str_mv |
instname:Universidad de los Andes reponame:Repositorio Institucional Séneca repourl:https://repositorio.uniandes.edu.co/ |
dc.language.iso.none.fl_str_mv |
spa |
language |
spa |
dc.rights.en.fl_str_mv |
Attribution-NoDerivatives 4.0 International |
dc.rights.uri.none.fl_str_mv |
http://creativecommons.org/licenses/by-nd/4.0/ |
dc.rights.accessrights.none.fl_str_mv |
info:eu-repo/semantics/openAccess |
dc.rights.coar.none.fl_str_mv |
http://purl.org/coar/access_right/c_abf2 |
rights_invalid_str_mv |
Attribution-NoDerivatives 4.0 International http://creativecommons.org/licenses/by-nd/4.0/ http://purl.org/coar/access_right/c_abf2 |
eu_rights_str_mv |
openAccess |
dc.format.extent.none.fl_str_mv |
47 páginas |
dc.format.mimetype.none.fl_str_mv |
application/pdf |
dc.publisher.none.fl_str_mv |
Universidad de los Andes |
dc.publisher.program.none.fl_str_mv |
Ingeniería de Sistemas y Computación |
dc.publisher.faculty.none.fl_str_mv |
Facultad de Ingeniería |
dc.publisher.department.none.fl_str_mv |
Departamento de Ingeniería de Sistemas y Computación |
publisher.none.fl_str_mv |
Universidad de los Andes |
institution |
Universidad de los Andes |
bitstream.url.fl_str_mv |
https://repositorio.uniandes.edu.co/bitstreams/d62fb201-a98c-4411-989b-2314032b2a01/download https://repositorio.uniandes.edu.co/bitstreams/e9f4229b-f7b8-4bd3-8725-ef3bbb733aa5/download https://repositorio.uniandes.edu.co/bitstreams/91761469-63de-4678-853f-78d6ef1be7aa/download https://repositorio.uniandes.edu.co/bitstreams/a5c8742b-f7a9-44f9-83f3-b4bdcf664d45/download https://repositorio.uniandes.edu.co/bitstreams/53a6910e-dc8b-4010-a405-68f8f530a6ad/download https://repositorio.uniandes.edu.co/bitstreams/22c9f605-0c1f-4ed6-97ec-5847fc8d09f3/download https://repositorio.uniandes.edu.co/bitstreams/0e230ac8-a44a-4a00-bc1d-ecb081f19b05/download https://repositorio.uniandes.edu.co/bitstreams/94875181-6d90-489f-bb8d-4e061f570198/download |
bitstream.checksum.fl_str_mv |
702aa089a349d4d47984dc5d5a79ad42 c4ee585db07d66efba4a6dc45d1ba7a7 f7d494f61e544413a13e6ba1da2089cd ae9e573a68e7f92501b6913cc846c39f da98ce9fa550c13bdb566709d9d13bd6 602a2c03aab44a4cf66ed72b8c6cc3e3 d65be8321e9db47269cbaad7f298ff3e 359eeefc8e297da479d04df5fa5c1b3a |
bitstream.checksumAlgorithm.fl_str_mv |
MD5 MD5 MD5 MD5 MD5 MD5 MD5 MD5 |
repository.name.fl_str_mv |
Repositorio institucional Séneca |
repository.mail.fl_str_mv |
adminrepositorio@uniandes.edu.co |
_version_ |
1837004902852722688 |
spelling |
Rueda Rodríguez, Sandra Julietavirtual::24182-1Rivera Ladino, Josue Mauricio2025-06-10T18:59:32Z2025-06-10T18:59:32Z2025-06-10https://hdl.handle.net/1992/76269instname:Universidad de los Andesreponame:Repositorio Institucional Sénecarepourl:https://repositorio.uniandes.edu.co/Los modelos de lenguaje a gran escala (LLMs), como ChatGPT, DeepSeek, Microsoft Copilot, se han popularizado como asistentes de programación por su facilidad de uso y capacidad para generar código a partir de instrucciones simples. Entre las aplicaciones de estos modelos se destacan la creación de funciones, consultas de bases de datos, interfaces web y algoritmos complejos. Sin embargo, estos modelos también presentan riesgos importantes, ya que el código generado puede tener vulnerabilidades de seguridad que permiten inyecciones de código, filtraciones de datos o errores en autenticación. El problema principal que este trabajo estudia es la presencia de debilidades de seguridad en el código generado automáticamente por modelos LLM. Estudios recientes han revelado que tal código podría estar sujeto a inyecciones de código u otros defectos que pueden resultar en la filtración de datos privados o vulnerabilidades en la autenticación del usuario. Este tipo de vulnerabilidades podría potencialmente generarse por malas prácticas que el modelo introduce automáticamente y aprende incorrectamente del contexto, o simplemente se introduce gracias a una mala validación del usuario. Dada la creciente dependencia de estas herramientas, la falta de garantías de seguridad sobre el código representa una amenaza real para los desarrolladores y las organizaciones. En respuesta a este desafío, este trabajo propone un enfoque de evaluación sistemática que aprovecha herramientas de análisis estático de código (SAST), como SonarQube y Flawfinder, junto con revisión manual y una interacción iterativa con el modelo sobre un conjunto de casos de prueba. Este conjunto de casos, que aborda tareas típicas de desarrollo, fue diseñado y usado de manera uniforme sobre tres modelos generativos. El código generado fue analizado y las vulnerabilidades identificadas fueron luego analizadas en relación con los marcos OWASP Top 10 y MITRE CWE Top 25, con el fin de realizar un análisis cuantitativo y cualitativo respecto a la ocurrencia, tipos y permanencia de las vulnerabilidades. La tendencia general en los resultados es que todos los modelos probados, en la gran mayoría de casos de prueba, produjeron código defectuoso. Algunos modelos pueden corregir parcialmente dichos errores si se les solicita, pero encontramos que en el código generado después de pedir la corrección puede haber reintroducción de vulnerabilidades, o nuevas vulnerabilidades que no existían en la versión original. Los hallazgos más importantes incluyen la existencia de patrones consistentes de errores por modelo y lenguaje usado, las diferencias entre los modelos en la capacidad de autocorregirse, la permanencia de debilidades importantes, y cuál de esos modelos es el mejor en términos de rendimiento general, para la generación de código seguro, el descubrimiento de vulnerabilidades y su corrección. Dichos resultados ayudan a identificar las fortalezas y debilidades de los modelos y pueden ser una buena referencia para futuras comparaciones con nuevas bibliotecas LLM.Pregrado47 páginasapplication/pdfspaUniversidad de los AndesIngeniería de Sistemas y ComputaciónFacultad de IngenieríaDepartamento de Ingeniería de Sistemas y ComputaciónAttribution-NoDerivatives 4.0 Internationalhttp://creativecommons.org/licenses/by-nd/4.0/info:eu-repo/semantics/openAccesshttp://purl.org/coar/access_right/c_abf2Evaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM.Trabajo de grado - Pregradoinfo:eu-repo/semantics/bachelorThesisinfo:eu-repo/semantics/acceptedVersionhttp://purl.org/coar/resource_type/c_7a1fTexthttp://purl.org/redcol/resource_type/TPIAGeneración de códigoVulnerabilidades en códigoLLMIngeniería201914138Publicationhttps://scholar.google.es/citations?user=picn4ngAAAAJvirtual::24182-10000-0002-2111-9348virtual::24182-1https://scienti.minciencias.gov.co/cvlac/visualizador/generarCurriculoCv.do?cod_rh=0000143111virtual::24182-1e336d2eb-f251-470f-b975-2d5e63ce65c9virtual::24182-1e336d2eb-f251-470f-b975-2d5e63ce65c9virtual::24182-1ORIGINALEvaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM.pdfEvaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM.pdfapplication/pdf1739115https://repositorio.uniandes.edu.co/bitstreams/d62fb201-a98c-4411-989b-2314032b2a01/download702aa089a349d4d47984dc5d5a79ad42MD51autorizacionTesis.pdfautorizacionTesis.pdfHIDEapplication/pdf320150https://repositorio.uniandes.edu.co/bitstreams/e9f4229b-f7b8-4bd3-8725-ef3bbb733aa5/downloadc4ee585db07d66efba4a6dc45d1ba7a7MD52CC-LICENSElicense_rdflicense_rdfapplication/rdf+xml; charset=utf-8799https://repositorio.uniandes.edu.co/bitstreams/91761469-63de-4678-853f-78d6ef1be7aa/downloadf7d494f61e544413a13e6ba1da2089cdMD53LICENSElicense.txtlicense.txttext/plain; charset=utf-82535https://repositorio.uniandes.edu.co/bitstreams/a5c8742b-f7a9-44f9-83f3-b4bdcf664d45/downloadae9e573a68e7f92501b6913cc846c39fMD54TEXTEvaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM.pdf.txtEvaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM.pdf.txtExtracted texttext/plain97744https://repositorio.uniandes.edu.co/bitstreams/53a6910e-dc8b-4010-a405-68f8f530a6ad/downloadda98ce9fa550c13bdb566709d9d13bd6MD55autorizacionTesis.pdf.txtautorizacionTesis.pdf.txtExtracted texttext/plain2084https://repositorio.uniandes.edu.co/bitstreams/22c9f605-0c1f-4ed6-97ec-5847fc8d09f3/download602a2c03aab44a4cf66ed72b8c6cc3e3MD57THUMBNAILEvaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM.pdf.jpgEvaluación Comparativa de vulnerabilidades de seguridad en código generado por modelos LLM.pdf.jpgIM Thumbnailimage/jpeg6588https://repositorio.uniandes.edu.co/bitstreams/0e230ac8-a44a-4a00-bc1d-ecb081f19b05/downloadd65be8321e9db47269cbaad7f298ff3eMD56autorizacionTesis.pdf.jpgautorizacionTesis.pdf.jpgIM Thumbnailimage/jpeg17093https://repositorio.uniandes.edu.co/bitstreams/94875181-6d90-489f-bb8d-4e061f570198/download359eeefc8e297da479d04df5fa5c1b3aMD581992/76269oai:repositorio.uniandes.edu.co:1992/762692025-06-11 04:00:40.381http://creativecommons.org/licenses/by-nd/4.0/Attribution-NoDerivatives 4.0 Internationalopen.accesshttps://repositorio.uniandes.edu.coRepositorio institucional Sénecaadminrepositorio@uniandes.edu.coPGgzPjxzdHJvbmc+RGVzY2FyZ28gZGUgUmVzcG9uc2FiaWxpZGFkIC0gTGljZW5jaWEgZGUgQXV0b3JpemFjacOzbjwvc3Ryb25nPjwvaDM+CjxwPjxzdHJvbmc+UG9yIGZhdm9yIGxlZXIgYXRlbnRhbWVudGUgZXN0ZSBkb2N1bWVudG8gcXVlIHBlcm1pdGUgYWwgUmVwb3NpdG9yaW8gSW5zdGl0dWNpb25hbCBTw6luZWNhIHJlcHJvZHVjaXIgeSBkaXN0cmlidWlyIGxvcyByZWN1cnNvcyBkZSBpbmZvcm1hY2nDs24gZGVwb3NpdGFkb3MgbWVkaWFudGUgbGEgYXV0b3JpemFjacOzbiBkZSBsb3Mgc2lndWllbnRlcyB0w6lybWlub3M6PC9zdHJvbmc+PC9wPgo8cD5Db25jZWRhIGxhIGxpY2VuY2lhIGRlIGRlcMOzc2l0byBlc3TDoW5kYXIgc2VsZWNjaW9uYW5kbyBsYSBvcGNpw7NuIDxzdHJvbmc+J0FjZXB0YXIgbG9zIHTDqXJtaW5vcyBhbnRlcmlvcm1lbnRlIGRlc2NyaXRvcyc8L3N0cm9uZz4geSBjb250aW51YXIgZWwgcHJvY2VzbyBkZSBlbnbDrW8gbWVkaWFudGUgZWwgYm90w7NuIDxzdHJvbmc+J1NpZ3VpZW50ZScuPC9zdHJvbmc+PC9wPgo8aHI+CjxwPllvLCBlbiBtaSBjYWxpZGFkIGRlIGF1dG9yIGRlbCB0cmFiYWpvIGRlIHRlc2lzLCBtb25vZ3JhZsOtYSBvIHRyYWJham8gZGUgZ3JhZG8sIGhhZ28gZW50cmVnYSBkZWwgZWplbXBsYXIgcmVzcGVjdGl2byB5IGRlIHN1cyBhbmV4b3MgZGUgc2VyIGVsIGNhc28sIGVuIGZvcm1hdG8gZGlnaXRhbCB5L28gZWxlY3Ryw7NuaWNvIHkgYXV0b3Jpem8gYSBsYSBVbml2ZXJzaWRhZCBkZSBsb3MgQW5kZXMgcGFyYSBxdWUgcmVhbGljZSBsYSBwdWJsaWNhY2nDs24gZW4gZWwgU2lzdGVtYSBkZSBCaWJsaW90ZWNhcyBvIGVuIGN1YWxxdWllciBvdHJvIHNpc3RlbWEgbyBiYXNlIGRlIGRhdG9zIHByb3BpbyBvIGFqZW5vIGEgbGEgVW5pdmVyc2lkYWQgeSBwYXJhIHF1ZSBlbiBsb3MgdMOpcm1pbm9zIGVzdGFibGVjaWRvcyBlbiBsYSBMZXkgMjMgZGUgMTk4MiwgTGV5IDQ0IGRlIDE5OTMsIERlY2lzacOzbiBBbmRpbmEgMzUxIGRlIDE5OTMsIERlY3JldG8gNDYwIGRlIDE5OTUgeSBkZW3DoXMgbm9ybWFzIGdlbmVyYWxlcyBzb2JyZSBsYSBtYXRlcmlhLCB1dGlsaWNlIGVuIHRvZGFzIHN1cyBmb3JtYXMsIGxvcyBkZXJlY2hvcyBwYXRyaW1vbmlhbGVzIGRlIHJlcHJvZHVjY2nDs24sIGNvbXVuaWNhY2nDs24gcMO6YmxpY2EsIHRyYW5zZm9ybWFjacOzbiB5IGRpc3RyaWJ1Y2nDs24gKGFscXVpbGVyLCBwcsOpc3RhbW8gcMO6YmxpY28gZSBpbXBvcnRhY2nDs24pIHF1ZSBtZSBjb3JyZXNwb25kZW4gY29tbyBjcmVhZG9yIGRlIGxhIG9icmEgb2JqZXRvIGRlbCBwcmVzZW50ZSBkb2N1bWVudG8uPC9wPgo8cD5MYSBwcmVzZW50ZSBhdXRvcml6YWNpw7NuIHNlIGVtaXRlIGVuIGNhbGlkYWQgZGUgYXV0b3IgZGUgbGEgb2JyYSBvYmpldG8gZGVsIHByZXNlbnRlIGRvY3VtZW50byB5IG5vIGNvcnJlc3BvbmRlIGEgY2VzacOzbiBkZSBkZXJlY2hvcywgc2lubyBhIGxhIGF1dG9yaXphY2nDs24gZGUgdXNvIGFjYWTDqW1pY28gZGUgY29uZm9ybWlkYWQgY29uIGxvIGFudGVyaW9ybWVudGUgc2XDsWFsYWRvLiBMYSBwcmVzZW50ZSBhdXRvcml6YWNpw7NuIHNlIGhhY2UgZXh0ZW5zaXZhIG5vIHNvbG8gYSBsYXMgZmFjdWx0YWRlcyB5IGRlcmVjaG9zIGRlIHVzbyBzb2JyZSBsYSBvYnJhIGVuIGZvcm1hdG8gbyBzb3BvcnRlIG1hdGVyaWFsLCBzaW5vIHRhbWJpw6luIHBhcmEgZm9ybWF0byBlbGVjdHLDs25pY28sIHkgZW4gZ2VuZXJhbCBwYXJhIGN1YWxxdWllciBmb3JtYXRvIGNvbm9jaWRvIG8gcG9yIGNvbm9jZXIuPC9wPgo8cD5FbCBhdXRvciwgbWFuaWZpZXN0YSBxdWUgbGEgb2JyYSBvYmpldG8gZGUgbGEgcHJlc2VudGUgYXV0b3JpemFjacOzbiBlcyBvcmlnaW5hbCB5IGxhIHJlYWxpesOzIHNpbiB2aW9sYXIgbyB1c3VycGFyIGRlcmVjaG9zIGRlIGF1dG9yIGRlIHRlcmNlcm9zLCBwb3IgbG8gdGFudG8sIGxhIG9icmEgZXMgZGUgc3UgZXhjbHVzaXZhIGF1dG9yw61hIHkgdGllbmUgbGEgdGl0dWxhcmlkYWQgc29icmUgbGEgbWlzbWEuPC9wPgo8cD5FbiBjYXNvIGRlIHByZXNlbnRhcnNlIGN1YWxxdWllciByZWNsYW1hY2nDs24gbyBhY2Npw7NuIHBvciBwYXJ0ZSBkZSB1biB0ZXJjZXJvIGVuIGN1YW50byBhIGxvcyBkZXJlY2hvcyBkZSBhdXRvciBzb2JyZSBsYSBvYnJhIGVuIGN1ZXN0acOzbiwgZWwgYXV0b3IgYXN1bWlyw6EgdG9kYSBsYSByZXNwb25zYWJpbGlkYWQsIHkgc2FsZHLDoSBkZSBkZWZlbnNhIGRlIGxvcyBkZXJlY2hvcyBhcXXDrSBhdXRvcml6YWRvcywgcGFyYSB0b2RvcyBsb3MgZWZlY3RvcyBsYSBVbml2ZXJzaWRhZCBhY3TDumEgY29tbyB1biB0ZXJjZXJvIGRlIGJ1ZW5hIGZlLjwvcD4KPHA+U2kgdGllbmUgYWxndW5hIGR1ZGEgc29icmUgbGEgbGljZW5jaWEsIHBvciBmYXZvciwgY29udGFjdGUgY29uIGVsIDxhIGhyZWY9Im1haWx0bzpiaWJsaW90ZWNhQHVuaWFuZGVzLmVkdS5jbyIgdGFyZ2V0PSJfYmxhbmsiPkFkbWluaXN0cmFkb3IgZGVsIFNpc3RlbWEuPC9hPjwvcD4K |