UEsDBAoAAAAAAHtYGDkAAAAAAAAAAAAAAAAJAAQATUVUQS1JTkYv/soAAFBLAwQKAAAAAAB6WBg5vGQOR2oAAABqAAAAFAAAAE1FVEEtSU5GL01BTklGRVNULk1GTWFuaWZlc3QtVmVyc2lvbjogMS4wDQpBbnQtVmVyc2lvbjogQXBhY2hlIEFudCAxLjcuMA0KQ3JlYXRlZC1CeTogMS41LjBfMDgtYjAzIChTdW4gTWljcm9zeXN0ZW1zIEluYy4pDQoNClBLAwQKAAAAAAB5WBg5AAAAAAAAAAAAAAAABAAAAG9yZy9QSwMECgAAAAAAelgYOQAAAAAAAAAAAAAAAAoAAABvcmcvam1vY2svUEsDBAoAAAAAAHlYGDkAAAAAAAAAAAAAAAAWAAAAb3JnL2ptb2NrL2ludGVncmF0aW9uL1BLAwQKAAAAAAB5WBg5AAAAAAAAAAAAAAAAHQAAAG9yZy9qbW9jay9pbnRlZ3JhdGlvbi9qdW5pdDQvUEsDBAoAAAAAAHlYGDkX+584uQYAALkGAAAqAAAAb3JnL2ptb2NrL2ludGVncmF0aW9uL2p1bml0NC9KTW9jayQxLmNsYXNzyv66vgAAADEARgkACQAtCgAKAC4KAAoALwoAKwAwBwAxCgAFADIKAAkAMwoANAA1BwA2BwA3AQAGdGhpcyQwAQAkTG9yZy9qbW9jay9pbnRlZ3JhdGlvbi9qdW5pdDQvSk1vY2s7AQAGPGluaXQ+AQBnKExvcmcvam1vY2svaW50ZWdyYXRpb24vanVuaXQ0L0pNb2NrO0xqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7TG9yZy9qdW5pdC9pbnRlcm5hbC9ydW5uZXJzL1Rlc3RDbGFzczspVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAAAQAMSW5uZXJDbGFzc2VzAQAmTG9yZy9qbW9jay9pbnRlZ3JhdGlvbi9qdW5pdDQvSk1vY2skMTsBAAJ4MAEAGkxqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7AQACeDEBACZMb3JnL2p1bml0L2ludGVybmFsL3J1bm5lcnMvVGVzdENsYXNzOwEACkV4Y2VwdGlvbnMHADgBAAZpbnZva2UBABUoTGphdmEvbGFuZy9PYmplY3Q7KVYBAAZhY3R1YWwBABVMamF2YS9sYW5nL1Rocm93YWJsZTsBAAxleHBlY3RlZFR5cGUBABFMamF2YS9sYW5nL0NsYXNzOwEAAWUBAC1MamF2YS9sYW5nL3JlZmxlY3QvSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbjsBAAt0ZXN0Rml4dHVyZQEAEkxqYXZhL2xhbmcvT2JqZWN0OwEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBAClMamF2YS9sYW5nL0NsYXNzPCtMamF2YS9sYW5nL1Rocm93YWJsZTs+OwEAClNvdXJjZUZpbGUBAApKTW9jay5qYXZhAQAPRW5jbG9zaW5nTWV0aG9kBwA5DAA6ADsMAAsADAwADQA8DAAcAB0MAD0APgEAK2phdmEvbGFuZy9yZWZsZWN0L0ludm9jYXRpb25UYXJnZXRFeGNlcHRpb24MAD8AQAwAQQBCBwBDDABEAEUBACRvcmcvam1vY2svaW50ZWdyYXRpb24vanVuaXQ0L0pNb2NrJDEBACVvcmcvanVuaXQvaW50ZXJuYWwvcnVubmVycy9UZXN0TWV0aG9kAQAgamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb24BACJvcmcvam1vY2svaW50ZWdyYXRpb24vanVuaXQ0L0pNb2NrAQAKd3JhcE1ldGhvZAEAQyhMamF2YS9sYW5nL3JlZmxlY3QvTWV0aG9kOylMb3JnL2p1bml0L2ludGVybmFsL3J1bm5lcnMvVGVzdE1ldGhvZDsBAEMoTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDtMb3JnL2p1bml0L2ludGVybmFsL3J1bm5lcnMvVGVzdENsYXNzOylWAQAKYWNjZXNzJDAwMAEAOShMb3JnL2ptb2NrL2ludGVncmF0aW9uL2p1bml0NC9KTW9jaztMamF2YS9sYW5nL09iamVjdDspVgEAEmdldFRhcmdldEV4Y2VwdGlvbgEAFygpTGphdmEvbGFuZy9UaHJvd2FibGU7AQAUZ2V0RXhwZWN0ZWRFeGNlcHRpb24BABMoKUxqYXZhL2xhbmcvQ2xhc3M7AQAPamF2YS9sYW5nL0NsYXNzAQAKaXNJbnN0YW5jZQEAFShMamF2YS9sYW5nL09iamVjdDspWgAgAAkACgAAAAEQEAALAAwAAAACAAAADQAOAAIADwAAAEoAAwAEAAAADCortQABKiwttwACsQAAAAIAEAAAAAYAAQAAACIAEQAAACAAAwAAAAwAEgAVAAAAAAAMABYAFwACAAAADAAYABkAAwAaAAAABgACABsABQABABwAHQACAA8AAADFAAIABQAAADUqK7cAAyq0AAEruAAEpwAnTSy2AAZOKrYABzoEGQTGABQZBC22AAiZAAsqtAABK7gABCy/sQABAAAADQAQAAUAAwAQAAAAKgAKAAAAJQAFACYADQAxABAAKAARACkAFgAqABwALAAqAC0AMgAwADQAMgARAAAANAAFABYAHgAeAB8AAwAcABgAIAAhAAQAEQAjACIAIwACAAAANQASABUAAAAAADUAJAAlAAEAJgAAAAwAAQAcABgAIAAnAAQAGgAAAAYAAgAbAAUAAwAoAAAAAgApACoAAAAEACsALAAUAAAACgABAAkAAAAAAABQSwMECgAAAAAAeVgYOfONYrRaDAAAWgwAACgAAABvcmcvam1vY2svaW50ZWdyYXRpb24vanVuaXQ0L0pNb2NrLmNsYXNzyv66vgAAADEAkwoAIgBTCgAjAFQKACIAVQkAIgBWCgBXAFgHAFkKACIAXAoABgBdCgAiAF4KAAwAXwoAVwBgBwBhBwBiBwBjCgAOAGQIAGUKAA4AZgoAVwBnCABoCgAOAGkKAA0AagcAawgAbAoADQBtBwBuCgBvAHAKAFcAcQoAbwByCgBvAHMHAHQIAHUKAA4AdgoAHgBqBwB3BwB4AQAMbW9ja2VyeUZpZWxkAQAZTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwEABjxpbml0PgEAFChMamF2YS9sYW5nL0NsYXNzOylWAQAEQ29kZQEAD0xpbmVOdW1iZXJUYWJsZQEAEkxvY2FsVmFyaWFibGVUYWJsZQEABHRoaXMBACRMb3JnL2ptb2NrL2ludGVncmF0aW9uL2p1bml0NC9KTW9jazsBAAl0ZXN0Q2xhc3MBABFMamF2YS9sYW5nL0NsYXNzOwEAFkxvY2FsVmFyaWFibGVUeXBlVGFibGUBABRMamF2YS9sYW5nL0NsYXNzPCo+OwEACkV4Y2VwdGlvbnMBAAlTaWduYXR1cmUBABcoTGphdmEvbGFuZy9DbGFzczwqPjspVgEACndyYXBNZXRob2QBAEMoTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDspTG9yZy9qdW5pdC9pbnRlcm5hbC9ydW5uZXJzL1Rlc3RNZXRob2Q7AQAGbWV0aG9kAQAaTGphdmEvbGFuZy9yZWZsZWN0L01ldGhvZDsBABhhc3NlcnRNb2NrZXJ5SXNTYXRpc2ZpZWQBABUoTGphdmEvbGFuZy9PYmplY3Q7KVYBAAt0ZXN0Rml4dHVyZQEAEkxqYXZhL2xhbmcvT2JqZWN0OwEACW1vY2tlcnlPZgEAJyhMamF2YS9sYW5nL09iamVjdDspTG9yZy9qbW9jay9Nb2NrZXJ5OwEAB21vY2tlcnkBABNMb3JnL2ptb2NrL01vY2tlcnk7AQABZQEAIkxqYXZhL2xhbmcvSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbjsBAAR0ZXN0AQAQZmluZE1vY2tlcnlGaWVsZAEALChMamF2YS9sYW5nL0NsYXNzOylMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7AQAFZmllbGQBAARhcnIkAQAaW0xqYXZhL2xhbmcvcmVmbGVjdC9GaWVsZDsBAARsZW4kAQABSQEAAmkkAQABYwEALyhMamF2YS9sYW5nL0NsYXNzPCo+OylMamF2YS9sYW5nL3JlZmxlY3QvRmllbGQ7AQAKYWNjZXNzJDAwMAEAOShMb3JnL2ptb2NrL2ludGVncmF0aW9uL2p1bml0NC9KTW9jaztMamF2YS9sYW5nL09iamVjdDspVgEAAngwAQACeDEBAApTb3VyY2VGaWxlAQAKSk1vY2suamF2YQwAOAA5DAAmACcMAEMARAwAJAAlBwB5DAB6AHsBACRvcmcvam1vY2svaW50ZWdyYXRpb24vanVuaXQ0L0pNb2NrJDEBAAABAAxJbm5lckNsYXNzZXMMAHwAfQwAJgB+DAA8AD0MAH8AgAwAgQCCAQARb3JnL2ptb2NrL01vY2tlcnkBAB9qYXZhL2xhbmcvSWxsZWdhbFN0YXRlRXhjZXB0aW9uAQAXamF2YS9sYW5nL1N0cmluZ0J1aWxkZXIMACYAgAEAD01vY2tlcnkgbmFtZWQgJwwAgwCEDACFAIYBAAknIGlzIG51bGwMAIcAhgwAJgCIAQAgamF2YS9sYW5nL0lsbGVnYWxBY2Nlc3NFeGNlcHRpb24BABpjYW5ub3QgZ2V0IHZhbHVlIG9mIGZpZWxkIAwAJgCJAQAQamF2YS9sYW5nL09iamVjdAcAigwAiwCMDACNAI4MAI8AkAwAkQCOAQAub3JnL2p1bml0L2ludGVybmFsL3J1bm5lcnMvSW5pdGlhbGl6YXRpb25FcnJvcgEAH25vIE1vY2tlcnkgZm91bmQgaW4gdGVzdCBjbGFzcyAMAIMAkgEAIm9yZy9qbW9jay9pbnRlZ3JhdGlvbi9qdW5pdDQvSk1vY2sBACxvcmcvanVuaXQvaW50ZXJuYWwvcnVubmVycy9KVW5pdDRDbGFzc1J1bm5lcgEAF2phdmEvbGFuZy9yZWZsZWN0L0ZpZWxkAQANc2V0QWNjZXNzaWJsZQEABChaKVYBAAxnZXRUZXN0Q2xhc3MBACgoKUxvcmcvanVuaXQvaW50ZXJuYWwvcnVubmVycy9UZXN0Q2xhc3M7AQBnKExvcmcvam1vY2svaW50ZWdyYXRpb24vanVuaXQ0L0pNb2NrO0xqYXZhL2xhbmcvcmVmbGVjdC9NZXRob2Q7TG9yZy9qdW5pdC9pbnRlcm5hbC9ydW5uZXJzL1Rlc3RDbGFzczspVgEAEWFzc2VydElzU2F0aXNmaWVkAQADKClWAQADZ2V0AQAmKExqYXZhL2xhbmcvT2JqZWN0OylMamF2YS9sYW5nL09iamVjdDsBAAZhcHBlbmQBAC0oTGphdmEvbGFuZy9TdHJpbmc7KUxqYXZhL2xhbmcvU3RyaW5nQnVpbGRlcjsBAAdnZXROYW1lAQAUKClMamF2YS9sYW5nL1N0cmluZzsBAAh0b1N0cmluZwEAFShMamF2YS9sYW5nL1N0cmluZzspVgEAKihMamF2YS9sYW5nL1N0cmluZztMamF2YS9sYW5nL1Rocm93YWJsZTspVgEAD2phdmEvbGFuZy9DbGFzcwEAEWdldERlY2xhcmVkRmllbGRzAQAcKClbTGphdmEvbGFuZy9yZWZsZWN0L0ZpZWxkOwEAB2dldFR5cGUBABMoKUxqYXZhL2xhbmcvQ2xhc3M7AQAQaXNBc3NpZ25hYmxlRnJvbQEAFChMamF2YS9sYW5nL0NsYXNzOylaAQANZ2V0U3VwZXJjbGFzcwEALShMamF2YS9sYW5nL09iamVjdDspTGphdmEvbGFuZy9TdHJpbmdCdWlsZGVyOwAhACIAIwAAAAEAAgAkACUAAAAGAAEAJgAnAAMAKAAAAGgAAgACAAAAFiortwACKiu4AAO1AAQqtAAEBLYABbEAAAADACkAAAASAAQAAAAZAAUAGgANABsAFQAcACoAAAAWAAIAAAAWACsALAAAAAAAFgAtAC4AAQAvAAAADAABAAAAFgAtADAAAQAxAAAABAABAB4AMgAAAAIAMwAEADQANQABACgAAABCAAUAAgAAAA67AAZZKisqtgAHtwAIsAAAAAIAKQAAAAYAAQAAACAAKgAAABYAAgAAAA4AKwAsAAAAAAAOADYANwABAAIAOAA5AAEAKAAAAEEAAgACAAAACSortgAJtgAKsQAAAAIAKQAAAAoAAgAAADcACAA4ACoAAAAWAAIAAAAJACsALAAAAAAACQA6ADsAAQAEADwAPQABACgAAAC/AAQAAwAAAFsqtAAEK7YAC8AADE0sxwApuwANWbsADlm3AA8SELYAESq0AAS2ABK2ABESE7YAEbYAFLcAFb8ssE27AA1ZuwAOWbcADxIXtgARKrQABLYAErYAEbYAFCy3ABi/AAEAAAA3ADgAFgACACkAAAAaAAYAAAA8AAwAPQAQAD4ANgBBADgAQwA5AEQAKgAAACoABAAMACwAPgA/AAIAOQAiAEAAQQACAAAAWwArACwAAAAAAFsAQgA7AAEACABDAEQAAwAoAAAA6gAEAAYAAABaKkwrEwAZpQA5K7YAGk0svj4DNgQVBB2iACAsFQQyOgUTAAwZBbYAG7YAHJkABhkFsIQEAaf/4Cu2AB1Mp//GuwAeWbsADlm3AA8SH7YAESq2ACC2ABS3ACG/AAAAAwApAAAAHgAHAAAASgAJAEsAIABMAC4ATQAxAEsANwBKAD8AUgAqAAAAPgAGACAAEQBFACUABQAOACkARgBHAAIAEQAmAEgASQADABQAIwBKAEkABAACAD0ASwAuAAEAAABaAC0ALgAAAC8AAAAWAAIAAgA9AEsAMAABAAAAWgAtADAAAAAxAAAABAABAB4AMgAAAAIATBAIAE0ATgABACgAAAA6AAIAAgAAAAYqK7cAAbEAAAACACkAAAAGAAEAAAAVACoAAAAWAAIAAAAGAE8ALAAAAAAABgBQADsAAQACAFEAAAACAFIAWwAAAAoAAQAGAAAAAAAAUEsDBAoAAAAAAHlYGDl7fmwgGAIAABgCAAAwAAAAb3JnL2ptb2NrL2ludGVncmF0aW9uL2p1bml0NC9KVW5pdDRNb2NrZXJ5LmNsYXNzyv66vgAAADEAGgoABQAPCQAQABEKAAQAEgcAEwcAFAEABjxpbml0PgEAAygpVgEABENvZGUBAA9MaW5lTnVtYmVyVGFibGUBABJMb2NhbFZhcmlhYmxlVGFibGUBAAR0aGlzAQAsTG9yZy9qbW9jay9pbnRlZ3JhdGlvbi9qdW5pdDQvSlVuaXQ0TW9ja2VyeTsBAApTb3VyY2VGaWxlAQASSlVuaXQ0TW9ja2VyeS5qYXZhDAAGAAcHABUMABYAFwwAGAAZAQAqb3JnL2ptb2NrL2ludGVncmF0aW9uL2p1bml0NC9KVW5pdDRNb2NrZXJ5AQARb3JnL2ptb2NrL01vY2tlcnkBACZvcmcvam1vY2svbGliL0Fzc2VydGlvbkVycm9yVHJhbnNsYXRvcgEACElOU1RBTkNFAQAoTG9yZy9qbW9jay9saWIvQXNzZXJ0aW9uRXJyb3JUcmFuc2xhdG9yOwEAHXNldEV4cGVjdGF0aW9uRXJyb3JUcmFuc2xhdG9yAQAtKExvcmcvam1vY2svYXBpL0V4cGVjdGF0aW9uRXJyb3JUcmFuc2xhdG9yOylWACEABAAFAAAAAAABAAEABgAHAAEACAAAAD4AAgABAAAADCq3AAEqsgACtgADsQAAAAIACQAAAA4AAwAAAAwABAANAAsADgAKAAAADAABAAAADAALAAwAAAABAA0AAAACAA5QSwMECgAAAAAAqJjVOJNAfGUsCwAALAsAACcAAABvcmcvam1vY2svaW50ZWdyYXRpb24vanVuaXQ0L0pNb2NrLmphdmFwYWNrYWdlIG9yZy5qbW9jay5pbnRlZ3JhdGlvbi5qdW5pdDQ7CgppbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuRmllbGQ7CmltcG9ydCBqYXZhLmxhbmcucmVmbGVjdC5JbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uOwppbXBvcnQgamF2YS5sYW5nLnJlZmxlY3QuTWV0aG9kOwoKaW1wb3J0IG9yZy5qbW9jay5Nb2NrZXJ5OwppbXBvcnQgb3JnLmp1bml0LmludGVybmFsLnJ1bm5lcnMuSW5pdGlhbGl6YXRpb25FcnJvcjsKaW1wb3J0IG9yZy5qdW5pdC5pbnRlcm5hbC5ydW5uZXJzLkpVbml0NENsYXNzUnVubmVyOwppbXBvcnQgb3JnLmp1bml0LmludGVybmFsLnJ1bm5lcnMuVGVzdE1ldGhvZDsKaW1wb3J0IG9yZy5qdW5pdC5ydW5uZXIuUnVubmVyOwoKCi8qKgogKiBBIHRlc3Qge0BsaW5rIFJ1bm5lcn0gdGhhdCBhc3NlcnRzIHRoYXQgYWxsIGV4cGVjdGF0aW9ucyBoYXZlIGJlZW4gbWV0IGFmdGVyCiAqIHRoZSB0ZXN0IGhhcyBmaW5pc2hlZCBhbmQgYmVmb3JlIHRoZSBmaXh0dXJlIGlzIHRvcm4gZG93bi4KICogCiAqIEBhdXRob3IgbmF0CiAqIAogKi8KcHVibGljIGNsYXNzIEpNb2NrIGV4dGVuZHMgSlVuaXQ0Q2xhc3NSdW5uZXIgewogICAgcHJpdmF0ZSBGaWVsZCBtb2NrZXJ5RmllbGQ7CgogICAgcHVibGljIEpNb2NrKENsYXNzPD8+IHRlc3RDbGFzcykgdGhyb3dzIEluaXRpYWxpemF0aW9uRXJyb3IgewogICAgICAgIHN1cGVyKHRlc3RDbGFzcyk7CiAgICAgICAgbW9ja2VyeUZpZWxkID0gZmluZE1vY2tlcnlGaWVsZCh0ZXN0Q2xhc3MpOwogICAgICAgIG1vY2tlcnlGaWVsZC5zZXRBY2Nlc3NpYmxlKHRydWUpOwogICAgfQoKICAgIEBPdmVycmlkZQogICAgcHJvdGVjdGVkIFRlc3RNZXRob2Qgd3JhcE1ldGhvZChNZXRob2QgbWV0aG9kKSB7CiAgICAgICAgcmV0dXJuIG5ldyBUZXN0TWV0aG9kKG1ldGhvZCwgZ2V0VGVzdENsYXNzKCkpIHsKICAgICAgICAgICAgQE92ZXJyaWRlCiAgICAgICAgICAgIHB1YmxpYyB2b2lkIGludm9rZShPYmplY3QgdGVzdEZpeHR1cmUpCiAgICAgICAgICAgICAgICB0aHJvd3MgSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiwgSW52b2NhdGlvblRhcmdldEV4Y2VwdGlvbiB7CiAgICAgICAgICAgICAgICB0cnkgewogICAgICAgICAgICAgICAgICAgIHN1cGVyLmludm9rZSh0ZXN0Rml4dHVyZSk7CiAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TW9ja2VyeUlzU2F0aXNmaWVkKHRlc3RGaXh0dXJlKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhdGNoIChJbnZvY2F0aW9uVGFyZ2V0RXhjZXB0aW9uIGUpIHsKICAgICAgICAgICAgICAgICAgICBUaHJvd2FibGUgYWN0dWFsID0gZS5nZXRUYXJnZXRFeGNlcHRpb24oKTsKICAgICAgICAgICAgICAgICAgICBDbGFzczw/IGV4dGVuZHMgVGhyb3dhYmxlPiBleHBlY3RlZFR5cGUgPSB0aGlzLmdldEV4cGVjdGVkRXhjZXB0aW9uKCk7CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgaWYgKGV4cGVjdGVkVHlwZSAhPSBudWxsICYmIGV4cGVjdGVkVHlwZS5pc0luc3RhbmNlKGFjdHVhbCkpIHsKICAgICAgICAgICAgICAgICAgICAgICAgYXNzZXJ0TW9ja2VyeUlzU2F0aXNmaWVkKHRlc3RGaXh0dXJlKTsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgdGhyb3cgZTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgIH07CiAgICB9CiAgICAKICAgIHByaXZhdGUgdm9pZCBhc3NlcnRNb2NrZXJ5SXNTYXRpc2ZpZWQoT2JqZWN0IHRlc3RGaXh0dXJlKSB7CiAgICAgICAgbW9ja2VyeU9mKHRlc3RGaXh0dXJlKS5hc3NlcnRJc1NhdGlzZmllZCgpOwogICAgfQogICAgCiAgICBwcm90ZWN0ZWQgTW9ja2VyeSBtb2NrZXJ5T2YoT2JqZWN0IHRlc3QpIHsKICAgICAgICB0cnkgewogICAgICAgICAgICBNb2NrZXJ5IG1vY2tlcnkgPSAoTW9ja2VyeSltb2NrZXJ5RmllbGQuZ2V0KHRlc3QpOwogICAgICAgICAgICBpZiAobW9ja2VyeSA9PSBudWxsKSB7CiAgICAgICAgICAgICAgICB0aHJvdyBuZXcgSWxsZWdhbFN0YXRlRXhjZXB0aW9uKCJNb2NrZXJ5IG5hbWVkICciCiAgICAgICAgICAgICAgICAgICAgKyBtb2NrZXJ5RmllbGQuZ2V0TmFtZSgpICsgIicgaXMgbnVsbCIpOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHJldHVybiBtb2NrZXJ5OwogICAgICAgIH0KICAgICAgICBjYXRjaCAoSWxsZWdhbEFjY2Vzc0V4Y2VwdGlvbiBlKSB7CiAgICAgICAgICAgIHRocm93IG5ldyBJbGxlZ2FsU3RhdGVFeGNlcHRpb24oImNhbm5vdCBnZXQgdmFsdWUgb2YgZmllbGQgIgogICAgICAgICAgICAgICAgKyBtb2NrZXJ5RmllbGQuZ2V0TmFtZSgpLCBlKTsKICAgICAgICB9CiAgICB9CgogICAgc3RhdGljIEZpZWxkIGZpbmRNb2NrZXJ5RmllbGQoQ2xhc3M8Pz4gdGVzdENsYXNzKSB0aHJvd3MgSW5pdGlhbGl6YXRpb25FcnJvciB7CiAgICAgICAgZm9yIChDbGFzczw/PiBjID0gdGVzdENsYXNzOyBjICE9IE9iamVjdC5jbGFzczsgYyA9IGMuZ2V0U3VwZXJjbGFzcygpKSB7CiAgICAgICAgICAgIGZvciAoRmllbGQgZmllbGQ6IGMuZ2V0RGVjbGFyZWRGaWVsZHMoKSkgewogICAgICAgICAgICAgICAgaWYgKE1vY2tlcnkuY2xhc3MuaXNBc3NpZ25hYmxlRnJvbShmaWVsZC5nZXRUeXBlKCkpKSB7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIGZpZWxkOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICB9CiAgICAgICAgfQogICAgICAgIAogICAgICAgIHRocm93IG5ldyBJbml0aWFsaXphdGlvbkVycm9yKCJubyBNb2NrZXJ5IGZvdW5kIGluIHRlc3QgY2xhc3MgIgogICAgICAgICAgICArIHRlc3RDbGFzcyk7CiAgICB9Cn0KUEsDBAoAAAAAADV++jY+qFBHeAEAAHgBAAAvAAAAb3JnL2ptb2NrL2ludGVncmF0aW9uL2p1bml0NC9KVW5pdDRNb2NrZXJ5LmphdmFwYWNrYWdlIG9yZy5qbW9jay5pbnRlZ3JhdGlvbi5qdW5pdDQ7CgppbXBvcnQgb3JnLmptb2NrLk1vY2tlcnk7CmltcG9ydCBvcmcuam1vY2subGliLkFzc2VydGlvbkVycm9yVHJhbnNsYXRvcjsKCi8qKgogKiBBIHtAbGluayBNb2NrZXJ5fSB0aGF0IHJlcG9ydHMgZXhwZWN0YXRpb24gZXJyb3JzIGFzIEpVbml0IDQgdGVzdCBmYWlsdXJlcy4KICogIAogKiBAYXV0aG9yIG5hdAogKi8KcHVibGljIGNsYXNzIEpVbml0NE1vY2tlcnkgZXh0ZW5kcyBNb2NrZXJ5IHsKICAgIHB1YmxpYyBKVW5pdDRNb2NrZXJ5KCkgewogICAgICAgIHNldEV4cGVjdGF0aW9uRXJyb3JUcmFuc2xhdG9yKEFzc2VydGlvbkVycm9yVHJhbnNsYXRvci5JTlNUQU5DRSk7CiAgICB9Cn0KUEsBAhQDCgAAAAAAe1gYOQAAAAAAAAAAAAAAAAkABAAAAAAAAAAQAO1BAAAAAE1FVEEtSU5GL/7KAABQSwECFAMKAAAAAAB6WBg5vGQOR2oAAABqAAAAFAAAAAAAAAAAAAAApIErAAAATUVUQS1JTkYvTUFOSUZFU1QuTUZQSwECFAMKAAAAAAB5WBg5AAAAAAAAAAAAAAAABAAAAAAAAAAAABAA7UHHAAAAb3JnL1BLAQIUAwoAAAAAAHpYGDkAAAAAAAAAAAAAAAAKAAAAAAAAAAAAEADtQekAAABvcmcvam1vY2svUEsBAhQDCgAAAAAAeVgYOQAAAAAAAAAAAAAAABYAAAAAAAAAAAAQAO1BEQEAAG9yZy9qbW9jay9pbnRlZ3JhdGlvbi9QSwECFAMKAAAAAAB5WBg5AAAAAAAAAAAAAAAAHQAAAAAAAAAAABAA7UFFAQAAb3JnL2ptb2NrL2ludGVncmF0aW9uL2p1bml0NC9QSwECFAMKAAAAAAB5WBg5F/ufOLkGAAC5BgAAKgAAAAAAAAAAAAAApIGAAQAAb3JnL2ptb2NrL2ludGVncmF0aW9uL2p1bml0NC9KTW9jayQxLmNsYXNzUEsBAhQDCgAAAAAAeVgYOfONYrRaDAAAWgwAACgAAAAAAAAAAAAAAKSBgQgAAG9yZy9qbW9jay9pbnRlZ3JhdGlvbi9qdW5pdDQvSk1vY2suY2xhc3NQSwECFAMKAAAAAAB5WBg5e35sIBgCAAAYAgAAMAAAAAAAAAAAAAAApIEhFQAAb3JnL2ptb2NrL2ludGVncmF0aW9uL2p1bml0NC9KVW5pdDRNb2NrZXJ5LmNsYXNzUEsBAhQDCgAAAAAAqJjVOJNAfGUsCwAALAsAACcAAAAAAAAAAAAAAKSBhxcAAG9yZy9qbW9jay9pbnRlZ3JhdGlvbi9qdW5pdDQvSk1vY2suamF2YVBLAQIUAwoAAAAAADV++jY+qFBHeAEAAHgBAAAvAAAAAAAAAAAAAACkgfgiAABvcmcvam1vY2svaW50ZWdyYXRpb24vanVuaXQ0L0pVbml0NE1vY2tlcnkuamF2YVBLBQYAAAAACwALADQDAAC9JAAAAAA=